.Net NPOI Word模板关键内容替换

一、问题需求

在开发的一个项目中,需要根据给定的文档模板,将数据库中的数据形成模板样式的pdf文件,刚开始使用的是itext创建table的方式创建生成pdf,后来在调试中发现使用itext创建的pdf的样式与模板差别很大,比如封面固定为一页,第二页的数据会显示在封面中,而且使用SetLeading也无法把控间距,后来想到了,使用Word模板,将需要替换的内容设置成固定的标签,然后将新的word转成pdf的样式

开发使用的是VS2017,.NetCore的项目框架

二、功能实现

1、准备工作

1)将Word模板中需要替换的内容,使用设定的标签代替,我这里使用的是{$UserName} 样式的标签,其中UserName是实体类中的字段名称

2)Nuget包中搜索并安装DotNetCore.NPOI

3)在相关的操作类中,添加引用

using NPOI.OpenXmlFormats.Wordprocessing;
using NPOI.XWPF.UserModel;

2、实现的代码

1)读取并解析word模板文档段落和table表格内容,以下代码是示例,可根据实际情况修改

/// <summary>
/// 生成word文档
/// </summary>
/// <param name="userInfo">用户信息</param>
/// <param name="docTemplatePath">doc模板存放路径</param>
public static void CreateDoc(UserInfo userInfo,string docTemplatePath)
{
   if (File.Exists(docTemplatePath))
   {
      string newTempletePath ="D:\\UploadFiles\\PdfFiles\\";
      string newTempleteFileName = Guid.NewGuid().ToString() + ".docx";
      if (!Directory.Exists(newTempletePath))
      {
          Directory.CreateDirectory(newTempletePath);
      }
      string newTempleteFullPath = newTempletePath + newTempleteFileName;
      File.Copy(templetePath, newTempleteFullPath);//拷贝doc模板
       //读取Word模板
      FileStream fileStream = new FileStream(newTempleteFullPath, FileMode.Open, FileAccess.Read);
      XWPFDocument myDoc = new XWPFDocument(fileStream);
      //遍历段落,替换内容
      foreach (var para in myDoc.Paragraphs)
      {                        
         ReplaceKey(userInfo, para);           
      }
      //遍历table,替换单元格内容
      foreach(var table in myDoc.Tables)
      {
         foreach (var row in table.Rows)
         {
           foreach (var cell in row.GetTableCells())
           {
              foreach (var para in cell.Paragraphs)
              {
                ReplaceKey(userInfo, para);
              }
           }
         }
      }
      MemoryStream ms = new MemoryStream();
      myDoc.Write(ms);
      //保存修改后的文档
      // 把 byte[] 写入文件 
      FileStream fs = new FileStream("D:\\newDoctest.docx", FileMode.Create);
      BinaryWriter bw = new BinaryWriter(fs);
      bw.Write(ms.GetBuffer());
      bw.Close();
      fs.Close();
   }
}

2)模板内容替换实现方法代码

        /// <summary>
        /// word模板内容替换
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="etity">实体数据</param>
        /// <param name="para">段落</param>
        private static void ReplaceKey<T>(T etity, XWPFParagraph para)
        {
            Type entityType = typeof(T);
            PropertyInfo[] properties = entityType.GetProperties();
            string entityName = entityType.Name;//实体类名称
            string paratext = para.ParagraphText;
            var runs = para.Runs;
            string styleid = para.Style;
            string text = "";
            foreach(var run in runs)
            {
              text = run.ToString();
              foreach (var p in properties)
              {
                 string propteryName = "{$" + p.Name + "}";//Word模板中设定的需要替换的标签
                 object value = p.GetValue(etity);
                 if (value == null)
                 {
                    value = "";
                 }
                 if (text.Contains(propteryName))
                 {
                    text = text.Replace(propteryName, value.ToString());
                 }
                 run.SetText(text);//替换标签文本(重要)
              }
            }
         }

3、注意事项

NPOI操作word文档只可操作2003版的word,或者2007版的docx文档,如果是其他版本的word文档,在读取word模板文档时会出现Exception: Wrong Local header signature: 0xE011CFD0的错误,解决这个错误,只要将word文档另存为docx格式的就可以了

  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: NPOI是一个用于操作Microsoft Office文件格式的开源库,包括Word、Excel和PowerPoint等。使用NPOI可以简化对Word文件的处理,包括创建、编辑、读取和保存等操作。 在NPOI中,使用Word模板可以实现自动生成Word文件的功能。Word模板是一个预先设计好的Word文件,其中包含了一些占位符,以便在需要的时候替换为真实的数据。通过将模板加载到NPOI中,可以在代码中动态地替换模板中的占位符,生成最终的Word文件。 使用NPOI Word模板的步骤如下: 1. 导入NPOI的相关库文件,并创建一个NPOIWord文档对象。 2. 加载Word模板文件,可以是本地的文件路径,也可以是通过网络获取的文件。 3. 在模板中通过标记或占位符来标示需要替换内容,比如用{{name}}表示“姓名”。 4. 使用NPOI提供的替换方法,将占位符替换为真实的数据。 5. 根据需要进行其他的操作,比如插入表格、添加样式等。 6. 将生成的Word文件保存到指定的路径或输出流中。 使用NPOI Word模板可以方便地生成需要大量重复或动态数据的Word文件,比如合同、报告、简历等。通过预先设计好的模板,可以在代码中快速地替换数据并生成最终文件,大大提高了工作效率。 总之,NPOI Word模板是一种便捷的使用方式,可以在代码中动态生成Word文件。通过使用NPOI库提供的方法,我们可以实现对Word文件的各种操作,满足不同场景的需求。 ### 回答2: NPOI是一款.NET平台上的开源库,用于读取、写入和操作Microsoft Office格式文件,包括Word文档。在NPOI中,我们可以使用Word模板来生成和编辑Word文档。 使用NPOIWord模板功能,我们可以将已有的Word文档作为模板文件,然后在该模板的基础上进行内容替换、样式的修改和表格的操作等。这样,我们就可以通过代码动态地生成符合需求的Word文档。 在使用NPOIWord模板时,我们首先需要加载模板文件。然后,我们可以通过NPOI提供的API,使用标签或书签将模板中的部分内容进行占位,并在生成文档时将其替换为实际的内容。我们还可以使用NPOI提供的方法,对模板中的样式进行设置和修改。此外,NPOI还提供了丰富的表格操作功能,可以动态地添加、删除和修改表格及其内容。 通过NPOIWord模板功能,我们可以灵活地生成包含动态内容Word文档,这在一些需要批量生成和定制化的场景中非常有用。例如,我们可以根据数据库中的数据生成报告、合同、信函等文档,并在生成过程中根据业务逻辑对内容和样式进行个性化定制。 总的来说,NPOIWord模板功能为我们提供了在.NET平台上操作Word文档的便利性和灵活性,充分满足了我们对于生成和编辑Word文档的需求。 ### 回答3: NPOI是一个用于处理Microsoft Office文档的开源库。它包含了用于操作Word、Excel和PowerPoint等文档的功能。 在使用NPOI库中的Word模板功能时,我们首先需要创建一个包含合适格式的Word模板文件。模板文件中可以包含各种我们需要的文本、图像、表格和其他内容。 使用NPOIWord模板功能,我们可以通过代码来读取和编辑模板文件中的内容。需要注意的是,我们可以使用NPOI提供的API来找到并替换文本、插入图像、合并单元格并进行其他各种操作。 通过NPOIWord模板功能,我们可以根据需要生成多个实际应用的文档。我们可以将模板文件中的占位符替换为具体的数据,实现自动生成报告、合同、邮件等文档的功能。 使用NPOIWord模板功能时,我们需要了解一些基本的操作方法和导入的命名空间。还需要注意的是,我们可以进一步扩展NPOI库的功能,以适应我们的特定需求。 总而言之,NPOIWord模板功能可以帮助我们实现对Word文档的自动化处理。通过使用合适的模板文件和代码,我们可以轻松地生成各种格式的文档,提高工作效率,减少重复劳动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值