zoukankan      html  css  js  c++  java
  • .net core 使用NPOI填充Word模板导出Word

      最近工作用到在Word模板插入数据库数据,导出一个带数据的Word文件,想起来之前操作Word都是用微软提供的Microsoft.Office.Interop.Word,而在最新的..NET CORE 2.0则没发现什么适用的方法,于是想起了POI移植到.NET平台的NPOI,于是在网上查找了下在.NET CORE 平台下NPOI的情况,大致了解下NPOI在.NET CORE下一直是有位民间大神Savorboard开发的,直到CORE 2.0版本后.在NuGet中搜索DotNetCore.NPOI,得到下图,2.0后使用DotNetCore.NPOI,在2.0之前都是由使用大神开发的较早的版本Savorboard.NPOI.CORE.OOXML.更多关于NPOI的介绍参考博文:http://www.cnblogs.com/savorboard/p/dotnetcore-npoi.html 

      NPOI本人熟悉的不多,本次用到的功能就是根据实际数据填充进预先的Word模板实现一个特殊特定格式Word的导出,在这我选择使用1.0.2版本的DotNetCore.NPOI,因为在1.2版本本人在项目中使用时候经常就无法实例化XWPFDocument对象,使用的是标准的word 2007新建的docx文件,找了很久原因最后在降级到版本1.0.2得到解决。

      功能比较简单,在这贴上NPOI工具类

        /// <summary>
        /// 作者:jomz
        /// </summary>
        public class NpoiHeplper
        {
            /// <summary>
            /// 输出模板docx文档(使用字典)
            /// </summary>
            /// <param name="tempFilePath">docx文件路径</param>
            /// <param name="outPath">输出文件路径</param>
            /// <param name="data">字典数据源</param>
            public static void Export(string tempFilePath,string outPath,Dictionary<string,string> data)
            {
                using (FileStream stream = File.OpenRead(tempFilePath))
                {
                    XWPFDocument doc = new XWPFDocument(stream);
                    //遍历段落                  
                    foreach (var para in doc.Paragraphs)
                    {
                        ReplaceKey(para, data);
                    }
                    //遍历表格      
                    foreach (var table in doc.Tables)
                    {
                        foreach (var row in table.Rows)
                        {
                            foreach (var cell in row.GetTableCells())
                            {
                                foreach (var para in cell.Paragraphs)
                                {
                                    ReplaceKey(para, data);
                                }
                            }
                        }
                    }
                    //写文件
                    FileStream outFile = new FileStream(outPath, FileMode.Create);
                    doc.Write(outFile);
                    outFile.Close();
                }
            }
            private static void ReplaceKey(XWPFParagraph para, Dictionary<string,string> data)
            {
                string text = "";
                foreach (var run in para.Runs)
                {
                    text = run.ToString();
                    foreach (var key in data.Keys)
                    {
                        //$$模板中数据占位符为$KEY$
                        if (text.Contains($"${key}$"))
                        {
                            text = text.Replace($"${key}$", data[key]);
                        }
                    }
                    run.SetText(text, 0);
                }
            }
    
    
            /// <summary>
            /// 输出模板docx文档(使用反射)
            /// </summary>
            /// <param name="tempFilePath">docx文件路径</param>
            /// <param name="outPath">输出文件路径</param>
            /// <param name="data">对象数据源</param>
            public static void ExportObjet(string tempFilePath, string outPath, object data)
            {
                using (FileStream stream = File.OpenRead(tempFilePath))
                {
                    XWPFDocument doc = new XWPFDocument(stream);
                    //遍历段落                  
                    foreach (var para in doc.Paragraphs)
                    {
                        ReplaceKeyObjet(para, data);
                    }
                    //遍历表格      
                    foreach (var table in doc.Tables)
                    {
                        foreach (var row in table.Rows)
                        {
                            foreach (var cell in row.GetTableCells())
                            {
                                foreach (var para in cell.Paragraphs)
                                {
                                    ReplaceKeyObjet(para, data);
                                }
                            }
                        }
                    }
                    //写文件
                    FileStream outFile = new FileStream(outPath, FileMode.Create);
                    doc.Write(outFile);
                    outFile.Close();
                }
            }
            private static void ReplaceKeyObjet(XWPFParagraph para, object model)
            {
                string text = "";
                Type t = model.GetType();
                PropertyInfo[] pi = t.GetProperties();
                foreach (var run in para.Runs)
                {
                    text = run.ToString();
                    foreach (PropertyInfo p in pi)
                    {
                        //$$模板中数据占位符为$KEY$
                        string key = $"${p.Name}$";
                        if (text.Contains(key))
                        {
                            try
                            {
                                text = text.Replace(key, p.GetValue(model, null).ToString());
                            }
                            catch (Exception ex)
                            {
                                //可能有空指针异常
                                text = text.Replace(key, "");
                            }
                        }
                    }
                    run.SetText(text, 0);
                }
            }
    
        }

      使用介绍,本工具类可根据字典数据源或者对象数据源导出标准的docx格式word,不考虑word排版问题,只考虑数据填充,排版由word模板使用office自行制作。

    ExportObjet方法传入word模板对象地址tempFilePath,导出到地址outPath,以及类数据源data,通过反射获取字段匹配word模板中对应的$key$名称去替换其值达到最后效果。同理
    Export则使用字典作为数据源。
  • 相关阅读:
    (13)使用Ajax Helper 提高用户体验
    (12)改变图片的大小生成缩略图
    (11)通过表单上传文件
    程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理
    xCode 4.X 免证书真机发布及调试
    35岁前必须做好的10件事情(转载)
    独自收集Cocos2d提供的字体!共57种(有对照的字体图)
    (10)根据关键字搜索
    tcp拥塞控制
    dpcnv reademe
  • 原文地址:https://www.cnblogs.com/jomzhang/p/9555397.html
Copyright © 2011-2022 走看看