C#使用NPOI根據模板生成Word檔案功能實現
阿新 • • 發佈:2021-06-24
最近在做一個專案,需要根據模板生成一個銷售合同的功能,百度了一下發現有幾個外掛可以使用
1.使用Microsoft.Office.Interop.Word生成,這種方法需要本地安裝了Office才可以,由於功能在客戶電腦上使用,不能保證都安裝了office,這種方法被pass
2.使用Aspose.Words,這個方法不需要本地安裝Office,有免費版本,但是我看了一下演示程式碼比較複雜,所以也沒有考慮這種方法
3.使用NPOI生成word,這種方法.NET也有現成的外掛引用,可以通過NuGet安裝包,所以我採用了這種方式
由於網上有一些關於NPOI生成Word檔案的方法,我也使用了網上提供的程式碼,我就講一下使用中遇到的問題
我採用了部落格園一個博主的程式碼,引用地址:https://www.cnblogs.com/byron-123/p/12956621.html,在應用程式碼中我遇到了以下問題
問題1:根據List資料生成表格,生成後word檔案無法開啟,提示內容有問題,研究了很久好現是以下程式碼生成的表格會無法開啟,所以我改以一下程式碼
原來的程式碼:
/// <summary> /// 替換表格Key /// </summary> /// <param name="para"></param> /// <param name="model"></param>private static void ReplaceTableKey(XWPFTable table, IList list, String field) { List<XWPFParagraph> paras = new List<XWPFParagraph>(); // 獲取最後一行資料,最後一行設定值 Int32 iLastRowIndex = 0; for (int iIndex = 0; iIndex < table.Rows.Count; iIndex++) {if (iIndex == table.Rows.Count - 1) { iLastRowIndex = iIndex; foreach (var cell in table.Rows[iIndex].GetTableCells()) { foreach (var para in cell.Paragraphs) { paras.Add(para); } } } } // 刪除最後一行 table.RemoveRow(iLastRowIndex); for (int iIndex = 0; iIndex < list.Count; iIndex++) { dynamic data = list[iIndex]; Type t = data.GetType(); PropertyInfo[] pi = t.GetProperties(); // 表增加行 XWPFTableRow m_row = table.CreateRow(); CT_Row m_NewRow = new CT_Row(); String text = String.Empty; Int32 jIndex = 0; paras.ForEach(para => { text = para.ParagraphText; foreach (PropertyInfo p in pi) { if (text.Contains("$" + field + "." + p.Name + "$")) { m_row.GetCell(jIndex).SetText(p.GetValue(data, null).ToString()); } } jIndex++; }); m_row = new XWPFTableRow(m_NewRow, table); table.AddRow(m_row); } }
修改後的程式碼:更換了原來的邏輯,原來根據模板表格的行復制生成新的行,改了之後是插入新的行,只是利用原來行的模板資料
public static void TableInsertNewRows(XWPFTable table, IList<object> list, string field, string leftSplit = "$", string rightSplit = "$") { List<XWPFParagraph> paras = new List<XWPFParagraph>(); // 獲取最後一行資料,最後一行設定值 if (table.Rows.Count >= 2) { foreach (var cell in table.Rows[1].GetTableCells()) { foreach (var para in cell.Paragraphs) { paras.Add(para); } } //刪除資料行 table.RemoveRow(1); } dynamic data = list[0]; Type t = data.GetType(); PropertyInfo[] pi = t.GetProperties(); String text = String.Empty; for (int i = 0; i < list.Count; i++) { XWPFTableRow m_Row = table.InsertNewTableRow(1 + i);//建立一行/並且在某個位置新增一行 foreach (var para in paras) { text = para.ParagraphText; foreach (PropertyInfo p in pi) { if (text.Contains(leftSplit + field + "." + p.Name + rightSplit)) { m_Row.AddNewTableCell().SetText(p.GetValue(data, null).ToString()); break; } } } } }
問題2:模板檔案中包含圖片導致生成的word檔案也無法開啟,提示也是內容有問題,修改方法,將圖片通過程式碼插入word檔案,這樣產生的問題是,圖片無法設定環繞模式
程式碼下載:https://download.csdn.net/download/rxyhj/19804923