搜索
首页Javajava教程Java用freemarker导出word实用示例

最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子。

一、模板的制作

先用Word做一个模板,如下图:

Java用freemarker导出word实用示例

(注意,上面是有表格的,我设置了边框不可见)然后另存为XML文件,之后用工具打开这个xml文件,有人用firstobject XML Editor感觉还不如notepad++,我这里用notepad++,主要是有高亮显示,和元素自动配对,效果如下:

Java用freemarker导出word实用示例

上面黑色的地方基本是我们之后要替换的地方,比如xytitle替换为${xytitle},对已表格要十分注意,比如选择题下面的表格,我们可以通过54262174ff92260d489e50bb0af8bdea查找来定位,一对54262174ff92260d489e50bb0af8bdeaea58842684d893a8d3d054cb1aaf5820代表一行,也就是一条记录(一道题),我们这里要用一对bbb34a766660e3825c70a425a2125ec39fc13d131a1403f8a03377ed174a3a41来将其包括,以便后续填充数据,具体可参照Freemarker页面语法,例如这里选择题,我们是两行为一条记录,所以要bbb34a766660e3825c70a425a2125ec39fc13d131a1403f8a03377ed174a3a41要包括两行,形如:905cb7fc1250d53854ab5b06ccde973554262174ff92260d489e50bb0af8bdea题号 题目ea58842684d893a8d3d054cb1aaf582054262174ff92260d489e50bb0af8bdea选项ea58842684d893a8d3d054cb1aaf58209fc13d131a1403f8a03377ed174a3a41,然后在这其中找着对应的xzn,xztest,ans1,ans2,ans3,ans4替换为${plan1.xzn},${plan1.xztest},${plan1.ans1},${plan1.ans2},${plan1.ans3},${plan1.ans4},注意这里的table1及plan1命名,table1后续填充数据要用到,其他的替换同理操作,得到效果如下:

Java用freemarker导出word实用示例

保存后,修改后缀名为ftl,至此模板制作完毕。

二、编程实现

这里用到了freemarker-2.3.13.jar包,代码如下:

package common;
  
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;
  
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
  
public class DocumentHandler {
  
 private Configuration configuration = null;
  
 public DocumentHandler() {
  configuration = new Configuration();
  configuration.setDefaultEncoding("utf-8");
 }
  
 public void createDoc(Map<String,Object> dataMap,String fileName) throws UnsupportedEncodingException {
  //dataMap 要填入模本的数据文件
  //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
  //这里我们的模板是放在template包下面
  configuration.setClassForTemplateLoading(this.getClass(), "/template");
  Template t=null;
  try {
   //test.ftl为要装载的模板
   t = configuration.getTemplate("fctestpaper.ftl");
  } catch (IOException e) {
   e.printStackTrace();
  }
  //输出文档路径及名称
  File outFile = new File(fileName);
  Writer out = null;
  FileOutputStream fos=null;
  try {
   fos = new FileOutputStream(outFile);
   OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
   //这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
   //out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
    out = new BufferedWriter(oWriter);
  } catch (FileNotFoundException e1) {
   e1.printStackTrace();
  }
    
  try {
   t.process(dataMap, out);
   out.close();
   fos.close();
  } catch (TemplateException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
    
  //System.out.println("---------------------------");
 }
}

   

然后是准备数据调用就行,代码如下:

package com.havenliu.document;
  
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
  
public class Main {
  
 /**
  * @param args
  * @throws UnsupportedEncodingException
  */
 public static void main(String[] args) throws UnsupportedEncodingException {;
  
  Map<String, Object> dataMap = new HashMap<String, Object>();
  dataMap.put("xytitle", "试卷");
  int index = 1;
  // 选择题
  List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();//题目
  List<Map<String, Object>> list11 = new ArrayList<Map<String, Object>>();//答案
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("xzn", index + ".");
   map.put("xztest",
     "( )操作系统允许在一台主机上同时连接多台终端,多个用户可以通过各自的终端同时交互地使用计算机。");
   map.put("ans1", "A" + index);
   map.put("ans2", "B" + index);
   map.put("ans3", "C" + index);
   map.put("ans4", "D" + index);
   list1.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("fuck", index + ".");
   map1.put("abc", "A" + index);
   list11.add(map1);
  
   index++;
  }
  dataMap.put("table1", list1);
  dataMap.put("table11", list11);
  
  // 填空题
  List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> list12 = new ArrayList<Map<String, Object>>();
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("tkn", index + ".");
   map.put("tktest",
     "操作系统是计算机系统中的一个___系统软件_______,它管理和控制计算机系统中的___资源_________.");
   list2.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("fill", index + ".");
   map1.put("def", "中级调度" + index);
   list12.add(map1);
  
   index++;
  }
  dataMap.put("table2", list2);
  dataMap.put("table12", list12);
  
  // 判断题
  List<Map<String, Object>> list3 = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> list13 = new ArrayList<Map<String, Object>>();
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("pdn", index + ".");
   map.put("pdtest",
     "复合型防火墙防火墙是内部网与外部网的隔离点,起着监视和隔绝应用层通信流的作用,同时也常结合过滤器的功能。");
   list3.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("judge", index + ".");
   map1.put("hij", "对" + index);
   list13.add(map1);
  
   index++;
  }
  dataMap.put("table3", list3);
  dataMap.put("table13", list13);
  
  // 简答题
  List<Map<String, Object>> list4 = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> list14 = new ArrayList<Map<String, Object>>();
  index = 1;
  for (int i = 0; i < 5; i++) {
  
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("jdn", index + ".");
   map.put("jdtest", "说明作业调度,中级调度和进程调度的区别,并分析下述问题应由哪一级调度程序负责。");
   list4.add(map);
  
   Map<String, Object> map1 = new HashMap<String, Object>();
   map1.put("answer", index + ".");
   map1.put("xyz", "说明作业调度,中级调度和进程调度的区别,并分析下述问题应由哪一级调度程序负责。");
   list14.add(map1);
  
   index++;
  }
  dataMap.put("table4", list4);
  dataMap.put("table14", list14);
  
  MDoc mdoc = new MDoc();
  mdoc.createDoc(dataMap, "E:/outFile.doc");
 }
  
}

   

注意上面map中的key必须和模板中的对应,否则会报错。效果如下:

Java用freemarker导出word实用示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多Java用freemarker导出word实用示例相关文章请关注PHP中文网!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
是否有任何威胁或增强Java平台独立性的新兴技术?是否有任何威胁或增强Java平台独立性的新兴技术?Apr 24, 2025 am 12:11 AM

新兴技术对Java的平台独立性既有威胁也有增强。1)云计算和容器化技术如Docker增强了Java的平台独立性,但需要优化以适应不同云环境。2)WebAssembly通过GraalVM编译Java代码,扩展了其平台独立性,但需与其他语言竞争性能。

JVM的实现是什么,它们都提供了相同的平台独立性?JVM的实现是什么,它们都提供了相同的平台独立性?Apr 24, 2025 am 12:10 AM

不同JVM实现都能提供平台独立性,但表现略有不同。1.OracleHotSpot和OpenJDKJVM在平台独立性上表现相似,但OpenJDK可能需额外配置。2.IBMJ9JVM在特定操作系统上表现优化。3.GraalVM支持多语言,需额外配置。4.AzulZingJVM需特定平台调整。

平台独立性如何降低发展成本和时间?平台独立性如何降低发展成本和时间?Apr 24, 2025 am 12:08 AM

平台独立性通过在多种操作系统上运行同一套代码,降低开发成本和缩短开发时间。具体表现为:1.减少开发时间,只需维护一套代码;2.降低维护成本,统一测试流程;3.快速迭代和团队协作,简化部署过程。

Java的平台独立性如何促进代码重用?Java的平台独立性如何促进代码重用?Apr 24, 2025 am 12:05 AM

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

您如何在Java应用程序中对平台特定问题进行故障排除?您如何在Java应用程序中对平台特定问题进行故障排除?Apr 24, 2025 am 12:04 AM

要解决Java应用程序中的平台特定问题,可以采取以下步骤:1.使用Java的System类查看系统属性以了解运行环境。2.利用File类或java.nio.file包处理文件路径。3.根据操作系统条件加载本地库。4.使用VisualVM或JProfiler优化跨平台性能。5.通过Docker容器化确保测试环境与生产环境一致。6.利用GitHubActions在多个平台上进行自动化测试。这些方法有助于有效地解决Java应用程序中的平台特定问题。

JVM中的类加载程序子系统如何促进平台独立性?JVM中的类加载程序子系统如何促进平台独立性?Apr 23, 2025 am 12:14 AM

类加载器通过统一的类文件格式、动态加载、双亲委派模型和平台无关的字节码,确保Java程序在不同平台上的一致性和兼容性,实现平台独立性。

Java编译器会产生特定于平台的代码吗?解释。Java编译器会产生特定于平台的代码吗?解释。Apr 23, 2025 am 12:09 AM

Java编译器生成的代码是平台无关的,但最终执行的代码是平台特定的。1.Java源代码编译成平台无关的字节码。2.JVM将字节码转换为特定平台的机器码,确保跨平台运行但性能可能不同。

JVM如何处理不同操作系统的多线程?JVM如何处理不同操作系统的多线程?Apr 23, 2025 am 12:07 AM

多线程在现代编程中重要,因为它能提高程序的响应性和资源利用率,并处理复杂的并发任务。JVM通过线程映射、调度机制和同步锁机制,在不同操作系统上确保多线程的一致性和高效性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),