当前位置: 首页 > news >正文

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

相关文章:

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

你是否经常遇到这样的场景&#xff1a;产品运营有着大量的报告需求&#xff0c;或者给客户领导展现每周的运营报告&#xff1f;这些文档类的任务可以交给运营同事&#xff0c;他们负责文档排版和样式&#xff0c;你作为开发人员你只需要提供数据源&#xff0c;和一个映射表&…...

Python+reuqests自动化接口测试

1.最近自己在摸索Pythonreuqests自动化接口测试&#xff0c;要实现某个功能&#xff0c;首先自己得有清晰的逻辑思路&#xff01;这样效率才会很快&#xff01; 思路--1.通过python读取Excel中的接口用例&#xff0c;2.通过python的函数调用&#xff0c;get/Post 进行测试&…...

【Java 进阶篇】保护你的应用:Java 过滤器实现敏感词汇过滤

在开发 Web 应用程序时&#xff0c;安全性是至关重要的一环。保护用户免受恶意内容的侵害是开发者义不容辞的责任之一。在这篇博客中&#xff0c;我们将深入研究如何使用 Java 过滤器来过滤敏感词汇&#xff0c;确保用户输入的内容不包含不良信息。我们将采用简单而实用的方法&…...

目标检测网络系列——YOLO V4

文章目录 目标检测技术总结两种优化方向Bag of freebiesBag of specialsYOLO4网络结构网络架构(architecture)的选择基础网络结构的选择网络"插件"的选择。BoF和BoS的选择(Selection of BoF and BoS)YOLO4的其他改进点对比实验不同的特征(数据增强方法)之间的对比det…...

如何在Linux上部署1Panel运维管理面板并远程访问内网进行操作

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…...

CentOS系统安装vsftpd

下载并安装vsftpd apt-get install vsftpd 安装后检查 service vsftpd status 修改配置文件(被动/匿名用户模式) vi /etc/vsftpd.conf anonymous_enableNO listenYES listen_port21 ascii_upload_enableYES ascii_download_enableYES local_enableYES guest_enable…...

手握“发展密钥”,TCL科技或迎价值重估?

在高度竞争且快速变化的泛半导体产业&#xff0c;每一次周期性或结构性的变化&#xff0c;都会对企业经营策略带来深远的影响。 2023年前三季度&#xff0c;泛半导体产业迎来结构性复苏。其中&#xff0c;主流显示领域供需关系趋向健康化&#xff0c;半导体显示行业整体上量价…...

A star算法

1. 算法的理解 1.2 a 星算法的基本的原理 a 星 是一种启发式搜索算法&#xff0c; 用于在地图中的两个目标点之间寻找最短的路径&#xff0c;它结合了最优先搜索和Dijkstra算法的特点&#xff0c;通过考虑从起点到当前点的距离&#xff08;或者代价 g&#xff08;n) ) 和估算…...

node插件MongoDB(四)—— 库mongoose 操作文档使用(新增、删除、更新、查看文档)(二)

文章目录 前言&#xff08;1&#xff09;问题&#xff1a;安装的mongoose 库版本不应该过高导致的问题&#xff08;2&#xff09;重新安装低版本 一、插入文档1. 代码2. node终端效果3. 使用mongo.exe查询数据库的内容 二、删除文档1. 删除一条2. 批量删除3. 代码 三、修改文档…...

JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

网格布局 将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件&#xff08;布局&#xff09; , 类似于表格的方式。在网格布局 中放入控件的时候 , 还需要指定位置。 GridPane gridPane new GridPane(); 我们将要排出这个布局 , 也就是登陆页…...

数据中台之数据分析

效果界面 技术方案 Notebook集成 在您的数据平台上,创建一个能够与Jupyter Notebook通讯的服务。通过Jupyter Notebook的HTTP API与Notebook实例进行交互,执行代码、获取输出等。用户界面 在数据开发/数据分析的代码框右上方,添加一个机器人样式的图标,用户点击后可以调起…...

龙芯loongarch64服务器编译安装scipy

前言 根据我之前的文章介绍,龙芯loongarch64服务器中的很多python依赖包安装有问题,发现其中安装的"scikit-learn"就无法正常使用,所有这里在 pip3 install scikit-learn -U -i https://pypi.tuna.tsinghua.edu.cn/simple 的时候发现"scipy"就无法正常…...

ubuntu(18.04)中安装open babel docker镜像并在php项目中调用容器中的obabel命令解析结果使用

使用软件&#xff1a; obabel镜像&#xff1a;informaticsmatters/obabel docker&#xff1a;http:// https://www.docker.com/ 安装docker #卸载旧版本sudo apt-get remove docker docker-engine docker-ce docker.io#更新索引包sudo apt-get update#安装 apt 依赖包&…...

02-PostgreSQL的基本使用

一、数据库操作 ①: 登录到数据库 psql -U postgres -d postgres -h 127.0.0.1②:查看所有数据库 \l③: 创建数据库 # 创建一个名为 mydb 的数据库 create database mydb;④:切换数据库 # \c 数据库名 \c mydb⑤:删除数据库 # 删除前 先确保数据库没有被连接 drop databa…...

uniapp 实现路线规划

UniApp是一个跨平台的应用开发框架&#xff0c;可以帮助开发者快速地在多个平台上构建应用程序。其中&#xff0c;实现路线规划是一个常见的需求&#xff0c;特别是对于地图类应用或者出行类应用来说&#xff0c;路线规划功能是非常重要的。 首先引入QQMapWX&#xff1b; impo…...

C语言C位出道心法(五):内存管理

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体|结构体指针|链表 C语言C位出道心法(三):共用体|枚举 C语言C位出道心法(四):文件操作 C语言C位出道心法(五):内存管理 一:C语言内存管理认知 二:C语言中内存堆|栈认知 三:C语言中引用内存丢失认知...

Flink之SQL客户端与DDL操作

SQL客户端与DDL操作 Flink SQLSQL客户端1.启动Flink2.启动Flink的SQL客户端3.HELP命令4.验证连接5.结果显示模式6.执行配置 数据库操作1.创建数据库2.查询数据库3.修改数据库4.删除数据库 表操作1.创建表表列属性表Watermark属性列PRIMARY KEY属性列PARTITIONED BY属性列WITH选…...

记录第一次银行测试岗面试【总结几点面试不要犯得错误】

LZ在一个18线小城市做测试&#xff0c;近来想走出自己的舒适区&#xff0c;去做一点不一样的测试工作。 18线地区&#xff0c;测试工作并不多。最好的差不多就是LZ目前待着的公司了。遂决定去魔都闯荡几年&#xff0c;对一个在魔都无房无车无户口的人来讲&#xff0c;这意味着…...

一篇带你精通php

华子目录 什么是phpphp发展史平台支持和数据库支持网站静态网站和动态网站的区别静态网站动态网站的特点 关键名词解析服务器概念IP的概念域名DNS端口 web程序的访问流程静态网站访问流程动态网站访问流程 php标记脚本标记标准标记&#xff08;常用&#xff09; php注释 什么是…...

Go 语言函数

文章目录 Go 语言函数1. **函数的定义**&#xff1a;2. **参数和返回值**&#xff1a;3. **函数调用**&#xff1a;4. **多返回值**&#xff1a;5. **匿名函数**&#xff1a;6. **函数作为值**&#xff1a;7. **变参函数**&#xff1a;8. **递归函数**&#xff1a;9. **函数方法…...

MacBook M1/M2芯片上,用Python 3.10手动安装PyTorch全家桶的保姆级避坑指南

MacBook M1/M2芯片Python 3.10环境配置&#xff1a;PyTorch全家桶精准安装实战手册 当你在M1/M2芯片的MacBook上打开终端&#xff0c;输入那行看似简单的pip install torch命令时&#xff0c;系统报错的那一刻&#xff0c;可能就开启了一场令人头疼的依赖关系迷宫之旅。作为深…...

别再只盯着Datasheet了!NS4225 D类音频功放外围电路设计避坑指南(附完整原理图与PCB文件)

NS4225 D类功放实战设计&#xff1a;从数据手册到稳定输出的全流程解析 在硬件设计领域&#xff0c;D类音频功放以其高效率、小体积的优势逐渐成为音频系统的首选方案。NS4225作为一款集成式D类功放芯片&#xff0c;数据手册上简洁的典型应用电路往往让工程师产生"照搬就能…...

Qwen3.5-2B模型处理网络协议分析:智能解析与异常流量识别

Qwen3.5-2B模型处理网络协议分析&#xff1a;智能解析与异常流量识别 1. 网络运维的痛点与AI解决方案 网络运维工程师每天都要面对海量的协议数据包和系统日志。传统分析方法需要人工逐条查看十六进制报文&#xff0c;或者编写复杂的过滤规则&#xff0c;效率低下且容易遗漏关…...

避坑指南:在Windows上用Anaconda搭建PULSE去马赛克环境(解决dlib安装报错)

WindowsAnaconda环境下PULSE项目深度配置指南&#xff1a;从dlib报错到完整运行 最近在复现PULSE超分辨率项目时&#xff0c;发现许多同行在WindowsAnaconda环境下遭遇了各种"拦路虎"——从conda环境配置冲突到dlib安装失败&#xff0c;再到模型推理报错。作为踩过所…...

别再只会docker run了!这15个Docker CLI命令,让你效率翻倍(附真实场景案例)

别再只会docker run了&#xff01;这15个Docker CLI命令&#xff0c;让你效率翻倍&#xff08;附真实场景案例&#xff09; Docker已经成为现代开发和运维的标配工具&#xff0c;但很多人在日常工作中仍然停留在基础的docker run和docker ps命令上。本文将带你深入15个高效Dock…...

从V模型到敏捷测试:HIL台架如何成为智能汽车软件快速迭代的‘加速器’

从V模型到敏捷测试&#xff1a;HIL台架如何成为智能汽车软件快速迭代的‘加速器’ 在智能汽车软件功能快速上线的背景下&#xff0c;传统的V模型开发流程正面临前所未有的挑战。当软件迭代周期从数月压缩到数周甚至数天时&#xff0c;如何确保每次变更都能得到充分验证&#xf…...

别再手动检查了!用testssl.sh一键扫描你的网站TLS/SSL安全配置(附详细报告解读)

企业级TLS安全巡检实战&#xff1a;用testssl.sh构建自动化漏洞防御体系 当OpenSSL团队在2014年4月7日悄无声息地发布那个仅有12字节的补丁时&#xff0c;恐怕没人想到这个编号CVE-2014-0160的漏洞会掀起互联网安全领域的惊涛骇浪。Heartbleed漏洞犹如一记警钟&#xff0c;让全…...

SAP ABAP 深度剖析:COMMIT WORK 与 ROLLBACK WORK 的异步世界与同步抉择

1. 异步与同步的数据库提交机制 在SAP ABAP开发中&#xff0c;COMMIT WORK和ROLLBACK WORK就像数据库操作的"确认键"和"撤销键"。但很多人不知道的是&#xff0c;标准的COMMIT WORK实际上是个"慢性子"——它采用的是异步更新机制。这就好比你在电…...

微信小程序体验版请求数据失败的3个常见原因及解决方法(附详细排查步骤)

微信小程序体验版请求数据失败的深度排查指南 当你在微信开发者工具中测试一切正常&#xff0c;但发布体验版后却遭遇数据请求失败时&#xff0c;这种落差感会让任何开发者感到沮丧。本文将带你系统梳理微信小程序体验版数据请求失败的三大核心症结&#xff0c;并提供一套完整…...

从Wi-Fi到5G:聊聊ASK、PSK、QAM这些‘老技术’在现代通信里到底怎么用的?

从Wi-Fi到5G&#xff1a;ASK、PSK、QAM这些‘老技术’的现代生存指南 在咖啡馆连Wi-Fi刷视频时&#xff0c;很少有人会想到指尖划过的每个字节都承载着百年通信技术的智慧结晶。当5G基站闪烁着蓝色指示灯时&#xff0c;更少有人意识到其中运行的竟是上世纪中叶诞生的调制算法。…...