C#使用NPOI對word進(jìn)行讀寫
一、簡介
操作Word的類庫:
- NPOI: V2.5.1 快速生成 https://github.com/tonyqus/npoi
- DocX(屬于Xceed Words for .NET的免費(fèi)版本): V1.6.0 https://github.com/xceedsoftware/DocX
- Aspose.Words: 收費(fèi)
- Spire.Doc: 收費(fèi)
二、簡單使用
1、XWPFDocument類的實(shí)例化
該類的實(shí)例對應(yīng)一個word文檔
XWPFDocument MyDoc = new XWPFDocument();
2、設(shè)置頁面的大小
如果不進(jìn)行頁面大小的設(shè)置,默認(rèn)是縱向的A4大小。橫向的A4的頁面大小 ,如果要縱向,寬高兩個值調(diào)換即可。
T_SectPr m_SectPr = new CT_SectPr(); //實(shí)例一個尺寸類的實(shí)例 m_SectPr.pgSz.w = 16838; //設(shè)置寬度(這里是一個ulong類型) m_SectPr.pgSz.h = 11906; //設(shè)置高度(這里是一個ulong類型) MyDoc.Document.body.sectPr = m_SectPr; //設(shè)置頁面的尺寸
這里的單位比較特殊,用的是緹(Twip)這是一種和屏幕無關(guān)的長度單位,目的是為了讓應(yīng)用程序元素輸出到不同設(shè)備時(shí)都能保持一致的計(jì)算方式。
換算關(guān)系:
- 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頁內(nèi)邊距
//創(chuàng)建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、段落處理
創(chuàng)建段落
段落為XWPFParagraph類型的實(shí)例,段落由XWPFDocument實(shí)例的使用CreateParagraph()方法生成。
XWPFParagraph MyParagraph = MyDoc.CreateParagraph();
該段落類有很多屬性,用于設(shè)置與段落相關(guān)的內(nèi)容。主要有以下幾個方面
- BorderXXXXX屬性:該值用于設(shè)置邊界的樣式。該屬性用于獲取或設(shè)置一個Borders枚舉類型的值,
- FillBackgroundColor屬性:背景填充的顏色。該屬性獲取或設(shè)置一個string類型的變量。該變量的含義是某個顏色的RGB值(在NPOI里所有的顏色都是以這種形式表示的)。例如設(shè)置為黑色則對應(yīng)的代碼如下:
MyParagraph.FillBackgroundColor = "#000000";
- Alignment屬性:段落的對齊方式。該屬性獲取或設(shè)置一個ParagraphAlignment的枚舉值。
- VerticalAlignment屬性:文本垂直方向的對齊方式。該屬性獲取或設(shè)置一個TextAlignment 的枚舉值。
- IndentationFirstLine屬性:用于設(shè)置段落的首行縮進(jìn)。該屬性獲取或設(shè)置一個int型變量。
這個int值并不是縮進(jìn)的字?jǐn)?shù),這里可以用一個函數(shù)計(jì)算縮進(jìn)的距離。
//段落縮進(jìn) 返回值為對應(yīng)的縮進(jìn)距離
//(fontname:文字類型名稱 fontsize:文字大小 fontcount:縮進(jìn)數(shù)目 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;
}示例:創(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;//下方距離換頁(本頁未滿直接寫下一頁)
paragraph = doc.CreateParagraph(); paragraph.CreateRun().AddBreak(BreakType.PAGE);
文本處理
- doc.Paragraphs 獲取到文檔里的所有的段落對象;
- para.ParagraphText 獲取段落的文本數(shù)據(jù);
- para.ReplaceText(要被替換的文本,替換文本) 替換段落的文本(模板能實(shí)現(xiàn)的關(guān)鍵)
4、表格處理
doc.Tables 獲取文檔里的所有的表格對象;//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è)置一行的列寬一旦插入文字就會使設(shè)置的列寬失效,所以要把每一個單元格都要設(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 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;//繼續(xù)合并行
}
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;
//創(chuàng)建頁眉
CT_Hdr m_Hdr = new CT_Hdr();
CT_P m_P = m_Hdr.AddNewP();
m_P.AddNewR().AddNewT().Value = "頁眉內(nèi)容值";
m_P.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁眉居中
//創(chuàng)建頁眉關(guān)系(headern.xml)
XWPFRelation Hrelation = XWPFRelation.HEADER;
XWPFHeader m_h = (XWPFHeader)doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(), doc.HeaderList.Count + 1);
doc.CreateFootnotes();
//設(shè)置頁眉
m_h.SetHeaderFooter(m_Hdr);
CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewHeaderReference();
m_h.GetRelationById(m_HdrFtr.id);
//創(chuàng)建頁腳
CT_Ftr m_ftr = new CT_Ftr();
CT_P m_fP = m_ftr.AddNewP();
m_fP.AddNewR().AddNewT().Value = "頁腳內(nèi)容值";
m_fP.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁眉居中
//創(chuàng)建頁腳關(guān)系(footern.xml)
XWPFRelation Frelation = XWPFRelation.FOOTER;
XWPFFooter m_f = (XWPFFooter)doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), doc.FooterList.Count + 1);
//設(shè)置頁腳
m_f.SetHeaderFooter(m_ftr);
m_HdrFtr = m_SectPr.AddNewFooterReference();
m_HdrFtr.type = ST_HdrFtr.@default;
m_f.GetRelationById(m_HdrFtr.id);三、綜合示例
CT_SectPr srcpr = new CT_SectPr();
//設(shè)置A4紙縱向,如果要橫向,兩個值調(diào)換即可
srcpr.pgSz.w = (ulong)11906;
srcpr.pgSz.h = (ulong)16838;
XWPFDocument doc = new XWPFDocument();
doc.Document.body.sectPr = srcpr;
//輸出標(biāo)題
XWPFParagraph ptitle = doc.CreateParagraph();
ptitle.Alignment = ParagraphAlignment.CENTER;
XWPFRun titlerun = ptitle.CreateRun(); //向該段落中添加文字
titlerun.SetText("標(biāo)題");
titlerun.IsBold = true;
titlerun.FontFamily = "華文行楷";
titlerun.FontSize = 30;
titlerun.SetColor("blue");
//輸出一個段落
XWPFParagraph p2 = doc.CreateParagraph();
p2.Alignment = ParagraphAlignment.CENTER;
p2.IndentationFirstLine = (int)100; //首行縮進(jìn)
XWPFRun r2 = p2.CreateRun();
r2.SetText(string.Format("生成時(shí)間:{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)
{
//循環(huán)表格行
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();四、參考
Word與Excel字號對照表

到此這篇關(guān)于C#使用NPOI對word進(jìn)行讀寫的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用CallContext緩存線程數(shù)據(jù)
這篇文章介紹了C#使用CallContext緩存線程數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
C# Winfrom實(shí)現(xiàn)Skyline畫直線功能的示例代碼
這篇文章主要介紹了C# Winfrom實(shí)現(xiàn)Skyline畫直線功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
c# 冒泡排序算法(Bubble Sort) 附實(shí)例代碼
這篇文章主要介紹了c# 冒泡排序算法,需要的朋友可以參考下2013-10-10
C#獲取ListView鼠標(biāo)下的Item實(shí)例
下面小編就為大家?guī)硪黄狢#獲取ListView鼠標(biāo)下的Item實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01

