基于Freemarker和xml如何实现Java导出单词

  

这篇文章主要讲解了基于Freemarker和xml如何实现Java导出word,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

前言

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

实现过程概览

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

详细的实现过程准备好word的样式

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

基于Freemarker和xml如何实现Java导出word

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

基于Freemarker和xml如何实现Java导出word

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

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

基于Freemarker和xml如何实现Java导出word

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

基于Freemarker和xml如何实现Java导出word

freemarker的具体语法,可以参考freemarker的问题,在这里我给出几个简单的例子。

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

程序端引入freemarker


  & lt; groupId> org.freemarker
  & lt; artifactId> freemarker
  & lt;/dependency> 

将我们的外语教学文件放在资源下的模板下。

后端代码实现

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

公共类WordUtils {
  
  私有静态配置配置=零;
  私有静态最终字符串templateFolder=WordUtils.class.getClassLoader () .getResource (“;”) .getPath() +“/模板/word";
  静态{
  配置=new配置();
  configuration.setDefaultEncoding (“utf-8");
  尝试{
  配置。setDirectoryForTemplateLoading(新文件(templateFolder));
  }捕捉(IOException e) {
  e.printStackTrace ();
  }
  }/* *
  * @Description:导出词,传入请求,响应,地图就是值,标题是导出问卷名,ftl是你要使用的模板名
  */公共静态孔隙exportWord (HttpServletRequest请求,HttpServletResponse响应,地图地图,字符串标题、字符串ftlFile){抛出异常
  模板freemarkerTemplate=configuration.getTemplate (ftlFile);
  文件文件=零;
  InputStream鳍=零;
  ServletOutputStream=零;
  尝试{
  文件=createDocFile(地图,freemarkerTemplate);
  鳍=new FileInputStream(文件);
  字符串文件名=标题+“.doc";
  response.setCharacterEncoding (“utf-8");
  response.setContentType(“应用程序/msword");
  response.setHeader (“Content-Disposition",“附件文件名=?
  +文件名);=response.getOutputStream ();
  byte[]新字节缓冲区=[512];
  int bytesToRead=1;
  在((bytesToRead=fin.read(缓冲)!=1){
  出去了。写(缓冲区,0,bytesToRead);
  }
  最后}{
  如果(鳍!=null) fin.close ();
  如果(!=null) out.close ();
  如果(文件!=null) file.delete ();
  }
  }/* *
  * @Description:创建doc文件
  */私有静态文件createDocFile (Map

基于Freemarker和xml如何实现Java导出单词