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
C#使用NPOI根据模板生成Word文件功能实现的更多相关文章
- 利用html模板生成Word文件(服务器端不需要安装Word)
利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...
- 根据指定Word模板生成Word文件
最近业务需要批量打印准考证信息 1.根据Table数据进行循环替换,每次替换的时候只替换Word中第一个Table的数据, 2.每次替换之后将Word中第一个Table数据进行复制,将复制Table和 ...
- freemarker根据模板生成word文件实现导出功能
一.准备工作 1.创建一个03的word文档,动态的数据用占位符标志占位(如testname).然后另存为word2003的xml文件. 2.格式化xml文件,占位符的位置用${testname}代替 ...
- Java根据Freemarker模板生成Word文件
1. 准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...
- Java 使用模板生成 Word 文件---基于 Freemarker 模板框架
Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...
- 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)
https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ...
- 使用word模板生成pdf文件
使用word模板生成pdf文件 源码:UserWord
- 根据PDF模板生成PDF文件(基于iTextSharp)
根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...
- JSP生成word文件
1.jsp生成word文件,直接改动jsp格式: <%@ page contentType="application/vnd.ms-word;charset=GB2312"% ...
- Java使用iText生成word文件的完美解决方案(亲测可行)
JAVA生成WORD文件的方法目前有以下种: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案 一种是pio但是他的excel处理很程序 wor ...
随机推荐
- 消息验证码(MAC)的介绍
目录 认证流程 MAC 的分类 认证加密 MAC的攻击手段 重发攻击 密钥推测攻击 消息认证码无法解决的问题 Reference 消息验证码(MAC)也可以称为消息认证码. 定义: 消息验证码(Mes ...
- (Pytorch第三天)复制官网教程程序遇到的一系列报错
先说一下,我之前没学过Python,但是鉴于我是一名c语言高手(雾),我决定现学现用. 首先是https://pytorch.org/tutorials/beginner/basics/optimiz ...
- Razor路由相关
1.赋予参数 @page "{id}" @model RazorTest.Pages.TestBModel @{ } <p>TestBId is @Model.Test ...
- 初次使用 Jetbrains Rider 编写 C#(.Net) 代码
前段时间,Jetbrains公司 公布了 Rider IDE 对非商业用途免费,看到很多业界的朋友都用到这个IDE,今天便下载下来使用一下. 1.界面的差异 Rider的界面跟我前段时间学习调试安卓代 ...
- 如何在AutoCAD Electrical中修改项目描述中的行号
默认情况下,项目描述对话框中都会以行号+数字的形式显示,如下图所示: 1.打开记事本程序,按照以下格式收入文字: LINE1=设计 LINE2=制图 LINE3=校对 LINE4=审核 LINE5=工 ...
- 「Log」做题记录 2023.9.25-2023.10.29
\(2023.9.25-2023.10.1\) \(\color{limegreen}{P3524}\) 考虑删掉两个不相连的点,这两个点必定一个在团内一个在团外,删掉 \(\frac{n}{3}\) ...
- C# 模式匹配全解:原理、用法与易错点
引言 随着C#不断发展,"模式匹配"(Pattern Matching)已经成为让代码更加友好.可读和强大的核心特性.从 C# 7.0 初次引入,到 C# 11的能力扩展,模式匹配 ...
- 开源公开课丨大数据调度系统Taier任务调度介绍
一.直播介绍 前几期,我们为大家分享了Taier基本介绍.控制台.Web前端架构及数据开发介绍,本期我们为大家分享Taier任务调度介绍. 本次直播我们将从Taier的任务调度实例生成.调度及提交等方 ...
- 我的第一个 WinUI 3 程序,遇到了 5 次碰壁
为什么要学习 WinUI 3呢? Winform 程序,简单.直接.快速: Wpf 程序,丰富.多样.好看: WinUI3 呢?据说它是前两者的升级版,比它们更酷炫,性能更好,而且跨平台,是技术的前沿 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(13)
1.问题描述: 推送通知里的skills标签有什么用?不填写似乎不影响推送,以及推送的点击跳转操作 解决方案: 鸿蒙系统的推送通知中的skills标签主要用于指定接收推送的应用程序所支持的能力(Ski ...