java如何用Freemarker导出word

您所在的位置:网站首页 freemarker导出 java如何用Freemarker导出word

java如何用Freemarker导出word

2022-12-07 01:59| 来源: 网络整理| 查看: 265

前言:

在项目中应该会经常遇到导出word需求,Java中有5种方式导出word:

所用技术 优点 缺点 Jacob 功能强大 代码量大,设置样式繁琐;需要windows平台支持,无法跨平台 Apache POI 读写excel功能强大、操作简单 一般只用它读取word,能够创建简单的word,不能设置样式,功能太少 Java2word 功能强大,操作简单 能满足一般要求,不支持07格式,国人开发的,参考资料较多,需要windows平台支持 iText 功能全,能满足一般要求 不能直接生成或操作doc文档,只能生成rtf格式的文档,rtf也可以用word打开 JSP 操作简单,代码量少 能把当前页面导出简单的word,不能设置样式,美观性差,无法操作word Freemarker 代码量少,样式、内容容易控制,打印不变形,完全符合office标准 需要提前设计好word模板,把需要替换的地方用特殊标记标出来

具体选择哪种方式实现Java导出word,要根据自己的需求和实际情况灵活选择,今天这篇文章主要讲解下java怎么结合freemarker导出word的,我选择freemarker主要因为相对于poi导出word,它更灵活。

正文:

Freemarker导出word的思路是,先把word文件中插入特殊的字符串占位符,另存为xml,然后将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板,编码调用FreeMarker实现文本替换并输出Doc。

一、把插入占位符word文件另存为xml

网上很多说不建议用wps,但是我用的wps发现也没有太大的影响,这是我word制作的表格。

java如何用Freemarker导出word_经验分享

 

然后另存为Word XML文档,把生成的xml放到WEB-INF目录下,我在这个目录下又建了word目录,最后我放到word目录下啦

java如何用Freemarker导出word_经验分享_02

java如何用Freemarker导出word_开发问题_03

 

 直接打开xml会发现,格式很错乱,代码挤到一块了,如下图

java如何用Freemarker导出word_开发问题_04

我们可以通过idea格式化代码的快捷键,把代码格式化下,方便阅读

Ctrl+Alt+L

 

java如何用Freemarker导出word_经验分享_05

 二、引入Freemarker的maven依赖和lombok的依赖

org.freemarker freemarker 2.3.20 org.projectlombok lombok 1.16.18

三、编写模板展示的类和导出的工具类以及测试类代码

 User类

@Data @AllArgsConstructor @NoArgsConstructor public class User { private String name; private String sex; private String age; private String phone; private String email; }

导出的工具类:

public class exportWord { public void export(Map map) { try { Configuration configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); //模板文件配置路径 configuration.setDirectoryForTemplateLoading(new File("F:\\dao\\exportWord\\src\\main\\webapp\\WEB-INF\\word")); configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //文件输出路径,文件名 File outFile = new File("E:\\测试模板.doc"); //扫描模板路径下 模板文件 Template template = configuration.getTemplate("测试模板.xml", "UTF-8"); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"), 10240); template.process(map, out); out.flush(); out.close(); System.out.println("导出完成"); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

 测试类:

public class Test { public static void main(String[] args) { exportWord ew = new exportWord(); Map dataMap = new HashMap(); List list = new ArrayList(); User user1 = new User("ada", "男", "18", "10000000", "[email protected]"); User user2 = new User("ada", "男", "18", "10000000", "[email protected]"); User user3 = new User("ada", "男", "18", "10000000", "[email protected]"); list.add(user1); list.add(user2); list.add(user3); dataMap.put("userList", list); ew.export(dataMap); } }

四、如果数据是集合,需要遍历展示的

 找到 xml文件中 标签 用 标签包裹在内即可

java如何用Freemarker导出word_开发问题_06

java如何用Freemarker导出word_开发问题_07

五、启动测试类,看导出效果

java如何用Freemarker导出word_经验分享_08

六、 常见bug

顺利的话,你应该会出现如下图的bug,你只要格式化代码啦,按照这个错误报的行数,去看下,就知道为什么了,原因是word转xml的时候解析错误啦,需要去手动去调节下

freemarker.core.ParseException: Parsing error in template "测试模板.xml" in line 320, column 48: Encountered "


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3