目錄
- 一、簡介
- 1、操作Word的類庫:
- 二、簡單使用
- 1、XWPFDocument類的實例化
- 2、設置頁面的大小
- 3、段落處理
- 4、表格處理
- 5、頁眉頁腳處理
- 三、綜合示例
- 四、參考
一、簡介
1、操作Word的類庫:

二、簡單使用
1、XWPFDocument類的實例化
該類的實例對應一個word文檔
XWPFDocument MyDoc = new XWPFDocument();
2、設置頁面的大小
如果不進行頁面大小的設置,默認是縱向的A4大小。橫向的A4的頁面大小 ,如果要縱向,寬高兩個值調換即可。
T_SectPr m_SectPr = new CT_SectPr(); //實例一個尺寸類的實例 m_SectPr.pgSz.w = 16838; //設置寬度(這里是一個ulong類型) m_SectPr.pgSz.h = 11906; //設置高度(這里是一個ulong類型) MyDoc.Document.body.sectPr = m_SectPr; //設置頁面的尺寸
這里的單位比較特殊,用的是緹(Twip)這是一種和屏幕無關的長度單位,目的是為了讓應用程序元素輸出到不同設備時都能保持一致的計算方式。
換算關系:
- 1英寸=1440緹
- 1厘米=567緹
- 1磅=20緹
- 1像素=15緹
常用頁面尺寸:(單位Twip)
- A4(縱向):W=11906 H=16838
- A4(縱向):W=16838 H=11906
- A5 :W=8390 H=11906
- A6 :W=5953 H=8390
示例:控制word頁內邊距
//創建document對象 var doc = new XWPFDocument(); doc.Document.body.sectPr = new CT_SectPr(); CT_SectPr m_SectPr = doc.Document.body.sectPr; m_SectPr.pgSz.h = (ulong)16838; m_SectPr.pgSz.w = (ulong)11906; //頁面邊距 m_SectPr.pgMar.left = (ulong)800;//左邊距 m_SectPr.pgMar.right = (ulong)800;//右邊距 m_SectPr.pgMar.top = "850";//上邊距 m_SectPr.pgMar.bottom = "850";//下邊距
3、段落處理
創建段落
段落為XWPFParagraph類型的實例,段落由XWPFDocument實例的使用CreateParagraph()方法生成。
XWPFParagraph MyParagraph = MyDoc.CreateParagraph();
該段落類有很多屬性,用於設置與段落相關的內容。主要有以下幾個方面
- BorderXXXXX屬性:該值用於設置邊界的樣式。該屬性用於獲取或設置一個Borders枚舉類型的值,
- FillBackgroundColor屬性:背景填充的顏色。該屬性獲取或設置一個string類型的變量。該變量的含義是某個顏色的RGB值(在NPOI里所有的顏色都是以這種形式表示的)。例如設置為黑色則對應的代碼如下:MyParagraph.FillBackgroundColor = "#000000";
- Alignment屬性:段落的對齊方式。該屬性獲取或設置一個ParagraphAlignment的枚舉值。
- VerticalAlignment屬性:文本垂直方向的對齊方式。該屬性獲取或設置一個TextAlignment 的枚舉值。
- IndentationFirstLine屬性:用於設置段落的首行縮進。該屬性獲取或設置一個int型變量。這個int值並不是縮進的字數,這里可以用一個函數計算縮進的距離。
//段落縮進 返回值為對應的縮進距離 //(fontname:文字類型名稱 fontsize:文字大小 fontcount:縮進數目 fontstyle:文字類型(斜體、粗體...)) int Indentation(String fontname, int fontsize, int fontnum, FontStyle fontstyle) { Graphics gp = this.CreateGraphics(); gp.PageUnit = GraphicsUnit.Point; SizeF size = gp.MeasureString("字", new Font(fontname, fontsize * 0.75F, fontstyle)); return (int)size.Width * fontnum * 10; }
示例:創建段落
var paragraph = doc.CreateParagraph(); paragraph.Alignment = ParagraphAlignment.CENTER; //字體居中 var run = paragraph.CreateRun(); run.IsBold = true; run.SetText(contend); run.FontSize = 28; run.SetFontFamily("黑體", FontCharRange.None); //設置黑體 //控制段落與其他元素的上下距離 paragraph.SpacingBeforeLines = 20;//上方距離 paragraph.SpacingAfterLines = 20;//下方距離
換頁(本頁未滿直接寫下一頁)
aragraph = doc.CreateParagraph();
paragraph.CreateRun().AddBreak(BreakType.PAGE);
文本處理
- doc.Paragraphs 獲取到文檔里的所有的段落對象;
- para.ParagraphText 獲取段落的文本數據;
- para.ReplaceText(要被替換的文本,替換文本) 替換段落的文本(模板能實現的關鍵)
4、表格處理
doc.Tables 獲取文檔里的所有的表格對象;//doc.Tables獲取的只是Word中最外層的表格,不包含嵌套內層的。cell.Tables;//獲取嵌套單元格可使用row.Rows //獲取表格所有行;row.GetTableICells() ;//獲取表格行的所有單元格;獲取到單元格之后就可以獲取單元格里的文本段落(Paragraphs)並且進行文本替換
創建表格
var table = doc.CreateTable(行數, 列數); table.Width = 5000;
控制表格中列寬(這里需要注意,只設置一行的列寬一旦插入文字就會使設置的列寬失效,所以要把每一個單元格都要設置上)
for (int r = 0; r < 8; r++) { SetCellWith(table.GetRow(r).GetCell(0), "600"); SetCellWith(table.GetRow(r).GetCell(1), "1500"); SetCellWith(table.GetRow(r).GetCell(2), "1500"); SetCellWith(table.GetRow(r).GetCell(3), "600"); }
設置表格中單元格豎直居中
var rowcell = table.GetRow(r).GetCell(c); rowcell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
設置單元格內容
//table中的文字格式設置 var para = new CT_P(); var pCell = new XWPFParagraph(para, table.Body); pCell.Alignment = paragraphAlignment; //字體居中 pCell.VerticalAlignment = TextAlignment.CENTER; //字體居中 var r1c1 = pCell.CreateRun(); r1c1.SetText(setText); r1c1.FontSize = 11; r1c1.SetFontFamily("宋體", FontCharRange.None); //設置雅黑字體 pCell.SpacingAfterLines = 40; pCell.SpacingBeforeLines = 40; //放入單元格 table.GetRow(4).GetCell(1).SetParagraph(pCell);
表格中換行
var run= paragraph.CreateRun(); run.SetText(contends[i]); run.FontSize = 11; run.SetFontFamily("宋體", FontCharRange.None); run.AddBreak(BreakType.TEXTWRAPPING);//換行
合並單元格
table.GetRow(rowIndex).MergeCells(fromCol, toCol);//合並列
水平合並行單元格
CT_Tc cttcofRowThird = cell.GetCTTc(); CT_TcPr ctProfRowThird = cttcofRowThird.AddNewTcPr(); ctProfRowThird.gridSpan = new CT_DecimalNumber(); ctProfRowThird.gridSpan.val = num.ToString();//合並num列
合並行、垂直合並列單元格
public void MYMergeRows(XWPFTable table, int fromRow, int toRow, int colIndex) { for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) { XWPFTableCell rowcell = table.GetRow(rowIndex).GetCell(colIndex); rowcell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); CT_Tc cttc = rowcell.GetCTTc(); CT_TcPr ctTcPr = cttc.tcPr; if (ctTcPr == null) { ctTcPr = cttc.AddNewTcPr(); } if (rowIndex == fromRow) { // The first merged cell is set with RESTART merge value ctTcPr.AddNewVMerge().val = ST_Merge.restart; } else { // Cells which join (merge) the first one, are set with CONTINUE ctTcPr.AddNewVMerge().val = ST_Merge.@continue;//繼續合並行 } ctTcPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直 } }
5、頁眉頁腳處理
XWPFDocument doc = new XWPFDocument(); doc.Document.body.sectPr = new CT_SectPr(); CT_SectPr m_SectPr = doc.Document.body.sectPr; //創建頁眉 CT_Hdr m_Hdr = new CT_Hdr(); CT_P m_P = m_Hdr.AddNewP(); m_P.AddNewR().AddNewT().Value = "頁眉內容值"; m_P.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁眉居中 //創建頁眉關系(headern.xml) XWPFRelation Hrelation = XWPFRelation.HEADER; XWPFHeader m_h = (XWPFHeader)doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(), doc.HeaderList.Count + 1); doc.CreateFootnotes(); //設置頁眉 m_h.SetHeaderFooter(m_Hdr); CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewHeaderReference(); m_h.GetRelationById(m_HdrFtr.id); //創建頁腳 CT_Ftr m_ftr = new CT_Ftr(); CT_P m_fP = m_ftr.AddNewP(); m_fP.AddNewR().AddNewT().Value = "頁腳內容值"; m_fP.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁眉居中 //創建頁腳關系(footern.xml) XWPFRelation Frelation = XWPFRelation.FOOTER; XWPFFooter m_f = (XWPFFooter)doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), doc.FooterList.Count + 1); //設置頁腳 m_f.SetHeaderFooter(m_ftr); m_HdrFtr = m_SectPr.AddNewFooterReference(); m_HdrFtr.type = ST_HdrFtr.@default; m_f.GetRelationById(m_HdrFtr.id);
三、綜合示例
實例1:
CT_SectPr srcpr = new CT_SectPr(); //設置A4紙縱向,如果要橫向,兩個值調換即可 srcpr.pgSz.w = (ulong)11906; srcpr.pgSz.h = (ulong)16838; XWPFDocument doc = new XWPFDocument(); doc.Document.body.sectPr = srcpr; //輸出標題 XWPFParagraph ptitle = doc.CreateParagraph(); ptitle.Alignment = ParagraphAlignment.CENTER; XWPFRun titlerun = ptitle.CreateRun(); //向該段落中添加文字 titlerun.SetText("標題"); titlerun.IsBold = true; titlerun.FontFamily = "華文行楷"; titlerun.FontSize = 30; titlerun.SetColor("blue"); //輸出一個段落 XWPFParagraph p2 = doc.CreateParagraph(); p2.Alignment = ParagraphAlignment.CENTER; p2.IndentationFirstLine = (int)100; //首行縮進 XWPFRun r2 = p2.CreateRun(); r2.SetText(string.Format("生成時間:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm"))); r2.FontSize = 15; titlerun.FontFamily = "宋體"; StringBuilder sb = new StringBuilder(); using (FileStream stream = File.OpenRead("simple.docx")) { XWPFDocument docx = new XWPFDocument(stream); //頁眉 foreach (XWPFHeader xwpfHeader in docx.HeaderList) { sb.AppendLine(string.Format("{0}", new string[] { xwpfHeader.Text })); } //頁腳 foreach (XWPFFooter xwpfFooter in docx.FooterList) { sb.AppendLine(string.Format("{0}", new string[] { xwpfFooter.Text })); } //讀取段落 foreach (var para in docx.Paragraphs) { string text = para.ParagraphText; //獲得文本 var runs = para.Runs; // string styleid = para.Style; for (int i = 0; i < runs.Count; i++) { var run = runs[i]; text = run.ToString(); //獲得run的文本 sb.Append(text + ","); } } //讀取表格 foreach (XWPFTable table in docx.Tables) { //循環表格行 foreach (XWPFTableRow row in table.Rows) { foreach (XWPFTableCell cell in row.GetTableCells()) { sb.Append(cell.GetText()); } } } //讀取圖片 foreach (XWPFPictureData pictureData in docx.AllPictures) { string picExtName = pictureData.SuggestFileExtension(); string picFileName = pictureData.FileName; byte[] picFileContent = pictureData.Data; string picTempName = string.Format(Guid.NewGuid().ToString() + "_" + picFileName + "." + picExtName); using (FileStream fs = new FileStream(picTempName, FileMode.Create, FileAccess.Write)) { fs.Write(picFileContent, 0, picFileContent.Length); fs.Close(); } sb.AppendLine(picTempName); } Console.WriteLine(sb.ToString()); } FileStream out1 = new FileStream("simple.docx", FileMode.Create); doc.Write(out1); out1.Close();
運行結果:

實例2:實現了表的簡單操作:創建表、創建行、創建單元,單元行和列的合並。
private void button2_Click(object sender, EventArgs e) { MemoryStream ms = new MemoryStream(); XWPFDocument m_Docx = new XWPFDocument(); m_Docx = CreatDocxTable(); m_Docx.Write(ms); ms.Flush(); SaveToFile(ms, "d:\\test.docx"); } protected XWPFDocument CreatDocxTable() { XWPFDocument m_Docx = new XWPFDocument(); XWPFParagraph p0 = m_Docx.CreateParagraph(); XWPFRun r0 = p0.CreateRun(); r0.SetText("DOCX表"); XWPFTable table = m_Docx.CreateTable(1, 3);//創建一行3列表 table.GetRow(0).GetCell(0).SetText("111"); table.GetRow(0).GetCell(1).SetText("222"); table.GetRow(0).GetCell(2).SetText("333"); XWPFTableRow m_Row = table.CreateRow();//創建一行 m_Row = table.CreateRow();//創建一行 m_Row.GetCell(0).SetText("211"); //合並單元格 m_Row = table.InsertNewTableRow(0);//表頭插入一行 XWPFTableCell cell = m_Row.CreateCell();//創建一個單元格,創建單元格時就創建了一個CT_P CT_Tc cttc = cell.GetCTTc(); CT_TcPr ctPr = cttc.AddNewTcPr(); //ctPr.gridSpan.val = "3";//合並3列 cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center; cttc.GetPList()[0].AddNewR().AddNewT().Value = "abc"; XWPFTableRow td3 = table.InsertNewTableRow(table.Rows.Count - 1);//插入行 cell = td3.CreateCell(); cttc = cell.GetCTTc(); ctPr = cttc.AddNewTcPr(); //ctPr.gridSpan.val = "3"; cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center; cttc.GetPList()[0].AddNewR().AddNewT().Value = "qqq"; //表增加行,合並列 CT_Row m_NewRow = new CT_Row(); m_Row = new XWPFTableRow(m_NewRow, table); table.AddRow(m_Row); //必須要!!! cell = m_Row.CreateCell(); cttc = cell.GetCTTc(); ctPr = cttc.AddNewTcPr(); //ctPr.gridSpan.val = "3"; cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center; cttc.GetPList()[0].AddNewR().AddNewT().Value = "sss"; //表未增加行,合並2列,合並2行 //1行 m_NewRow = new CT_Row(); m_Row = new XWPFTableRow(m_NewRow, table); table.AddRow(m_Row); cell = m_Row.CreateCell(); cttc = cell.GetCTTc(); ctPr = cttc.AddNewTcPr(); //ctPr.gridSpan.val = "2"; ctPr.AddNewVMerge().val = ST_Merge.restart;//合並行 ctPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直居中 cttc.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center; cttc.GetPList()[0].AddNewR().AddNewT().Value = "xxx"; cell = m_Row.CreateCell(); cell.SetText("ddd"); //2行,多行合並類似 m_NewRow = new CT_Row(); m_Row = new XWPFTableRow(m_NewRow, table); table.AddRow(m_Row); cell = m_Row.CreateCell(); cttc = cell.GetCTTc(); ctPr = cttc.AddNewTcPr(); //ctPr.gridSpan.val = "2"; ctPr.AddNewVMerge().val = ST_Merge.@continue;//合並行 cell = m_Row.CreateCell(); cell.SetText("kkk"); ////3行 //m_NewRow = new CT_Row(); //m_Row = new XWPFTableRow(m_NewRow, table); //table.AddRow(m_Row); //cell = m_Row.CreateCell(); //cttc = cell.GetCTTc(); //ctPr = cttc.AddNewTcPr(); //ctPr.gridSpan.val = "2"; //ctPr.AddNewVMerge().val = ST_Merge.@continue; //cell = m_Row.CreateCell(); //cell.SetText("hhh"); return m_Docx; } static void SaveToFile(MemoryStream ms, string fileName) { using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); data = null; } }
運行結果:

實例3:
DataTable dt = new DataTable();//創建表 private void button2_Click(object sender, EventArgs e) { dt.Columns.Add("姓名"); dt.Columns.Add("性別"); dt.Columns.Add("年齡"); dt.Rows.Add("zyr1","男","25"); dt.Rows.Add("zyr2", "男", "26"); dt.Rows.Add("zyr3", "男", "27"); //dataGridView1.DataSource = dt; XWPFDocument doc = new XWPFDocument(); XWPFTable table = doc.CreateTable(dt.Rows.Count + 1, dt.Columns.Count);//聲明整個表的大小 +1是為了增加一行表頭 //增加表頭信息 for (int i = 0; i < dt.Columns.Count; i++) { table.GetRow(0).GetCell(i).SetText(dt.Columns[i].ColumnName); } //增加內容信息 for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { string Vt = Convert.ToString(dt.Rows[i][j]); table.GetRow(i + 1).GetCell(j).SetText(Vt); } } string FilePath = Environment.CurrentDirectory; if (!Directory.Exists(FilePath)) Directory.CreateDirectory(FilePath); FilePath = FilePath + "\\測試word文檔.doc"; FileStream Fs = new FileStream(FilePath, FileMode.OpenOrCreate); doc.Write(Fs); Fs.Close(); }
運行結果:

四、參考
Word與Excel字號對照表

原文鏈接:https://www.toutiao.com/item/6933137344828703247/