C# 使用NPOI產生Word文檔(按照模板)

來源:互聯網
上載者:User

項目需要整合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;
}

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

四、 圖片處理

Alibaba Cloud Hot Products

Elastic Compute Service (ECS) Dedicated Host (DDH) ApsaraDB RDS for MySQL (RDS) ApsaraDB for PolarDB(PolarDB) AnalyticDB for PostgreSQL (ADB for PG)
AnalyticDB for MySQL(ADB for MySQL) Data Transmission Service (DTS) Server Load Balancer (SLB) Global Accelerator (GA) Cloud Enterprise Network (CEN)
Object Storage Service (OSS) Content Delivery Network (CDN) Short Message Service (SMS) Container Service for Kubernetes (ACK) Data Lake Analytics (DLA)

ApsaraDB for Redis (Redis)

ApsaraDB for MongoDB (MongoDB) NAT Gateway VPN Gateway Cloud Firewall
Anti-DDoS Web Application Firewall (WAF) Log Service DataWorks MaxCompute
Elastic MapReduce (EMR) Elasticsearch

Alibaba Cloud Free Trail

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.