項目需要整合word匯出,做的時候網上文檔資源不是很多,也比較雜亂,所以查了查,整理了整理,做個記錄,也順便把NPOI操作Word文檔的一些基本操作分享給有需要的朋友。
本篇包括產生Word對word文本的操作,表格的操作,以及圖片的操作,都為產生word基礎的一些操作。
以下只是我的個人理解所得,大家有什麼更好的想法歡迎補充。
VS2017、右鍵解決方案,管理NuGet程式包,搜尋並為項目安裝NPOI程式包,並引用:
using NPOI.XWPF.UserModel;
本編使用NPOI版本為2.3.0
下面進入正題··
一、 擷取模板(XWPFDocument doc)
使用模板,首先擷取模板,然後把擷取的模板執行個體化為NPOI的文檔對象進行編輯操作:
using (FileStream stream = File.OpenRead(“模板檔案地址”)){
XWPFDocument doc = new XWPFDocument(stream);
//處理doc,代碼控制編輯文檔。
}
處理doc後,產生新的檔案,寫入doc ,產生word完成。
FileStream file = new FileStream(組建檔案路徑+檔案名稱, FileMode.Create, FileAccess.Write);
doc.Write(file);
file.Close();
doc就是我們擷取到的模板的所有內容。
還有一點本編使用模板均為docx尾碼檔案,doc修改docx讀取報錯,需要另存新檔doxc文檔。
二、 文本處理(XWPFParagraph para)
doc.Paragraphs 擷取到文檔裡的所有的段落對象;
para.ParagraphText 擷取段落的文本資料;
para.ReplaceText(要被替換的文本,替換文本) 替換段落的文本(模板能實現的關鍵)
XWPFParagraph的官方參考文檔
三、 表格處理(XWPFTable table)
doc.Tables 擷取文檔裡的所有的表格對象;
這裡有必要多一嘴,doc.Tables擷取的只是Word中最外層的表格,不包含嵌套內層的。
擷取嵌套儲存格可使用cell.Tables;
(一) 表格行處理(XWPFTableRow row)
row.Rows 擷取表格所有行;
(二) 表格儲存格處理(XWPFTableCell cell)
row.GetTableICells() ;擷取表格行的所有儲存格;
擷取到儲存格之後就可以擷取儲存格裡的文本段落(Paragraphs)並且進行文本替換
(三) 水平合并行儲存格
CT_Tc cttcofRowThird = cell.GetCTTc();
CT_TcPr ctProfRowThird = cttcofRowThird.AddNewTcPr();
ctProfRowThird.gridSpan = new CT_DecimalNumber();
ctProfRowThird.gridSpan.val = num.ToString();//合并num列
(四) 垂直合并列儲存格
List<XWPFTableRow> rows所有要合并的行的XWPFTableRow对象集合。
XWPFTableCell cellFirstofThird = 第一行要合并的单元格对象;
CT_Tc cttcFirstofThird = cellFirstofThird.GetCTTc();
CT_TcPr ctPrFirstofThird = cttcFirstofThird.AddNewTcPr();
ctPrFirstofThird.AddNewVMerge().val = ST_Merge.restart;//开始合并行
ctPrFirstofThird.AddNewVAlign().val = ST_VerticalJc.center;//垂直
cttcFirstofThird.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;
for (int i = 1; i < rows.Count; i++)
{
XWPFTableCell cellfirstofRow = 第i行要合并的单元格对象;
CT_Tc cttcfirstofRow = cellfirstofRow.GetCTTc();
CT_TcPr ctPrfirstofRow = cttcfirstofRow.AddNewTcPr();
ctPrfirstofRow.AddNewVMerge().val = ST_Merge.@continue;//继续合并行
ctPrfirstofRow.AddNewVAlign().val = ST_VerticalJc.center;//垂直
}
四、 圖片處理
2.3.0版本的NPOI的圖片插入沒有整合xml檔案的修改所以需要手寫代碼編入(當然,我是拷過來的)。
using (FileStream fsImg = new FileStream(图片路径, FileMode.Open, FileAccess.Read, FileShare.None))
{
var picID = doc.AddPictureData(fsImg, (int)NPOI.XWPF.UserModel.PictureType.JPEG);
string picXml = ""
+ " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
+ " <pic:nvPicPr>" + " <pic:cNvPr id=\""
+ "0"
+ "\" name=\"Generated\"/>"
+ " <pic:cNvPicPr/>"
+ " </pic:nvPicPr>"
+ " <pic:blipFill>"
+ " <a:blip r:embed=\""
+ id
+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
+ " <a:stretch>"
+ " <a:fillRect/>"
+ " </a:stretch>"
+ " </pic:blipFill>"
+ " <pic:spPr>"
+ " <a:xfrm>"
+ " <a:off x=\"0\" y=\"0\"/>"
+ " <a:ext cx=\""
+ width
+ "\" cy=\""
+ height
+ "\"/>"
+ " </a:xfrm>"
+ " <a:prstGeom prst=\"rect\">"
+ " <a:avLst/>"
+ " </a:prstGeom>"
+ " </pic:spPr>"
+ " </pic:pic>";
XWPFParagraph par = cell.AddParagraph();//创建段落对象(可以在doc加也可在cell加)
par.Alignment = ParagraphAlignment.CENTER;//居中
XWPFRun run = par.CreateRun();
CT_Inline inline = run.GetCTR().AddNewDrawing().AddNewInline();
inline.graphic = new CT_GraphicalObject
{
graphicData = new CT_GraphicalObjectData
{
uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"
}
};
try
{
inline.graphic.graphicData.AddPicElement(picXml);
}
catch (XmlException xe)
{
throw xe;
}
NPOI.OpenXmlFormats.Dml.WordProcessing.CT_PositiveSize2D extent = inline.AddNewExtent();
extent.cx = width;
extent.cy = height;
NPOI.OpenXmlFormats.Dml.WordProcessing.CT_NonVisualDrawingProps docPr = inline.AddNewDocPr();
docPr.id = 1;
docPr.name = "Image" + id;
}
今天先到這了,以後有收穫再補充。
四、 圖片處理