之前遇到过一个需求,需要导出一个word的周报,周报的内容是可变,然后网上找了下方法,下面摘抄一种方便的实现手段:

Java用freemarker导出word

一、模板的制作

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

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

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

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

二、编程实现

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

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("---------------------------"); 

    

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

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必须和模板中的对应,否则会报错。

三、项目导入

下载附件后,解压后,看到如下目录

将Document项目导入eclipse即可。导入后的效果如下:

会在e盘生成文件

四、运行效果

打开生成的outFile.doc则看到如下的样子:

五、freemarker语法

Freemarker页面语法:http://blog.csdn.net/thismonth/article/details/5194982

转载:https://www.cnblogs.com/demodashi/p/8458097.html

java实现导出内容不固定的word文档相关推荐

  1. 使用FreeMarker导出固定格式word文档

    使用FreeMarker导出固定格式word文档 一.下载FreeMarker的jar包 下载地址:http://freemarker.org/freemarkerdownload.html,导入项目 ...

  2. Java 导出数据库表信息生成Word文档

    一.前言 最近看见朋友写了一个导出数据库生成word文档的业务,感觉很有意思,研究了一下,这里也拿出来与大家分享一波~ 先来看生成word文档效果吧 下面我们也来一起简单的实现吧 二.Java 导出数 ...

  3. java 导出word换行_Java 导出数据库表信息生成Word文档

    一.前言 最近看见朋友写了一个导出数据库生成word文档的业务,感觉很有意思,研究了一下,这里也拿出来与大家分享一波~ 先来看看生成的word文档效果吧 下面我们也来一起简单的实现吧 二.Java 导 ...

  4. java检查word文档内容缺失_恢复Word文档内容需要了解的知识

    Word文档是每一位电脑用户都有机会接触的文字编辑工具,它对我们的生活有着重要影响,不管是在学习还是在工作上.如果我们遇到了Word文档内容丢失或者Word文档内容乱码的情况,应该怎么解决呢?请继续往 ...

  5. 导出数据库表信息生成Word文档(数据字典)

    平时多积累一些好工具,才能提高工作效率,早点下班 1. 关键字百度 Java 导出数据库表信息生成Word文档 gitee地址 2.拉取,运行 2.1 idea识别.导入maven工具 2.2 下载完 ...

  6. Python实现某du内容下载, 保存到word文档

    前言 今天来点不一样的 用Python实现某du文库vip内容下载, 保存到word文档 前期准备 环境使用 python 3.8 pycharm 模块使用 requests >>> ...

  7. 复制一个Word文档的部分或全部内容到另一个Word文档

    我最近喜欢折腾Office软件相关的东西,想把很多Office软件提供的功能用.NET来实现,如果后期能把它用来开发一点我自己的小应用程序那就更好了. 扯远了,回到正题.复制文档内容这个功能太常见啦, ...

  8. 【Java wrod文档导出 返回浏览器下载读取word文档】文档流转IO流

    在工作当中会有很多奇奇怪怪的需求 比如把数据库数据 导出word文档,在此之前发表过一篇 导出ecxle表格的文章,经过查询资料 发现还是很容易实现的 . 我们一共可以分为两个部分 一.把数据库的数据 ...

  9. Java Itext+jfreehart 导入含有图形的word文档

    今天下午没事,就整合了项目中的导入word文档的代码,因为业务要求要把数据可视化,所以选择了就freechart插件作为画图工具,导入word文档选择的Itext,闲话不多说,直接上代码: jar包: ...

最新文章

  1. 侧链,驱动链,和根链的双向锚定设计
  2. 服务器log文件清理,服务器日志切割清理工具(LogCutter)
  3. ECCV 2020 | 史上最强二值化网络ReActNet,精度首超ResNet
  4. 大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式
  5. php类知识 self $this都只能在当前类中使用
  6. 拿下微软、Google、Adobe,印度为何盛产科技圈 CEO?
  7. android 联系人中,在超大字体下,加入至联系人界面(ConfirmAddDetailActivity)上有字体显示不全的问题...
  8. Python 39 数据库的数据类型
  9. Android xml manifest属性详解
  10. 如何写SCI论文的摘要
  11. 第一门慕课计划——在广东海洋大学推广MOOC学习
  12. 跑步机行业研究及十四五规划分析报告
  13. 牛客网音短视频类sql-4
  14. <RTL coding的艺术> non-constant expression引出的思考
  15. 老弟,来了?VUE+Nuxt.js+Koa+Vuex入门教程(一)仿写一个cnode网站
  16. 合并两个有序数组,合并之后保持有序
  17. CSIRO Detects Raw Materials Used in the Ma IoT PLC accessking of the First Stars
  18. Excel学习——制作周报
  19. Debian系统安装
  20. 图像一阶倒数和二阶导数的区别与联系

热门文章

  1. Sass 你了解了吗
  2. 共享打印机的客机显示脱机怎么解决?
  3. 序列到序列模型(一)(基本模型,RNN Search,注意力机制)
  4. python裁剪不规则区域_Python实现不规则图形填充的思路
  5. ps因计算机限制打不开,电脑突然坏了只有打不开PS这是什么原因在线 – 手机爱问...
  6. PHP 实现精确统计在线人数功能
  7. 2022年版中国共享单车市场现状调研及投资前景预测报告
  8. java砍价源码_(JAVA)仿拼多多砍价算法
  9. 3秒钟解决windows字符间距变大,输入字母间距变大问题
  10. Between 的开始日期和结束日期是同一天没有查询结果,附SQL server数据库的日期时间格式转换大全