利用freemarker实现word导出
刚过完年,公司在年前有个需求需要在后台管理端实现word导出与pdf导出,在年前就开始查看资料怎么去写word导出,大部分都是用itext来实现,这次word导出我是用freemarker来实现,麻烦点可能是在需要将其将其文档改成xml然后在改成ftl文件。如果不懂ftl文件语法请去看freemarker语法。这里就不再说了。程序用的是maven ,导入freemarkerjar包
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.20</version></dependency>
因为程序是在公司的程序中没有拆出来就手写下文档构造不截图了
ftl文件是放在了webapp下的WEB-INF/views/ftl下
图片是存放在webapp下的images中
这里的路径是为了方便找文件图片为什么没有放在views下是因为有在做pdf时需要用到,那里需要用到这里的链接访问图片.
因为程序是web端的。路径直接获取的绝对路径
访问程序为
@RequestMapping(value="download",method={RequestMethod.GET,RequestMethod.POST}) public void exportWord( HttpServletRequest request, HttpServletResponse response) throws Exception {Map<String,Object> dateMap=new HashMap<String,Object>();dateMap.put("title","个人简历");dateMap.put("userName","xueyucheng");dateMap.put("userSex","man");dateMap.put("userAge","17");dateMap.put("height","161");dateMap.put("address","handan");dateMap.put("University","ligong");dateMap.put("skill","jineng");dateMap.put("content","asdasasd");String ftlName="test.ftl";String imageName="1.jpg";try { //这里是获得数据 然后在客户端中实现下载,当然如果指定位置下载也可以实现下面的那个方法ByteArrayOutputStream bos= WordUtil.createWord(dateMap, ftlName, request,imageName);/**字节*/WordUtil.renderWord(response, bos.toByteArray(), "123");} catch (Exception e) {logger.error("word导出出错......",e); }}
word导出做成工具类了,直接从工具类中调用
public class WordUtil { /*** 根据模板创建word* @auther fengruiqi* 2017年2月4日 下午10:46:09* @param dataMap 需要展示的数据* @param templateName word模板的名称 比如:test.ftl* @param imageName 图片的名称* */public static ByteArrayOutputStream createWord(Map dataMap,String templateName,HttpServletRequest request,String imageName) throws Exception{String basePath = request.getSession().getServletContext().getRealPath("/");//绝对路径 //创建配置实例 Configuration configuration = new Configuration();//设置编码configuration.setDefaultEncoding("UTF-8");try {//ftl模板文件统一放至 资源文件ftl下面 包下面configuration.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/views/ftl/")); //获取模板 Template template = configuration.getTemplate(templateName);template.setEncoding("utf-8");if(imageName!=null && !imageName.equals("")){/** 图片路径 **/String imagePath =basePath+"/images/"+imageName;/** 将图片转化为**/InputStream in = null;byte[] data = null;try {in = new FileInputStream(imagePath);data = new byte[in.available()];in.read(data);in.close();} catch (Exception e) {throw new Exception(e);}finally {if(in != null){in.close();}}/** 进行base64位编码 **/BASE64Encoder encoder = new BASE64Encoder();/** 图片数据 **/dataMap.put("image",encoder.encode(data));}/* //输出文件File outFile = new File(filePath+File.separator+fileName);//如果输出目标文件夹不存在,则创建if (!outFile.getParentFile().exists()){outFile.getParentFile().mkdirs();}*///将模板和数据模型合并生成文件 // Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));Writer out = new StringWriter(); //生成文件template.process(dataMap, out);String str = out.toString(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //关闭流baos.write(str.getBytes());out.flush();out.close();baos.close();return baos;} catch (Exception e) {throw new Exception(e); }}/*** 处理包含多个图片的word问题* @author fengruiqi* 创建时间 2017年2月6日 下午3:25:59* @param dataMap 要插入的数据* @param templateName ftl名字* @param request* @param imageName 图片组合昵称* @return* @throws Exception*/public static ByteArrayOutputStream createWordContinManyPicture(Map dataMap,String templateName,HttpServletRequest request,List<String> imageName) throws Exception{String basePath = request.getSession().getServletContext().getRealPath("/");//绝对路径 //创建配置实例 Configuration configuration = new Configuration();//设置编码configuration.setDefaultEncoding("UTF-8");try {//ftl模板文件统一放至 资源文件ftl下面 包下面configuration.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/views/ftl/")); //获取模板 Template template = configuration.getTemplate(templateName);template.setEncoding("utf-8");for(String image :imageName){if(image!=null && !image.equals("")){/** 图片路径 **/String imagePath =basePath+"/images/"+image;/** 将图片转化为**/InputStream in = null;byte[] data = null;try {in = new FileInputStream(imagePath);data = new byte[in.available()];in.read(data);in.close();} catch (Exception e) {throw new Exception(e);}finally {if(in != null){in.close();}}/** 进行base64位编码 **/BASE64Encoder encoder = new BASE64Encoder();/** 用图片的名称作为存储图片数据的名称 在页面时应该与改名字对应**/if(image.toLowerCase().contains(".jpg") ){image=StringUtils.remove(image, ".jpg");dataMap.put(image,encoder.encode(data));}else if(image.toLowerCase().contains(".png")){image=StringUtils.remove(image, ".png");dataMap.put(image,encoder.encode(data));}}}/* //输出文件File outFile = new File(filePath+File.separator+fileName);//如果输出目标文件夹不存在,则创建if (!outFile.getParentFile().exists()){outFile.getParentFile().mkdirs();}*///将模板和数据模型合并生成文件 // Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));Writer out = new StringWriter(); //生成文件template.process(dataMap, out);String str = out.toString(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //关闭流baos.write(str.getBytes());out.flush();out.close();baos.close();return baos;} catch (Exception e) {throw new Exception(e); }}/*** 客户端下载word* @author fengruiqi* 创建时间 2017年2月5日 上午1:10:38* @param response* @param bytes* @param filename*/public static void renderWord(HttpServletResponse response, final byte[] bytes, final String filename) { /* initResponseHeader(response, PDF_TYPE); */setFileDownloadHeader(response, filename); if (null != bytes) { try { response.getOutputStream().write(bytes); response.getOutputStream().flush(); } catch (IOException e) { throw new IllegalArgumentException(e); } } } /*** 设置让浏览器弹出下载对话框的Header* @author fengruiqi* 创建时间 2017年2月4日 下午6:58:44* @param response* @param fileName* @param fileType*/public static void setFileDownloadHeader(HttpServletResponse response, String fileName) { try { // 中文文件名支持 String encodedfileName = new String(fileName.getBytes("GBK"), "ISO8859-1"); response.setContentType("application/msword");response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + "\""); } catch (UnsupportedEncodingException e) { } } }
解释下上面那个带多个图片的word导出与导出一个图片的方法其实可以用一个只不过前面的需要将其改成list
当时是没有考虑到多个图片的问题才这样做。多个图片那里处理用的图片的名字生成的图片内容填充到静态模板中。如果有其他好的方法大家一起交流下。在程序中可以指定位置存储或者用浏览器客户端下载保存,看自己的需求了。或者两个方式都可以采用。注意注释的部分。
word导出的难点可能就是在freemarker那里吧其他文件需求还不清楚。所以就导出功能就先做到这里有不清楚的可以交流qq963633167
利用freemarker实现word导出相关推荐
- Java项目中利用Freemarker模板引擎导出--生成Word文档
应邀写的一篇文章:Java项目中利用Freemarker模板引擎导出--生成Word文档 资源下载:https://download.csdn.net/download/weixin_41367523 ...
- Java之利用FreeMarker导出Word实例
开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了-"并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."--这个大笨蛋!谁让他来的啦!她起身用最快的速度冲 ...
- java 如何将word 转换为ftl_Java之利用FreeMarker导出Word实例
开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了..."并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."......这个大笨蛋!谁让他来的啦!她起身用 ...
- 基于freemarker(mht)方式导出带图片的富文本word
需求 批量将包含富文本的页面(含图片)导出为word的压缩包,并将每个页面的附件一同下载,下载的文件夹路径格式我就不展示了,具体页面如下 本次导出采用基于freemarker的word导出.大体上都是 ...
- Java使用freemarker生成word文件
首先声明我的项目是一个web项目,生成的word文件直接通过response响应发送给前端.如果不是web项目的话可以像网上的其他教程一样将生成的word保存在本地. 要利用freemarker生成w ...
- java利用freemarker导出含有list的数据到word,有demo可供下载
java利用freemarker导出含有list的数据到word,有demo可供下载 前言 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子 ...
- 利用freemarker模板引擎进行word导出
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现 ...
- Java中利用freemarker模板动态生成word含表格
最近公司有导出word的需求,由于word的样式有的很复杂所以记录一下Java中利用freemarker模板动态生成word含表格,以防以后忘记. 1.word表格的模板 删掉无用的数据留下基础的样式 ...
- java生成docx_java利用Freemarker模板生成docx格式的word文档
之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...
最新文章
- 比特币核心(BCE)或许并没有你想象的强大
- 洛谷P1939 【模板】矩阵加速(数列)
- C_C++指针指针应用详解
- 马云正传——读书笔记
- jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友搏斗字节码
- ajax get请求成功,成功()函数的AJAX GET请求
- Android横竖屏切换View设置不同尺寸或等比例缩放的自定义View的onMeasure解决方案(2)...
- xamppmysql访问被拒绝_XAMPP中无法开始MySQL的问题
- java方法重载和重载方法_Java中的重载与重载
- 2021/4/2听宫老师演讲有感。
- Java设计模式-代理模式
- Word制作音乐简谱(转)
- 手势解锁java后端设计_Android进阶 - 手势解锁
- 网络分析仪测试线损_网络分析仪测试天线隔离度
- JavaScript代码模拟鼠标自动点击事件
- 多图丨入门必看:万字长文带你轻松了解CRM
- css空心三角形_CSS实现空心三角指示箭头
- Python ---------列表 集合 字典 深浅拷贝
- GitHub 爆赞的 RocketMQ 分布式中间件学习手册,竟一夜下载量破 10W+
- 功能安全标准-ISO26262-3---概念阶段---ASIL(汽车安全完整性等级)等级确定方法