你是否经常遇到这样的场景:产品运营有着大量的报告需求,或者给客户领导展现每周的运营报告?这些文档类的任务可以交给运营同事,他们负责文档排版和样式,你作为开发人员你只需要提供数据源,和一个映射表,告诉制作文档的人哪些字段可供使用。这样一来分工明确,减少了很多不必要的沟通成本。

Document Template Tool

指定一个模板生成word或pdf文件

运行单元测试以查看示例!

功能 & 特点

  • 基于占位符的模板,可继承原有样式;
  • 支持表格;
  • 支持数据集合;
  • 支持图片;
  • 提供Cli版本程序;
  • 可扩展的接口封装和组件。

快速开始

使用Cli

进入可执行文件所在目录,在命令提示符中运行DocTemplateTool.exe

参数列表:

参数 含义 用法
-p PatternFile 指定一个Object文件(Json), 作为数据源件
-i Input 指定一个docx文件作为模板
-o Output 指定一个路径,作为导出目标
-s Source 值为json
-d Destination 值为word, pdf
-w WaitAtEnd 指定时,程序执行完成后,将等待用户输入退出
-h Help 查看帮助

示例

.\wtt.exe -p .\sample\data.json -i .\sample\template.docx -o .\output\test.docx -s json -d word

使用DocTemplateTool.Word类库

在项目中引用DocTemplateTool.Word

dotnet add package DocTemplateTool.Word

由于Exporter返回的NPOI对象,你需要自行根据业务来处理结果,以及处理IO异常

byte[] docFileContent;

var docinfo = GetDocInfo(); // 准备数据
var result = Exporter.ExportDocxByObject("D:\\Template.docx", docinfo); //生成NPOI文档对象 //处理结果
using (var memoryStream = new MemoryStream())
{
result.Write(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
docFileContent = memoryStream.ToArray();
} //写入文件或返回接口
File.WriteAllBytes("D:\\Result.docx", docFileContent);

占位符

占位符是指在模板中的一个标记,用于标记需要替换的文本或图片,

文本占位符的格式为:$字段名称[附加属性]$

图片占位符的格式为:#字段名称[附加属性]#

Exporter将扫描文档中所有占位符,然后根据占位符的名称,从数据源中获取对应的文本值或图片内容,替换到文档中。

文本

例如

姓名:$ClientName$

将被替换为

姓名:张三

图片

确认大小

图片占位符支持附加属性,用于指定图片的宽度和高度,格式为:#字段名称[宽度,高度]#

#Graphic[431,266]#

将被替换为一个宽度为431,高度为266的图片,单位为像素。

若不指定宽度和高度,则使用默认图片尺寸556*262。

在Word文档中,因为像素大小是个相对值,页面视图100%时的大小为实际像素尺寸,你可以使用截图工具或标尺工具确认图片的大小。

设置图片

图片源支持本地文件和网络图片以及Base64编码的图片。

从不同图片来源生成文档的示例运行如下:

数据集合

由于NPOI限制,暂不支持表格的嵌套。

数据集合将以表格的形式呈现在文档中,因此你需要在模板中预留一个表格,Exporter将根据表中单元格的占位符,填充表格各列的内容。

包含占位符的行称之为模板行。

定义

public class HealthReportDocInfo
{
...
public List<DetailList> BloodPressureList { get; set; }
} public class DetailList
{
public string Name { get; set; }
public string Dept { get; set; }
public string Value { get; set; }
public string Result { get; set; }
}

配置模板表格:

默认以第二行作为模板行(通常第一行为表头),你也可以根据实际情况跳过表头,

例如在工资登记表示例中,表头占两行的情况下,第三行为模板行,那么你需要在配置中指定模板行的索引为2(索引从0开始)。

$Details[2]$

模板行的样式将决定表格的样式,因此你可以在模板行中设置表格的样式,例如设置表格的字体,颜色,大小等。

示例运行如下图:

其他示例

企业员工健康管理周报

心电图报告

数据源

数据源支持从哈希表(字典)或对象中获取数据。

Exporter提供了ExportDocxByDictionary和ExportDocxByObject两个方法,分别用于从哈希表和对象中获取数据。

从哈希表中获取数据:

var docinfo = new Dictionary<string, object>()
{
{"Dept", "XX科技股份有限公司" },
{"Date", DateTime.Now },
{"Number", "凭 - 202301111" },
{"Details", new List<Dictionary<string, object>>(){ new Dictionary<string, object>(){
{ "Type","销售收款"},
{ "Name","应收款"},
{ "DeptorAmount",0},
{ "LenderAmount",50000}
},
new Dictionary<string, object>(){
{ "Type","销售收款"},
{ "Name","预收款"},
{ "DeptorAmount",30000},
{ "LenderAmount",0}
},
new Dictionary<string, object>(){
{ "Type","销售收款"},
{ "Name","现金"},
{ "DeptorAmount",20000},
{ "LenderAmount",0}
}, }},
{ "DeptorSum", 50000 },
{ "LenderSum", 50000 },
{ "ClientName", "XX科技股份有限公司" },
{ "Teller", "张三" },
{ "Maker", "李四" },
{ "Auditor", "王五" },
{ "Register", "赵六" },
};
var result = Word.Exporter.ExportDocxByDictionary(Path.Combine(templatePath_Doc, $"AccountingTemplate.docx"), docinfo, (s) => s);

从匿名对象中获取数据:

var docinfo = new
{ Dept = "XX科技股份有限公司",
Date = DateTime.Now,
Number = "凭 - 202301111",
Details = new List<dynamic>() { new
{
Type = "销售收款",
Name = "应收款",
DeptorAmount = 0,
LenderAmount = 50000
},
new
{
Type = "销售收款",
Name = "预收款",
DeptorAmount = 30000,
LenderAmount = 0
},
new
{
Type = "销售收款",
Name = "现金",
DeptorAmount = 20000,
LenderAmount = 0
},
},
DeptorSum = 50000,
LenderSum = 50000,
ClientName = "XX科技股份有限公司",
Teller = "张三",
Maker = "李四",
Auditor = "王五",
Register = "赵六",
}; var result = Word.Exporter.ExportDocxByObject(Path.Combine(templatePath_Doc, $"AccountingTemplate.docx"), docinfo, (s) => s);

它们将得到同样的结果:

已知问题

作者信息

作者:林小

邮箱:jevonsflash@qq.com

License

The MIT License (MIT)

项目地址

Github:DocTemplateTool

DocTemplateTool - 可根据模板生成word或pdf文件的工具的更多相关文章

  1. 利用html模板生成Word文件(服务器端不需要安装Word)

    利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...

  2. 利用aspose-words 实现 java中word转pdf文件

    利用aspose-words  实现 java中word转pdf文件 首先下载aspose-words-15.8.0-jdk16.jar包 引入jar包,编写Java代码 package test; ...

  3. freemarker根据模板生成word文件实现导出功能

    一.准备工作 1.创建一个03的word文档,动态的数据用占位符标志占位(如testname).然后另存为word2003的xml文件. 2.格式化xml文件,占位符的位置用${testname}代替 ...

  4. Qt 生成word、pdf文档

    需求:将软件处理的结果保存为一个报告文档,文档中包含表格.图片.文字,格式为word的.doc和.pdf.生成word是为了便于用户编辑. 开发环境:qt4.8.4+vs2010 在qt的官网上对于p ...

  5. Java根据Freemarker模板生成Word文件

    1.  准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...

  6. 根据指定Word模板生成Word文件

    最近业务需要批量打印准考证信息 1.根据Table数据进行循环替换,每次替换的时候只替换Word中第一个Table的数据, 2.每次替换之后将Word中第一个Table数据进行复制,将复制Table和 ...

  7. JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)

    1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...

  8. 使用java Apache poi 根据word模板生成word报表

    项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...

  9. java通过word模板生成word文档

    介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱 ...

  10. JAVAWEB使用FreeMarker利用ftl把含有图片的word模板生成word文档,然后打包成压缩包进行下载

    这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/13072711.html 引入jar包,freemarker.jar.apache-ant-zip- ...

随机推荐

  1. MAUI+MASA Blazor 兼容性测试报告及分析

    目录 1. 背景 2. 目的 3. 测试目标 4. 预期结果 5. 测试策略及范围 6. 测试结果与分析 7. 附加内容 8. 结尾 1. 背景 MASA Blazor组件是一款基于Material ...

  2. MAUI Blazor Android 输入框软键盘遮挡问题2.0

    前言 关于MAUI Blazor Android 输入框软键盘遮挡问题,之前的文章已经有了答案,MAUI Blazor Android 输入框软键盘遮挡问题 但是这个方案一直存在一点小的瑕疵 在小窗模 ...

  3. Cilium系列-4-Cilium本地路由

    系列文章 Cilium 系列文章 前言 在前文中我们提到, cilium install 默认安装后, Cilium 功能启用和禁用情况如下: datapath mode: tunnel: 因为兼容性 ...

  4. asp.net core之配置

    简介 配置在asp.net core中可以说是我们必不可少一部分.ASP.NET Core 中的应用程序配置是使用一个或多个配置提供程序执行的. 配置提供程序使用各种配置源从键值对读取配置数据,普通最 ...

  5. RR有幻读问题吗?MVCC能否解决幻读?

    幻读是 MySQL 中一个非常普遍,且面试中经常被问到的问题,如果你还搞不懂什么是幻读?什么是 MVCC?以及 MySQL 中的锁?那么请好好收藏和阅读本篇文章,因为它非常重要. RR 隔离级别 在 ...

  6. SpringBoot3集成Redis

    目录 一.简介 二.工程搭建 1.工程结构 2.依赖管理 3.Redis配置 三.Redis用法 1.环境搭建 2.数据类型 3.加锁机制 四.Mybatis缓存 1.基础配置 2.自定义实现 五.参 ...

  7. 4.4 C++ Boost 数据集序列化库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  8. 分布式测试插件 pytest-xdist 使用详解

    使用背景: 大型测试套件:当你的测试套件非常庞大,包含了大量的测试用例时,pytest-xdist可以通过并行执行来加速整体的测试过程.它利用多个进程或计算机的计算资源,可以显著减少测试执行的时间. ...

  9. Sealos 新功能“定时任务”上线(省钱大杀器)

    流量高峰时段资源不足?低流量时段服务器成本过高? 本着好用又省钱的目标,sealos 推出 定时任务 功能,保证稳定的同时降低成本. Sealos 国内集群:https://cloud.sealos. ...

  10. 逻辑漏洞挖掘之XSS漏洞原理分析及实战演练

    一.前言 2月份的1.2亿条用户地址信息泄露再次给各大公司敲响了警钟,数据安全的重要性愈加凸显,这也更加坚定了我们推行安全测试常态化的决心.随着测试组安全测试常态化的推进,有更多的同事对逻辑漏洞产生了 ...