C#使用NPOI根據模板生成Word文件功能實現


最近在做一個項目,需要根據模板生成一個銷售合同的功能,百度了一下發現有幾個插件可以使用

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM