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返回给客户端)
核心代码:
至此生成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并下载就完成了
相关文章推荐
- ActionBarSherlock(一)在Eclipse中如何引入ActionBarSherlock和其Demo
- JAVA SOCKET的I/O 使用
- Java事件处理机制和适配器
- springmvc框架的搭建步骤
- Java GC系列
- spring4 -- web项目指引
- Struts2.3.24框架入门之一环境配置及入门实例HelloWorld
- SpringMVC拦截器
- spring4 -- 基于jdbcTemplate的分页
- spring4 -- JdbcTemplate数据库操作
- springMVC详细配置+Mysql+jdbcTemplate实现分页功能
- dubbo接口address从diamond获取按spring的BeanPostProcessor代理实现
- java.lang.String小测试
- Spring架构使用JdbcTemplate进行数据库功能开发
- Spring AOP在pointcut expression解析表达式 并匹配多个条件
- Spring中的JDBCTemplate使用(非常详细的配置过程)
- Spring JdbcTemplate 使用总结与经验分享
- spring框架学习(六)AOP
- spring框架学习(五)注解
- spring框架学习(四)自动装配