作用及应用场景
根据给定的word文档模版,按照给定的数据进行填充,动态生成word文档;
例如:电子合同、服务报告等
生成样例
word模版文件:
生成后的word文件:
相关知识点
- docx格式的word文档 docx文件是一个基于Office Open XML标准的压缩文件格式,它取代了早期的Microsoft Word文档格式(如.doc)。所以docx本质上是一个压缩文件,其中包含了一个或多个XML文件和一个关系表,这些XML文件存储了文档的文本、样式、图片等内容。在这些文件中,word/document.xml文件扮演着至关重要的角色,它包含了通过Word程序打开docx文件时所看到的内容及结构。可以将其类比为HTML,其中任何内容或结构的变更都会直接反映在用户所看到的文档上。我们在文档中编辑的主要内容都存储在该文件中。
- 在Go语言中,text/template包提供了一个强大的模板机制,可以用于生成文本输出。通过占位符替换的方式利用给定的数据和模版文件,动态生成最终的文本内容。
难点及解决思路
为了方便模版的二次编辑,要求模版文件必须能够在word环境中进行编辑,不能破坏word文档的文件格式;text/template模版进行表格数据替换,需要在模版前后增加{ {range}} { {end}}占位符, 这样会破坏xml文件的格式。需要保证在不破坏word文档的文件格式提前下识别表格数据,并进行数据替换。
解决思路是在占位符上做文章,如果是表格中的数据项,占位符采用{ {.\[列表字段名].\[子字段名]}};通过解析及字符串匹配判断获得包含{ {.\[列表字段名]关键字的tr元素,然后将该tr元素作为该列表项的模版,进行数据填充操作;
需要引用的库
"github.com/beevik/etree"
核心代码
// GetDocumentXmlStr 读取docx文件中的word/document.xml文件
func GetDocumentXmlStr(templateDocxFile string) (string, error) {
xmlFile := "word/document.xml"
// 读取document.xml文件
r, err := zip.OpenReader(templateDocxFile)
if err != nil {
return "", err
}
defer r.Close()
for _, f := range r.File {
if f.Name == xmlFile {
// Open the file
rc, err := f.Open()
if err != nil {
ret