freemarker自动生成复杂word

本篇只描述一些值得注意的问题:

1.做ftl模板文件时,最好用word2003版本生成xml文件,在开发的时候也要用2003的来测试,确保生成的word文件的兼容性。

2.如果有null的值,要判断空。如:

<#if project.contract.property??>
<w:t>${project.contract.property}</w:t>
<#else>
<w:t/>
</#if>

3.循环插入图片列表时的关键代码,样例展示了根据tyle="width:${certify.image.imageWidth}pt;height:${certify.image.imageHeight}pt平铺图片大小:

<#list project.certifyList as certify>
<w:p wsp:rsidR="00CF27AE" wsp:rsidRDefault="00CF27AE">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="宋体"/>
<wx:font wx:val="宋体"/>
<w:b/>
<w:b-cs/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:hint="fareast"/>
<wx:font wx:val="宋体"/>
<w:b/>
<w:b-cs/>
</w:rPr>
<#if certify.title??>
<w:t>【${certify.title}】</w:t>
</#if>
</w:r>
</w:p>
<w:p wsp:rsidR="006B6431" wsp:rsidRDefault="006B6431">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="宋体"/>
<wx:font wx:val="宋体"/>
<w:b/>
<w:b-cs/>
</w:rPr>
</w:pPr>
</w:p>
<w:p wsp:rsidR="00CF27AE" wsp:rsidRDefault="00CF27AE">
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<w:r>
<w:rPr>
<w:color w:val="000000"/>
<w:lang w:val="EN-US" w:fareast="ZH-CN"/>
</w:rPr>
<w:pict>
<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype>
<w:binData w:name="${"wordml://02000001"+project_index+1+certify_index+1+".png"}">${certify.image.imageData}</w:binData>
<v:shape id="图片 300" o:spid="_x0000_i1025" type="#_x0000_t75" alt="img-508025229-0001"style="width:${certify.image.imageWidth}pt;height:${certify.image.imageHeight}pt;mso-position-horizontal-relative:page;mso-position-vertical-relative:page" o:bordertopcolor="red" o:borderleftcolor="red" o:borderbottomcolor="red" o:borderrightcolor="red">
<v:imagedata src="${"wordml://02000001"+project_index+1+certify_index+1+".png"}" o:title="img-508025229-0001"/>
<w10:bordertop type="single" width="12"/>
<w10:borderleft type="single" width="12"/>
<w10:borderbottom type="single" width="12"/>
<w10:borderright type="single" width="12"/>
</v:shape>
</w:pict>
</w:r>
<w:r>
<w:rPr>
<w:b/>
<w:b-cs/>
<w:color w:val="000000"/>
<w:sz w:val="32"/>
<w:sz-cs w:val="32"/>
</w:rPr>
<w:br w:type="page"/>
</w:r>
</w:p>
</#list>

4.用word2003打开时提示错误,“XML文件test.doc不能打开,因为内容中包含错误。”,但用WPS打开正常。

这个问题找不到原因,但我通过删除<#list>内所有类似标签就正常了:“<aml:annotation aml:id="2" w:type="Word.Bookmark.End"/>”

5.首页不同“<w:titlePg/>”

<w:body>
<wx:sect>
<w:p wsp:rsidR="0063547B" wsp:rsidRDefault="0063547B"/>
<w:sectPr wsp:rsidR="0063547B" wsp:rsidSect="0063547B">
<w:pgSz w:w="11906" w:h="16838"/>
<w:pgMar w:top="1440" w:right="1797" w:bottom="1440" w:left="1797" w:header="851" w:footer="992" w:gutter="0"/>
<w:cols w:space="425"/>
<w:titlePg/>
<w:docGrid w:type="lines" w:line-pitch="312"/>
</w:sectPr>
</wx:sect>
</w:body>
6.奇偶页不同“<w:evenAndOddHeaders/>”

<w:docPr>
<w:view w:val="print"/>
<w:zoom w:percent="100"/>
<w:doNotEmbedSystemFonts/>
<w:bordersDontSurroundHeader/>
<w:bordersDontSurroundFooter/>
<w:proofState w:spelling="clean" w:grammar="clean"/>
<w:attachedTemplate w:val=""/>
<w:defaultTabStop w:val="420"/>
<w:evenAndOddHeaders/>
<w:drawingGridHorizontalSpacing w:val="241"/>
<w:drawingGridVerticalSpacing w:val="163"/>
<w:displayHorizontalDrawingGridEvery w:val="0"/>
<w:displayVerticalDrawingGridEvery w:val="2"/>

7.换行,需要用replace将“\n”替换成freemarker支持的换行

如:

<w:tc>
<w:tcPr>
<w:tcW w:w="1842" w:type="dxa"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p wsp:rsidR="00CF27AE" wsp:rsidRDefault="00CF27AE">
<w:pPr>
<w:spacing w:before-lines="25" w:after-lines="25"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<wx:font wx:val="宋体"/>
<w:color w:val="000000"/>
<w:sz w:val="21"/>
<w:sz-cs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/>
<wx:font wx:val="宋体"/>
<w:color w:val="000000"/>
<w:sz w:val="21"/>
<w:sz-cs w:val="21"/>
<w:lang/>
</w:rPr>
<w:t>${bidding.leader.certificateName2?replace("证","")?replace("\n","</w:t>
</w:r>
</w:p>
<w:p wsp:rsidR=\"00BF0EC5\" wsp:rsidRDefault=\"00BF0EC5\" wsp:rsidP=\"00BF0EC5\">
<w:pPr>
<w:spacing w:before-lines=\"25\" w:after-lines=\"25\"/>
<w:jc w:val=\"center\"/>
<w:rPr>
<w:rFonts w:ascii=\"宋体\" w:h-ansi=\"宋体\" w:cs=\"宋体\"/>
<wx:font wx:val=\"宋体\"/>
<w:color w:val=\"000000\"/>
<w:sz w:val=\"21\"/>
<w:sz-cs w:val=\"21\"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii=\"宋体\" w:h-ansi=\"宋体\" w:cs=\"宋体\" w:hint=\"fareast\"/>
<wx:font wx:val=\"宋体\"/>
<w:color w:val=\"000000\"/>
<w:sz w:val=\"21\"/>
<w:sz-cs w:val=\"21\"/>
<w:lang/>
</w:rPr>
<w:t>")}</w:t>

</w:r>
</w:p>
</w:tc>

8.数字类型需要转换成字符串类型,要用c来转

<#assign index = key_index+1>
<#assign keyStr = sort2Key[index?c]>

8.遍历HashMap,其中key只能是字符串类型

<#assign index = key_index+1>

8.数字类型需要转换成字符串类型,要用c来转

<#list mapTest?keys as key>

mapTest[key]

</#list>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值