專案需要整合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 文字處理(XWPFParagraph para)
doc.Paragraphs 取得到文件裡的所有的段落物件;
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; }
今天先到這裡了,以後有收穫再補充。
以上是C# 使用NPOI產生Word文件(依照範本)的詳細內容。更多資訊請關注PHP中文網其他相關文章!