DocTemplateTool - 可根据模板生成word或pdf文件的工具

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

Document Template Tool

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

在这里插入图片描述

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

功能 & 特点

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

快速开始

使用Cli

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

参数列表:

参数含义用法
-pPatternFile指定一个Object文件(Json), 作为数据源件
-iInput指定一个docx文件作为模板
-oOutput指定一个路径,作为导出目标
-sSource值为json
-dDestination值为word, pdf
-wWaitAtEnd指定时,程序执行完成后,将等待用户输入退出
-hHelp查看帮助

示例

.\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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:在 ES|QL 中使用 DISSECT 和 GROK 进行数据处理

目录 DISSECT 还是 GROK&#xff1f; 或者两者兼而有之&#xff1f; 使用 DISSECT 处理数据 Dissect pattern 术语 例子 DISSECT 关键修饰符 右填充修饰符 (->) 附加修饰符 () 添加顺序修饰符&#xff08; 和 /n&#xff09; 命名的跳过键&#xff08;&#xff1f…

MinIO 分布式文件(对象)存储

简介 MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。 在中国&#xff1a;阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品 官网地址&#xff1a;http://www.minio.org.cn/ 下载 官网下载(8.4.3版本)&#x…

WSGI与ASGI:两种Python Web服务器网关接口的比较

在当今的Web开发领域&#xff0c;选择合适的服务器网关接口&#xff08;Server Gateway Interface&#xff0c;简称SGI&#xff09;对于提高Web应用程序的性能和并发性至关重要。在Python中&#xff0c;有两种常见的SGI&#xff1a;WSGI和ASGI。本文将深入探讨这两种SGI的异同点…

通过51单片机控制SG90舵机按角度正反转转动

一、前言 本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机&#xff0c;具有体积小、重量轻、结构简单等特点&#xff0c;被广泛应用于机器人、遥控模型和各种自动控制系统中。 使用51单片机&#xff08;STC89C52&#xff09;作为控…

变压器试验VR虚拟仿真操作培训提升受训者技能水平

VR电气设备安装模拟仿真实训系统是一种利用虚拟现实技术来模拟电气设备安装过程的培训系统。它能够为学员提供一个真实、安全、高效的学习环境&#xff0c;帮助他们更好地掌握电气设备的安装技能。 华锐视点采用VR虚拟现实技术、MR混合现实技术、虚拟仿真技术、三维建模技术、人…

ubuntu22.04桌面版系统无法识别USB摄像头

虚拟机连接电脑摄像头连接失败&#xff08;驱动程序错误&#xff09; 本文为转载&#xff1a;版权归远作者所有&#xff0c;之所以转载是为了避免被原作者删除 巴黎铁塔下的女孩 你尽管努力&#xff0c;剩下的交给时间 虚拟机调用电脑的摄像头&#xff0c;正常情况下只需点击…

3.5、Linux:命令行git的使用

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 在Linux Centos7.6下安装git yum -y install git 注册一个gitee账号 进去注册就好&#xff0c;记住自己的用户名和密码。 创建一个仓库 点击复制&#xff0c;接着就可以在Linux上使用了 git clone git clone 刚才复制的地…

el-select多选以tag展示时,超过显示长度以...省略号显示,且在一行展示

效果&#xff1a; 代码&#xff1a; <span>系统词典维度&#xff1a;</span><el-selectv-model"dNum"placeholder"请选择"multiplecollapse-tags //设置collapse-tags属性将它们合并为一段文字size"small"style"width:160p…

Python模块导入出现ModuleNotFoundError: No module named ‘***’解决方法

概述 几年没弄python了&#xff0c;全部还会给老师&#xff0c;今天弄了个demo&#xff0c;老是报错&#xff0c;在此记录下&#xff0c;方便后续查阅。 环境&#xff1a;Windows10 开发IDEA&#xff1a;PyCharm 2023.1.3 1、报错如下所示 2、解决方法&#xff1a;安装execjs…

第十一章《搞懂算法:聚类是怎么回事》笔记

聚类是机器学习中一种重要的无监督算法&#xff0c;可以将数据点归结为一系列的特定组合。归为一类的数据点具有相同的特性&#xff0c;而不同类别的数据点则具有各不相同的属性。 11.1 聚类算法介绍 人们将物理或抽象对象的集合分成由类似 的对象组成的多个类的过程被称为聚…

技术干货 | GreatDB新一代读写分离架构,如何炼就近乎0损耗的性能?

优化数据库性能并降低成本是每位架构师和DBA都必须面对的挑战。其中&#xff0c;读写分离是一种常见方法&#xff1a;即通过将读操作和写操作分发到不同的数据库实例&#xff0c;实现多副本负载和性能提升。 传统的中间件方案&#xff0c;例如基于Proxysql、HAProxy、MySQL Ro…

学习笔记:CANOE模拟LIN主节点和实际从节点进行通信测试

先写点感想&#xff0c;在LIN开发阶段&#xff0c;我一般用图莫斯USB工具来进行模拟主机节点发送数据。后来公司买了CANOE工具就边学习边搭建了LIN的测试工程&#xff0c;网上的资料真的很少&#xff0c;主要是靠自己一点点摸索前进&#xff0c;总算入门。几个月后的今天&#…

计算机网络第4章-网络层(1)

引子 网络层能够被分解为两个相互作用的部分&#xff1a; 数据平面和控制平面。 网络层概述 路由器具有截断的协议栈&#xff0c;即没有网络层以上的部分。 如下图所示&#xff0c;是一个简单网络&#xff1a; 转发和路由选择&#xff1a;数据平面和控制平面 网络层的作用…

Python语言高级实战-内置函数super()的使用之类的单继承(附源码和实现效果)

实现功能 super()是一个内置函数&#xff0c;用于调用父类的方法。super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xff0c;但是如果使用多继承&#xff0c;会涉及到查找顺序&#xff08;MRO&#xff09;、重复调用&#xf…

gitlab数据备份和恢复

gitlab数据备份 sudo gitlab-rake gitlab:backup:create备份文件默认存放在/var/opt/gitlab/backups路径下&#xff0c; 生成1697101003_2023_10_12_12.0.3-ee_gitlab_backup.tar 文件 gitlab数据恢复 sudo gitlab-rake gitlab:backup:restore BACKUP1697101003_2023_10_12_…

SAP-MM-查找采购订单的创建和修改日期

在采购订单页面可以查看采购订单的修改和创建&#xff0c;但是有些内容不能完成看到 例如这个订单显示是用户唐创建&#xff0c;但是他不记得是什么时候创建的&#xff0c;怎么创建的&#xff1f; 点击菜单-环境-表头更改、项目更改&#xff0c;可以查看更改内容 通过这个表可…

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …

Zibll子比主题开心版 v7.4.2 不限域名无限搭建

Zibll子比主题是国内一款相对良心&#xff0c;更新也很不错的一款wordpress主题。专为博客、自媒体、资讯类的网站设计开发&#xff0c;简约优雅的设计风格&#xff0c;全面的前端用户功能&#xff0c;简单的模块化配置&#xff0c;欢迎您的体验。 资源入口点击进入 版本说明 新…

IntelliJ IDEA 2022创建Maven项目

IntelliJ IDEA 2022创建Maven项目 点击New Project 配置一下下 (1). 选择Maven Archetype (2). 输入Name就是你的项目名称 (3). 输入Location是你的项目保存目录 (4). 选择JDK (5). 选择Catalog一般默认选择Internal即可 在Archetype这里我们选择一个模板来创建Maven项目 …

什么是Kubernetes RBAC?为什么需要它?

目录 什么是Kubernetes RBAC? 如何启用Kubernetes RBAC 1.服务帐户 2.角色和集群角色 3.角色绑定和集群角色绑定 Kubernetes RBAC的好处 1.适当的授权 2.职责分离 3.100%遵守法规 Kubernetes RBAC的缺点 企业软件开发工具 什么是Kubernetes RBAC? 当组织开始走上…