java生成word

项目要搞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并下载就完成了

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值