C#使用NPOI进行word的读写
目錄
一、簡(jiǎn)介
1、操作Word的類庫(kù):
二、簡(jiǎn)單使用
1、XWPFDocument類的實(shí)例化
2、設(shè)置頁(yè)面的大小
3、段落處理
4、表格處理
5、頁(yè)眉頁(yè)腳處理
三、綜合示例
四、參考
一、簡(jiǎn)介
1、操作Word的類庫(kù):
二、簡(jiǎn)單使用
1、XWPFDocument類的實(shí)例化
該類的實(shí)例對(duì)應(yīng)一個(gè)word文檔
2、設(shè)置頁(yè)面的大小
如果不進(jìn)行頁(yè)面大小的設(shè)置,默認(rèn)是縱向的A4大小。橫向的A4的頁(yè)面大小 ,如果要縱向,寬高兩個(gè)值調(diào)換即可。
T_SectPr m_SectPr = new CT_SectPr(); //實(shí)例一個(gè)尺寸類的實(shí)例 m_SectPr.pgSz.w = 16838; //設(shè)置寬度(這里是一個(gè)ulong類型) m_SectPr.pgSz.h = 11906; //設(shè)置高度(這里是一個(gè)ulong類型) MyDoc.Document.body.sectPr = m_SectPr; //設(shè)置頁(yè)面的尺寸這里的單位比較特殊,用的是緹(Twip)這是一種和屏幕無(wú)關(guān)的長(zhǎng)度單位,目的是為了讓應(yīng)用程序元素輸出到不同設(shè)備時(shí)都能保持一致的計(jì)算方式。
換算關(guān)系:
1英寸=1440緹
1厘米=567緹
1磅=20緹
1像素=15緹
常用頁(yè)面尺寸:(單位Twip)
A4(縱向):W=11906 H=16838
A4(縱向):W=16838 H=11906
A5 :W=8390 H=11906
A6 :W=5953 H=8390
示例:控制word頁(yè)內(nèi)邊距
//創(chuàng)建document對(duì)象 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; //頁(yè)面邊距 m_SectPr.pgMar.left = (ulong)800;//左邊距 m_SectPr.pgMar.right = (ulong)800;//右邊距 m_SectPr.pgMar.top = "850";//上邊距 m_SectPr.pgMar.bottom = "850";//下邊距3、段落處理
創(chuàng)建段落
段落為XWPFParagraph類型的實(shí)例,段落由XWPFDocument實(shí)例的使用CreateParagraph()方法生成。
XWPFParagraph MyParagraph = MyDoc.CreateParagraph();該段落類有很多屬性,用于設(shè)置與段落相關(guān)的內(nèi)容。主要有以下幾個(gè)方面
BorderXXXXX屬性:該值用于設(shè)置邊界的樣式。該屬性用于獲取或設(shè)置一個(gè)Borders枚舉類型的值,
FillBackgroundColor屬性:背景填充的顏色。該屬性獲取或設(shè)置一個(gè)string類型的變量。該變量的含義是某個(gè)顏色的RGB值(在NPOI里所有的顏色都是以這種形式表示的)。例如設(shè)置為黑色則對(duì)應(yīng)的代碼如下:
MyParagraph.FillBackgroundColor = "#000000";Alignment屬性:段落的對(duì)齊方式。該屬性獲取或設(shè)置一個(gè)ParagraphAlignment的枚舉值。
VerticalAlignment屬性:文本垂直方向的對(duì)齊方式。該屬性獲取或設(shè)置一個(gè)TextAlignment 的枚舉值。
IndentationFirstLine屬性:用于設(shè)置段落的首行縮進(jìn)。該屬性獲取或設(shè)置一個(gè)int型變量。
這個(gè)int值并不是縮進(jìn)的字?jǐn)?shù),這里可以用一個(gè)函數(shù)計(jì)算縮進(jìn)的距離。
示例:創(chuàng)建段落
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); //設(shè)置黑體 //控制段落與其他元素的上下距離 paragraph.SpacingBeforeLines = 20;//上方距離 paragraph.SpacingAfterLines = 20;//下方距離換頁(yè)(本頁(yè)未滿直接寫下一頁(yè))
aragraph = doc.CreateParagraph(); paragraph.CreateRun().AddBreak(BreakType.PAGE);文本處理
doc.Paragraphs 獲取到文檔里的所有的段落對(duì)象;
para.ParagraphText 獲取段落的文本數(shù)據(jù);
para.ReplaceText(要被替換的文本,替換文本) 替換段落的文本(模板能實(shí)現(xiàn)的關(guān)鍵)
4、表格處理
doc.Tables 獲取文檔里的所有的表格對(duì)象;//doc.Tables獲取的只是Word中最外層的表格,不包含嵌套內(nèi)層的。
cell.Tables;//獲取嵌套單元格可使用
row.Rows //獲取表格所有行;
row.GetTableICells() ;//獲取表格行的所有單元格;
獲取到單元格之后就可以獲取單元格里的文本段落(Paragraphs)并且進(jìn)行文本替換
創(chuàng)建表格
var table = doc.CreateTable(行數(shù), 列數(shù)); table.Width = 5000;控制表格中列寬(這里需要注意,只設(shè)置一行的列寬一旦插入文字就會(huì)使設(shè)置的列寬失效,所以要把每一個(gè)單元格都要設(shè)置上)
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");}設(shè)置表格中單元格豎直居中
var rowcell = table.GetRow(r).GetCell(c); rowcell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);設(shè)置單元格內(nèi)容
//table中的文字格式設(shè)置 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); //設(shè)置雅黑字體 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 valuectTcPr.AddNewVMerge().val = ST_Merge.restart;}else{// Cells which join (merge) the first one, are set with CONTINUEctTcPr.AddNewVMerge().val = ST_Merge.@continue;//繼續(xù)合并行}ctTcPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直} }5、頁(yè)眉頁(yè)腳處理
XWPFDocument doc = new XWPFDocument(); doc.Document.body.sectPr = new CT_SectPr(); CT_SectPr m_SectPr = doc.Document.body.sectPr;//創(chuàng)建頁(yè)眉 CT_Hdr m_Hdr = new CT_Hdr(); CT_P m_P = m_Hdr.AddNewP(); m_P.AddNewR().AddNewT().Value = "頁(yè)眉內(nèi)容值"; m_P.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁(yè)眉居中//創(chuàng)建頁(yè)眉關(guān)系(headern.xml) XWPFRelation Hrelation = XWPFRelation.HEADER; XWPFHeader m_h = (XWPFHeader)doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(), doc.HeaderList.Count + 1); doc.CreateFootnotes();//設(shè)置頁(yè)眉 m_h.SetHeaderFooter(m_Hdr); CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewHeaderReference(); m_h.GetRelationById(m_HdrFtr.id);//創(chuàng)建頁(yè)腳 CT_Ftr m_ftr = new CT_Ftr(); CT_P m_fP = m_ftr.AddNewP(); m_fP.AddNewR().AddNewT().Value = "頁(yè)腳內(nèi)容值"; m_fP.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁(yè)眉居中//創(chuàng)建頁(yè)腳關(guān)系(footern.xml) XWPFRelation Frelation = XWPFRelation.FOOTER; XWPFFooter m_f = (XWPFFooter)doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), doc.FooterList.Count + 1);//設(shè)置頁(yè)腳 m_f.SetHeaderFooter(m_ftr); m_HdrFtr = m_SectPr.AddNewFooterReference(); m_HdrFtr.type = ST_HdrFtr.@default; m_f.GetRelationById(m_HdrFtr.id);三、綜合示例
實(shí)例1:
運(yùn)行結(jié)果:
實(shí)例2:實(shí)現(xiàn)了表的簡(jiǎn)單操作:創(chuàng)建表、創(chuàng)建行、創(chuàng)建單元,單元行和列的合并。
運(yùn)行結(jié)果:
實(shí)例3:
運(yùn)行結(jié)果:
四、參考
Word與Excel字號(hào)對(duì)照表
推薦一個(gè)公眾號(hào):dotNET編程大全,掃碼關(guān)注!
需加微信交流群的,請(qǐng)加小編微信號(hào)z438679770,切記備注?加群,小編將會(huì)第一時(shí)間邀請(qǐng)你進(jìn)群!
?每日分享不易,"在看"就是鼓勵(lì)!
總結(jié)
以上是生活随笔為你收集整理的C#使用NPOI进行word的读写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 穿背心的老院士,86岁,重病,还在敲代码
- 下一篇: C# 打印PDF文档的10种方法