DocTemplateTool - 可根据模板生成word或pdf文件的工具
你是否經(jīng)常遇到這樣的場景:產(chǎn)品運(yùn)營有著大量的報(bào)告需求,或者給客戶領(lǐng)導(dǎo)展現(xiàn)每周的運(yùn)營報(bào)告?這些文檔類的任務(wù)可以交給運(yùn)營同事,他們負(fù)責(zé)文檔排版和樣式,你作為開發(fā)人員你只需要提供數(shù)據(jù)源,和一個(gè)映射表,告訴制作文檔的人哪些字段可供使用。這樣一來分工明確,減少了很多不必要的溝通成本。
Document Template Tool
指定一個(gè)模板生成word或pdf文件
運(yùn)行單元測試以查看示例!
功能 & 特點(diǎn)
- 基于占位符的模板,可繼承原有樣式;
- 支持表格;
- 支持?jǐn)?shù)據(jù)集合;
- 支持圖片;
- 提供Cli版本程序;
- 可擴(kuò)展的接口封裝和組件。
快速開始
使用Cli
進(jìn)入可執(zhí)行文件所在目錄,在命令提示符中運(yùn)行DocTemplateTool.exe
參數(shù)列表:
| 參數(shù) | 含義 | 用法 |
|---|---|---|
| -p | PatternFile | 指定一個(gè)Object文件(Json), 作為數(shù)據(jù)源件 |
| -i | Input | 指定一個(gè)docx文件作為模板 |
| -o | Output | 指定一個(gè)路徑,作為導(dǎo)出目標(biāo) |
| -s | Source | 值為json
|
| -d | Destination | 值為word, pdf
|
| -w | WaitAtEnd | 指定時(shí),程序執(zhí)行完成后,將等待用戶輸入退出 |
| -h | Help | 查看幫助 |
示例
.\wtt.exe -p .\sample\data.json -i .\sample\template.docx -o .\output\test.docx -s json -d word
使用DocTemplateTool.Word類庫
在項(xiàng)目中引用DocTemplateTool.Word
dotnet add package DocTemplateTool.Word
由于Exporter返回的NPOI對象,你需要自行根據(jù)業(yè)務(wù)來處理結(jié)果,以及處理IO異常
byte[] docFileContent;
var docinfo = GetDocInfo(); // 準(zhǔn)備數(shù)據(jù)
var result = Exporter.ExportDocxByObject("D:\\Template.docx", docinfo); //生成NPOI文檔對象
//處理結(jié)果
using (var memoryStream = new MemoryStream())
{
result.Write(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
docFileContent = memoryStream.ToArray();
}
//寫入文件或返回接口
File.WriteAllBytes("D:\\Result.docx", docFileContent);
占位符
占位符是指在模板中的一個(gè)標(biāo)記,用于標(biāo)記需要替換的文本或圖片,
文本占位符的格式為:$字段名稱[附加屬性]$
圖片占位符的格式為:#字段名稱[附加屬性]#
Exporter將掃描文檔中所有占位符,然后根據(jù)占位符的名稱,從數(shù)據(jù)源中獲取對應(yīng)的文本值或圖片內(nèi)容,替換到文檔中。
文本
例如
姓名:$ClientName$
將被替換為
姓名:張三
圖片
確認(rèn)大小
圖片占位符支持附加屬性,用于指定圖片的寬度和高度,格式為:#字段名稱[寬度,高度]#
#Graphic[431,266]#
將被替換為一個(gè)寬度為431,高度為266的圖片,單位為像素。
若不指定寬度和高度,則使用默認(rèn)圖片尺寸556*262。
在Word文檔中,因?yàn)橄袼卮笮∈莻€(gè)相對值,頁面視圖100%時(shí)的大小為實(shí)際像素尺寸,你可以使用截圖工具或標(biāo)尺工具確認(rèn)圖片的大小。
設(shè)置圖片
圖片源支持本地文件和網(wǎng)絡(luò)圖片以及Base64編碼的圖片。
從不同圖片來源生成文檔的示例運(yùn)行如下:
數(shù)據(jù)集合
由于NPOI限制,暫不支持表格的嵌套。
數(shù)據(jù)集合將以表格的形式呈現(xiàn)在文檔中,因此你需要在模板中預(yù)留一個(gè)表格,Exporter將根據(jù)表中單元格的占位符,填充表格各列的內(nèi)容。
包含占位符的行稱之為模板行。
定義
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; }
}
配置模板表格:
默認(rèn)以第二行作為模板行(通常第一行為表頭),你也可以根據(jù)實(shí)際情況跳過表頭,
例如在工資登記表示例中,表頭占兩行的情況下,第三行為模板行,那么你需要在配置中指定模板行的索引為2(索引從0開始)。
$Details[2]$
模板行的樣式將決定表格的樣式,因此你可以在模板行中設(shè)置表格的樣式,例如設(shè)置表格的字體,顏色,大小等。
示例運(yùn)行如下圖:
其他示例
企業(yè)員工健康管理周報(bào)
心電圖報(bào)告
數(shù)據(jù)源
數(shù)據(jù)源支持從哈希表(字典)或?qū)ο笾蝎@取數(shù)據(jù)。
Exporter提供了ExportDocxByDictionary和ExportDocxByObject兩個(gè)方法,分別用于從哈希表和對象中獲取數(shù)據(jù)。
從哈希表中獲取數(shù)據(jù):
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","應(yīng)收款"},
{ "DeptorAmount",0},
{ "LenderAmount",50000}
},
new Dictionary<string, object>(){
{ "Type","銷售收款"},
{ "Name","預(yù)收款"},
{ "DeptorAmount",30000},
{ "LenderAmount",0}
},
new Dictionary<string, object>(){
{ "Type","銷售收款"},
{ "Name","現(xiàn)金"},
{ "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);
從匿名對象中獲取數(shù)據(jù):
var docinfo = new
{
Dept = "XX科技股份有限公司",
Date = DateTime.Now,
Number = "憑 - 202301111",
Details = new List<dynamic>() {
new
{
Type = "銷售收款",
Name = "應(yīng)收款",
DeptorAmount = 0,
LenderAmount = 50000
},
new
{
Type = "銷售收款",
Name = "預(yù)收款",
DeptorAmount = 30000,
LenderAmount = 0
},
new
{
Type = "銷售收款",
Name = "現(xiàn)金",
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);
它們將得到同樣的結(jié)果:
已知問題
作者信息
作者:林小
郵箱:jevonsflash@qq.com
License
The MIT License (MIT)
項(xiàng)目地址
Github:DocTemplateTool
總結(jié)
以上是生活随笔為你收集整理的DocTemplateTool - 可根据模板生成word或pdf文件的工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s-服务网格实战-配置 Mesh(灰
- 下一篇: [WPF]浅析资源引用(pack URI