最近在使用freemaker做一个word模板,里面包含大量表格、截图、超链接等数据、历时一周多,遇到很多坑,现在想想都后怕,现在简单总结一下,希望给以后的小伙伴提供帮助,少走弯路!
坑一:word打不开
可能原因:
1、往xml文件中添加数据占位时,不细心导致文件中出现多余的{、}、;、#等字符,导致xml校验错误,会导致生成的word打不开。
2、word中有超链接,链接中包含多个参数时,会用&进行连接,然而在xml中&属于特殊字符,如若不处理,导致xml校验错误,会导致生成的word打不开;处理方式有两种如下
第一种:使用CDATA包含此链接,使得xml不解析,比如<![CDATA[www.test.com?param=1&num=2]]>
第二种:将特殊字符转义,&对应的转义为& 其他特殊字符转义可自行去网上查询,转义后的链接就变成www.test.com?param=1&num=2,这种xml是可以解析的。
3、xml校验没有问题(xml校验器https://www.runoob.com/xml/xml-validator.html),此时生成的docx文档,使用wps是可以打开的,但是使用office确打不开,解决方案是直接生成doc格式的文档,这样wps跟office都能打开了,具体原因不详,可能跟freemarker对docx跟doc支持不一样。
坑二:批量添加图片
由于第一次往word文档中加图片,而且是动态批量添加,没有头绪,网上查询了资料也都没有太好的方法,后面想着直接动态循环生成rId,没成想直接成功了,非常开心,但也产生一个新问题,就是图片变形了(下面在详细说),实现方式如下:
往word中加图片,首先在模板中需要插入一个图片进行占位,转换成xml后,关于图片的地方有三点,我自己理解的,描述的可能不太对,见谅!
1、图片的源定义
<Relationship Id="rId99" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image99.jpeg"/>
2、图片的base64码,用变量替换
<pkg:part pkg:name="/word/media/image99.jpeg" pkg:contentType="image/jpeg" pkg:compression="store">
<pkg:binaryData>${img_gqctt!"--"}</pkg:binaryData>
</pkg:part>
3、图片展示
<w:p w:rsidR="005A1D92" w:rsidRDefault="00785A68" w:rsidP="005A1D92">
<w:pPr>
<w:adjustRightInd w:val="0"/>
<w:spacing w:line="360" w:lineRule="auto"/>
<w:contextualSpacing/>
<w:rPr>
<w:rFonts w:ascii="等线" w:eastAsia="等线" w:hAnsi="等线"/>
<w:sz w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="等线" w:eastAsia="等线" w:hAnsi="等线" w:cs="等线" w:hint="eastAsia"/>
<w:bCs/>
<w:noProof/>
<w:sz w:val="24"/>