前言

最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选择功能强大的freemarker+固定格式之后的wordxml实现导出功能。导出word的代码是可以直接复用的,于是在此贴出,并进行总结,方便大家拿走。

实现过程概览

先在word上,调整好自己想要的样子。然后存为xml文件。保存为freemarker模板,以ftl后缀结尾。将需要替换的变量使用freemarker的语法进行替换。最终将数据准备好,和模板进行渲染,生成文件并返回给浏览器流。

详细的实现过程

准备好word的样式

我们新建一个word,我们应该使用Microsoft office,如果使用wps可能会造成样式有些不兼容。在新建的office中,设置好我们的表格样式。我们的调查问卷涉及到四种类型,单选,多选,填空,简答。我们做出四种类型的示例。

样式没有问题后,我们选择另存为word xml 2003版本。将会生成一个xml文件。

格式化xml,并用freemarker语法替换xml

我们可以先下载一个工具 firstobject xml editor,这个可以帮助我们查看xml,同时方便我们定位我们需要改的位置。
复制过去之后,按f8可以将其进行格式化,左侧是标签,右侧是内容,我们只需要关注w:body即可。

像右侧的调查问卷这个就是个标题,我们实际渲染的时候应该将其进行替换,比如我们的程序数据map中,有title属性,我们想要这里展示,我们就使用语法${title}即可。

freemarker的具体语法,可以参考freemarker的问题,在这里我给出几个简单的例子。
比如我们将所有的数据放置在dataList中,所以我们需要判断,dataList是不是空,是空,我们不应该进行下面的逻辑,不是空,我们应该先循环题目是必须的,答案是需要根据类型进行再次循环的。语法参考文档,这里不再赘述。

程序端引入freemarker

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId>
</dependency>

将我们的flt文件放在resources下的templates下。

后端代码实现

此代码可以复用,在此贴出

public class WordUtils {private static Configuration configuration = null;private static final String templateFolder = WordUtils.class.getClassLoader().getResource("").getPath()+"/templates/word";static {configuration = new Configuration();configuration.setDefaultEncoding("utf-8");try {configuration.setDirectoryForTemplateLoading(new File(templateFolder));} catch (IOException e) {e.printStackTrace();}}/***  @Description:导出word,传入request,response,map就是值,title是导出问卷名,ftl是你要使用的模板名*/public static void exportWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws Exception {Template freemarkerTemplate = configuration.getTemplate(ftlFile);File file = null;InputStream fin = null;ServletOutputStream out = null;try {file = createDocFile(map,freemarkerTemplate);fin = new FileInputStream(file);String fileName = title + ".doc";response.setCharacterEncoding("utf-8");response.setContentType("application/msword");response.setHeader("Content-Disposition", "attachment;filename="+fileName);out = response.getOutputStream();byte[] buffer = new byte[512];  int bytesToRead = -1;while((bytesToRead = fin.read(buffer)) != -1) {out.write(buffer, 0, bytesToRead);}}finally {if(fin != null) fin.close();if(out != null) out.close();if(file != null) file.delete(); }}/***  @Description:创建doc文件*/private static File createDocFile(Map<?, ?> dataMap, Template template) {File file = new File("init.doc");try {Writer writer = new OutputStreamWriter(new FileOutputStream(file), "utf-8");template.process(dataMap, writer);writer.close();} catch (Exception e) {e.printStackTrace();}return file;}}

有了工具类后,我们准备好我们的map数据。map里面的数据大家可以自行定义。然后调用utils中的导出方法即可。

WordUtils.exportWord(request, response, dataMap, "word", "demo.ftl");

结语

至此已经结束了,十分的好用,有疑问的话,可以评论交流。

Freemarker + xml 实现Java导出word相关推荐

  1. freemarker+生成java_Freemarker + xml 实现Java导出word

    搜索热词 前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选择功能强大的freemarker+固定格式之后的wordxml实现导出功能.导出word ...

  2. java导出word的几种方式

    目前来看,java导出word大致有6种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过J ...

  3. java导出word纸张方向_java导出word的几种方式

    目前来看,java导出word大致有6种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过J ...

  4. Freemarker使用mht制作导出word模板

    Freemarker使用mht制作导出word模板 一.制作word导出模板时,我们使用官方的Office Word编辑样式,编辑好之后,另存为mhtml格式,这样我们就可以看到源代码了.注意:创建w ...

  5. Java导出word 图片重复

    Java导出word 需要的库 <dependency><groupId>org.freemarker</groupId><artifactId>fre ...

  6. java_导出_word_[转载]java导出word的5种方式

    在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...

  7. 目前java导出word的6种解决方案

    文章转载自:http://www.cnblogs.com/lcngu/p/5247179.html 最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. ...

  8. 【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)

    本文目录 一.Controller 二.Service 接口类 三.ServiceImpl 实现类 四.Content-Type 类型与MIME Type类型对照表 最近在做一个word导出功能,需求 ...

  9. 【Java用法】使用Java导出word文档的解决方案(适用于Windows电脑)

    目录 实现方式一.通过原生的POI 实现方式二.通过Hutool工具包 步骤1.添加pom依赖 步骤2.编写几行代码 步骤3.启动项目,大功告成 实现的效果 最近在做一个word导出功能,需求非常简单 ...

最新文章

  1. win10 动态磁盘 linux,win10系统动态磁盘改为基本磁盘的方法
  2. android NDK 二、编译方法
  3. 内存溢出分析之工具篇
  4. 只用html5与CSS做一个简单的页面,HTML+CSS基础训练之做一个简单页面的布局
  5. sharepoint2010 SP1 chrome 时常无滚动条
  6. 【SpringBoot】Spring项目中value注解,@Value不能够读取到配置文件的值,无法成功注入值的问题汇总及解决
  7. 常用模块之hashlib,configparser,logging模块
  8. 同理心是通往成功架构的桥梁
  9. 阿里云高级技术专家周晶:基于融合与协同的边缘云原生体系实践
  10. 常见空指针异常及其避免
  11. pytorch加载模型报错RuntimeError: Error(s) in loading state_dict for ResNet:Missing key(s) in stat
  12. 一加手机怎么导出照片_批处理整理安卓手机微信导出的视频和照片
  13. 在ubuntu中使用visual studio code对C/C++文件调试
  14. android系统级别应用开发要点
  15. openGL中Phong 着色
  16. 电脑PE系统无法进入,完整详细解决方案
  17. Day03 数据类型转换
  18. 苹果8wifi找不到服务器,教大家遇到苹果手机iPhone11搜不到无线网怎么解决
  19. android 保存图片到手机相册,并通知相册刷新
  20. JMeter(十三):借用Jmeter连接数据库 ,获取短信验证码

热门文章

  1. 网传的 Spring 大漏洞
  2. 皮一皮:可怜的西瓜...
  3. 皮一皮:中文汉字真是博大精深...
  4. 面试:说说 HTTPS 的工作原理?
  5. 地域面试:先来谈谈对MySQL索引的认识?
  6. post json 提示远程服务器500_解决WinServer2012R2服务器远程提示“参数错误”
  7. java求数组中满足给定和的数对,【加试题】数组a中有50个互异的整数,已按升序排列。给定一个正整数key,寻找数组a中是否有一对数的和等于给定的数key,算法如下:...
  8. mysql怎么执行任务_Mysql怎么定时执行任务
  9. CVPR 2021 更好的Backbone,伯克利谷歌提出BoTNet,精度达84.7%
  10. las数据转pcd并显示