【java】根据模板生成word下载

模板准备

首先准备word模板,编辑好后在需要插入变量的地方以${xxx}设置变量,然后另存为2003版本的xml文件(好像老版本word才有)。然后再修改后缀为ftl模板文件。

图片插入

多张图片的插入

<#if listim??>  
<#list listim as listimlist>  
<w:p wsp:rsidR="00682D71" wsp:rsidRDefault="00492E77" wsp:rsidP="00AD0653">  
<w:r>  
<w:rPr>  
<w:rFonts w:hint="fareast" />  
<wx:font wx:val="宋体" />  
</w:rPr>  
<w:t>${listimlist.imgName}</w:t>  
</w:r>  
</w:p>  
<#if listimlist.image??>  
<#list listimlist.image as im>  
<w:p wsp:rsidR="00492E77" wsp:rsidRPr="002D72B0" wsp:rsidRDefault="00372090" wsp:rsidP="00AD0653">  
<w:pPr>  
<w:rPr>  
<w:rFonts w:hint="fareast" /></w:rPr>  
</w:pPr>  
<w:r wsp:rsidRPr="004E4E9E">  
<w:rPr>  
<w:noProof/></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" /><![](file:///C:\Users\fenghere\AppData\Roaming\Tencent\QQTempSys\[LC3U)F{0XCAB)LKNIT0K@G.gif):formulas>  
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />  
<o:lock v:ext="edit" aspectratio="t" />  
<![](file:///C:\Users\fenghere\AppData\Roaming\Tencent\QQTempSys\[LC3U)F{0XCAB)LKNIT0K@G.gif):shapetype>  
<w:binData w:name="${"wordml://0"+listimlist_index+3+"00000"+im_index+1+".png"}" xml:space="preserve">${im}</w:binData>  
<v:shape id="图片 1" o:spid="_x0000_i1025" type="#_x0000_t75" style="width:283.5pt;height:217.5pt;visibility:visible">  
<v:imagedata src="${"wordml://0"+listimlist_index+3+"00000"+im_index+1+".png"}" o:title="" /><![](file:///C:\Users\fenghere\AppData\Roaming\Tencent\QQTempSys\[LC3U)F{0XCAB)LKNIT0K@G.gif):shape>  
</w:pict>  
</w:r>  
</w:p>  
</#list>  
</#if>  
</#list>  
</#if>

图片转化为base64的编码

File file = new File(imgFile);  
if(!file.exists())return "";  
byte[] data = null;  
InputStream in = null;  
Encoder encoder = Base64.getEncoder();  
try {  
    in = new FileInputStream(file);  
    data = new byte[in.available()];  
    in.read(data);  
    in.close();  
} catch (IOException e) {  
    throw e;  
}finally {  
    if(in != null) in.close();  
}  
return data != null ? encoder.encodeToString(data) : "";

数据模板结合

使用freemarker的template类,将模板和数据合并成文件(调用process(dataMap, out)方法,)然后输出为word。

dataMap封装的是对应模板里$符号的变量,out是模板文件。