首页 > 其他分享 >DocTemplateTool - 可根据模板生成word或pdf文件的工具

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

时间:2023-11-07 19:11:48浏览次数:32  
标签:DocTemplateTool docx word 占位 文档 pdf new 模板 图片

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

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);

它们将得到同样的结果:

在这里插入图片描述

已知问题

作者信息

作者:林小

邮箱:[email protected]

License

The MIT License (MIT)

项目地址

Github:DocTemplateTool

标签:DocTemplateTool,docx,word,占位,文档,pdf,new,模板,图片
From: https://www.cnblogs.com/jevonsflash/p/17815705.html

相关文章

  • Word还是markdown?
    Word还是markdown?使用markdown有四五年时间了,有欣喜,也有很过困扰。在这欣喜和困扰之后,我更不知道如何正确的使用markdown了一、我的身份和使用场景多年程序猿转产品两年多,18年开始接触markdown,凭着程序猿的学习干劲,markdown还不是轻轻松松拿下。在后续的工作生活中,经常markdo......
  • 一个PHP版PDF工具FPDF
    一个PHP版PDF工具FPDFThisrepositoryisonlymadeforcloningofficialFPDFreleaseswhichareavailableat:http://www.fpdf.orgTHEREWILLBENODEVELOPMENTINTHISREPOSITORY!FPDFisaPHPclasswhichallowstogeneratePDFfileswithpurePHP.FfromFPDF......
  • 分享一个Python 批量word转图片的方法
    我们的工作场景中每次上传word时都要把word文件先导出图片,然后一一上传系统,因为只有PNG图片能直接预览,且确保文本、图片和格式保持不变。但有时候遇到大的word文档,一个文档导出来可能都有几十张图片,这样效率实在太低。针对这种情况,我们选了Spire.DocforPython批量将word转图片......
  • Word中的“编辑>选择性粘贴>无格式文本”的快捷键
    手工制作无格式粘贴快捷键word2003,在菜单中选“编辑”--“选择性粘贴”--“无格式文本”,这个方法执行速度快,但操作步骤多,太麻烦。下面通过创建宏来解决这个问题,实现快捷键操作。这个过程分两步:一是建立一个实现“选择性粘贴”的宏,二是给这个宏指定键盘快捷键。一、创建“选择性粘贴......
  • 如何在 Word 2003 中恢复丢失的文件
    本文向您介绍可用于恢复丢失的文档的一些步骤。关于:打不开Word文件。搜索原文档单击“开始”,然后单击“搜索”。单击MicrosoftWindows资源管理器左侧的“搜索助理”中的“所有文件和文件夹”。在“全部或部分文件名:”框中,键入要查找的文件名。在“在这里寻找”框中,单击“我......
  • 界面控件DevExpress WPF PDF Viewer,更快实现应用的PDF文档浏览
    DevExpressWPFPDFViewer控件可以轻松地直接在Windows应用程序中显示PDF文档,而无需在最终用户的机器上安装外部PDF查看器。P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应......
  • 基于[email protected]的Vue3 PDF在线预览
    目录认识vue3-pdf-app安装vue3-pdf-app代码子组件封装:PdfView.vue父组件调用:index.vue中文配置文件viewer.properties本文参考来自于CSDN作者theMuseCatcher《Vue3PDF预览(vue3-pdf-app)》认识vue3-pdf-appvue3-pdf-app的npm官方链接点我访问vue3-pdf-app的github仓......
  • BUUCTF_Crypto_WriteUp | password
    题目姓名:张三生日:19900315key格式为key{xxxxxxxxxx}分析标题是password,题目给的是key,猜测key里的内容应该就是张三的密码。题目给key的内容很认真地放了10个x,猜测flag内容是十位字符。而张三的姓名是2个字,给出的生日是8位,咱把姓名缩写和生日一组合,将得到的老......
  • 如何使用Python将PDF转为Excel
    PDF文件是一种静态文档格式,通常难以编辑,而Excel则是一个灵活的表格工具。如果你需要处理PDF表格中的数据,那么将其导出为Excel文件可以大大节省工作时间和精力。Excel提供的强大数据编辑和格式化功能,允许你对转换后的PDF数据进行修改、排序、筛选、计算等操作。同时,你还可以调整单......
  • 如何使用K8S部署wordpress
    要在Kubernetes(K8S)中部署WordPress,您需要以下步骤:配置Kubernetes集群:首先,您需要正确配置Kubernetes集群。这包括设置Kubernetes控制平面和工作节点,并确保它们能够正常通信。创建PersistentVolume和PersistentVolumeClaim:WordPress需要持久存储来保存数据,例如用户上......