1.定义word模板
2.将模板文件另存为xml。很多人都说用wps生成xml会导致格式错乱。说一定要用word生成word 2003 xml,反正我一直用的都是wps生成的。目前遇到的问题只有一个:如果图片有很多的话,转成xml之后可能不太好对应哪张是哪张。两三张的话其实还是ok的。
3.修改xml文件,替换要生成的内容。在这里我用的是TextMate打开的xml,完全没有格式。我会在网页上转一下。大家可以用editplus或者note++打开就不用自己再格式化了。找到word文档中需要替换的文字以 ${**}的形式替换。页眉需要的话也可以用这种方式替换生成。
大框内是整个表格的标签,小框内是我们需要替换的部分。如下图:
最后是图片部分的替换,把看到的一堆base64编码替换掉。
4.将修改好的xml文件直接修改后缀为.ftl,放进项目中。
5.util类
/**
* 根据Doc模板生成word文件
* @param projectname
* @param dataMap 需要填入模板的数据
* @param downloadType 文件名称
*/
public int createDoc(String projectname, Map<String,Object> dataMap,String downloadType,HttpServletResponse response){
int flag =0;
try {
//加载需要装填的模板
Template template=null;
//设置模板装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载。
//加载模板文件,放在util下
configure.setClassForTemplateLoading(this.getClass(), "ftl文件的路径");
//设置异常处理器
configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//定义Template对象,注意模板类型名字与downloadType要一致
template=configure.getTemplate(downloadType+".ftl");
response.setContentType("multipart/form-data");
String filename = projectname +" 个人信息表.doc";
response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(filename.getBytes("GBK"), "iso8859-1") + "\"");
response.setCharacterEncoding("utf-8");//此句非常关键,不然word文档全是乱码
//通过response获取ServletOutputStream对象(out)
PrintWriter out = response.getWriter();
try {
template.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
}
out.close();
flag = 1;
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
将我们要写进模板的数据放进dataMap
//简单文字直接放就可以了
String name = "Nancy";
dataMap.put("name", name);
//表格数据List< List<Object> > sorce = new ArrayList<>() ;
dataMap.put("scorce", sorce);
//图片需要先转成base64字符串,之前的笔记中有写。
dataMap.put("imagedata", imagedata);
6.结果
如果表头需要居中、加粗、且内容按类型显示居中还是居左居右以及隔行显示底色。替换表格时则如下:
<#list wbstable as list>
<w:tr w:rsidR="002A505F" w:rsidRPr="00AD4011" w14:paraId="0A61EC28" w14:textId="77777777" w:rsidTr="00AD4011" >
<#list list as value>
<#if list_index == 0>
<w:trPr>
<w:jc w:val="center"/>
</w:trPr>
<w:tc>
<w:tcPr><w:tcW w:w="4148" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w14:paraId="78B31CB9" w14:textId="29304C54" w:rsidR="002A505F" w:rsidRPr="00AD4011" w:rsidRDefault="00A64DED">
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
<w:b/>
<w:bCs/>
</w:rPr>
<w:t>${value}</w:t>
</w:r>
</w:p>
</w:tc>
<#else>
<w:tc>
<w:tcPr><w:tcW w:w="4148" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:vAlign w:val="center"/>
<#if list_index %2 != 0 >
<w:shd w:val="clear" w:color="auto" w:fill="F2F2F2" />
</#if>
</w:tcPr>
<w:p w14:paraId="78B31CB9" w14:textId="29304C54" w:rsidR="002A505F" w:rsidRPr="00AD4011" w:rsidRDefault="00A64DED">
<#if value_index == 0 || value_index == 1>
<w:pPr>
<w:jc w:val="left"/>
</w:pPr>
<#elseif value_index == 2>
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<#else>
<w:pPr>
<w:jc w:val="right"/>
</w:pPr>
</#if>
<w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/>
<w:r>
<w:t>${value}</w:t>
</w:r>
</w:p>
</w:tc>
</#if>
</#list>
</w:tr>
</#list>
</w:tbl>
结果如下: