首頁  >  文章  >  後端開發  >  C# 使用NPOI產生Word文件(依照範本)

C# 使用NPOI產生Word文件(依照範本)

php是最好的语言
php是最好的语言原創
2018-08-07 10:52:3616841瀏覽

專案需要整合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.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;
}

今天先到這裡了,以後有收穫再補充。

相關推薦:

使用C/C 寫PHP Extension

【c#教學】C# 資料型別### ###

以上是C# 使用NPOI產生Word文件(依照範本)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn