2019-9-1make_wordTemplate

Sep 1, 2019

Microsoft word 的document.xml 模板生成word-template.docx 过程

需求:生成一个模板word-template.docx ,在nodejs 中匹配对应的模板code,最终生成需求.docx

工具:office word、code IDE。

  1. 首先在word 中修改好我们要的样式。在对应要修改模板文字 的地方,以____代替之。作用是等会生成最终模板的地方,很容易找到。

生成word.docx

  1. 将word.docx 解压成文件夹template

    mac/linux$unzip -o word.docx -d template

    windows$”windows unzip 解决工具路径” -o “word.docx 路径” -d “template 路径”

生成word 的template 目录

  1. template 目录大致介绍

template 目录

重要的目录在框中。

[Content_Types.xml] 是用来描述内部使用的格式说明。

word/document.xml 核心文件,修改的描述就在这。

word/_rels/document.xml.rels 是描述资源文件的relationShip

word/media/ 用来放图片

接下来就是修改成我们的最终模板

  1. 修改word/document.xml

替换模板code 格式我们使用lodash.template —> <%= templateCode %>

修改document.xml

如果是插入jpeg 图片(png/jpg 都可以), 我们可以如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<w:p>
<% _.forEach(images, function(item, index) { %>
<w:r>
<w:rPr>
<w:color w:val="00FF00" />
</w:rPr>
<w:pict>
<v:shape id="_x0000_i1025<%- index %>" o:spt="75" type="#_x0000_t75" style="height:<%- item.height %>pt;width:<%- item.width %>pt;" filled="f" o:preferrelative="t" stroked="f" coordsize="21600, 21600">
<v:path/>
<v:fill on="f" focussize="0,0" />
<v:stroke on="f" joinstyle="miter" />
<v:imagedata r:id="<%- item.rid %>" o:title="" />
<o:lock v:ext="edit" aspectratio="f" />
<w:10:wrap type="none" />
<w:10:anchorlock />
</v:shape>
</w:pict>
</w:r>
<% });%>
</w:p>

这样便可循环插入多张图片啦。

  1. 修改word/_rels/document.xml.rels

这里是用来指定植入的资源(图片)关系。

我们只需在原本存在<Relationships xmls="...xxx">一行下增加新增的rId 资源链接:

1
2
3
4
5
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<% _.forEach(images, function(item, index) { %>
<Relationship Id="<%- item.rid %>" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image<%- index %>.jpeg" />
<% }); %>
<Relationship Id="rId8" ...

document.xml.rels

同时找到这里最大的Id,如Id="rId16", 之后用到。

  1. 修改[Content_Types].xml 增加使用资源ext

这里使用jpeg 图片后缀名,增加一行:<Default Extension="jpeg" ContentType="image/jpeg"/>

Content_Types

如果没有增加该行(或者上面提到的rId 填错),出现问题特点是: WPS能正常打开;office word 提示无法打开Open XML xxx 因为内容存在问题或者文件名可能包含无效字符 文件已损坏,无法打开。

点击了“确定”,接着又提示xxx.docx 中发现无法读取的内容。是否要恢复此文档的内容?如果您信任此文档的来源,请单击“是”,点了“是”之后又能正常浏览。

  1. word/media 文件夹

该文件夹是图片移进来后,rId ++。把图片信息保存到word/document.xml 的同时,将资源链接写进word/_rels/document.xml.rels

  1. 压缩 成word-template.docx 模板文件

zip ../word-template.docx -r .

将word 文件夹下的所有文件使用zip 压缩。名称指定为word-template.docx 模板即打包完毕。

word-template.docx

至此word-template 模板生成完毕。

!!!ATTENTION \
制作最好用Windows 操作系统。如果使用Mac OS 制作,一定要将制作好的文件拖到Windows 虚拟机查看是否多出文件, 如 .DS_Store 文件

上述情况会导致WPS 能正常打开,微软的word 总是提示失败超级bug