您的位置:首页 > 编程语言 > Java开发

java生成word

2015-07-21 13:33 197 查看
项目要搞word,pdf导出,一开始用itext直接写,可是word内容太复杂,那家伙确实不敢恭维,蛋碎一地,那咋整勒,用模板呗

说明:使用xml模板导出word,使用wps打开的话显示的还是xml,如果项目可以忽略这个问题可以考虑用xml模板导出

①:新建一个word文档,设计好word样式及文件内容,需要动态插入到word中的内容用标签先定义好,另存为xml格式

②:打开xml文件,使用ctrl+F查找${(在编辑word的时候,我已经将需要通过模板加载到文件中的数据定义好了),这个时候可能会碰到一下问题,如:

a:在word中编辑单元格内容为${basicInfo_name}被分割开了(原因可能是在word中写${basicInfo_name}时候带有分隔符)直接将内容中间的部分删除掉即可

b:在word中table如何循环遍历(如果知道熟悉模板操作的话,应该很清楚,这里不啰嗦,自己去百度,循环一行的开头很难找到),在word中<w:tr标签标示一行开始</w:tr>表示一行结束,所以只用在<w:tr标签前面加上<#list **** as ***>,在</w:tr>后面加上</#list>即可

③:将xml文件拷贝到项目中指定目录下,重命名为***.ftl,至此模板的准备工作已完成,现在就是往模板里面填数据了,生成文件写入到输出流了

在对应需要下载的struts中定义文件的相关属性(当然也可以直接通过response返回给客户端)

private InputStream fileIns;
private String fileName;
private Template template;


核心代码:

String fileUrl = ServletActionContext.getServletContext().getRealPath("/template");
File file = new File(fileUrl);
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(file);
cfg.setDefaultEncoding("UTF-8");
cfg.setLocale(Locale.CHINA);
template = cfg.getTemplate("org.ftl","UTF-8");
File outFile = new File("temp.doc");
fos = new FileOutputStream(outFile);
oWriter = new OutputStreamWriter(fos,"UTF-8");
out = new BufferedWriter(oWriter);

template.process(rsmap, out);
fileIns = new FileInputStream(outFile);
fileName = "企业信息_" + DateUtil.toStringNoInterval(new Date(), 8)+ ".doc";
fileName = DownLoadUtil.transFileName(fileName, request);
下载xml配置(struts下载配置)

<action name="*****"
class="com.***.org.action.****"
method="*****">
<result name="success" type="stream">
<param name="contentType">application/vnd.ms-word</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">1024</param>
<param name="inputName">fileIns</param>
</result>
</action>
注意事项:freemarker格式要求非常严格,所以需要确保模板标签必须正常的闭合,另外如果ftl有空的字段,可以用ftl标签取空串如:${nullparam!''}

至此生成word并下载就完成了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: