1. 用word写一个需要导出的word模板,然后存为xml格式。
2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如:
1 <w:p wsp:rsidR="00D02906" wsp:rsidRDefault="00FA4C58" wsp:rsidP="00FA4C58">
2 <w:pPr>
3 <w:jc w:val="center"/>
4 <w:rPr>
5 <w:rFonts w:hint="fareast"/>
6 </w:rPr>
7 </w:pPr>
8 <w:r>
9 <w:t>${year}</w:t>
10 </w:r>
11 <w:r>
12 <w:rPr>
13 <wx:font wx:val="宋体"/>
14 </w:rPr>
15 <w:t>年度工作报告</w:t>
16 </w:r>
2 <w:pPr>
3 <w:jc w:val="center"/>
4 <w:rPr>
5 <w:rFonts w:hint="fareast"/>
6 </w:rPr>
7 </w:pPr>
8 <w:r>
9 <w:t>${year}</w:t>
10 </w:r>
11 <w:r>
12 <w:rPr>
13 <wx:font wx:val="宋体"/>
14 </w:rPr>
15 <w:t>年度工作报告</w:t>
16 </w:r>
17 </w:p>
3. 用代码生成:
1 import freemarker.template.Configuration;
2 import freemarker.template.Template;
3
4 import java.io.*;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 /**
9 * @Class name: CreateDoc
10 * <p/>
11 * Short description on the purpose of the program.
12 * @author : youfeng
13 * @modified : 8/29/11
14 */
15 public class CreateDoc {
16
17 private Configuration configuration = null;
18
19 public CreateDoc() {
20 configuration = new Configuration();
21 configuration.setDefaultEncoding("utf-8");
22 }
23
24 public void create() throws Exception {
25 Map<String, Object> map = new HashMap<String, Object>();
26 map.put("date", "2011");
27 map.put("modifyDate", "2011/8/29");
28 map.put("modifyUser", "Zhu You Feng");
29
30 configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
31 Template t = configuration.getTemplate("doc1.ftl");
32 File outFile = new File("D:/outFile.doc");
33 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
34 t.process(map, out);
35 }
36
37 public static void main(String[] args) throws Exception {
38 new CreateDoc().create();
39
40 }
41 }
2 import freemarker.template.Template;
3
4 import java.io.*;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 /**
9 * @Class name: CreateDoc
10 * <p/>
11 * Short description on the purpose of the program.
12 * @author : youfeng
13 * @modified : 8/29/11
14 */
15 public class CreateDoc {
16
17 private Configuration configuration = null;
18
19 public CreateDoc() {
20 configuration = new Configuration();
21 configuration.setDefaultEncoding("utf-8");
22 }
23
24 public void create() throws Exception {
25 Map<String, Object> map = new HashMap<String, Object>();
26 map.put("date", "2011");
27 map.put("modifyDate", "2011/8/29");
28 map.put("modifyUser", "Zhu You Feng");
29
30 configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
31 Template t = configuration.getTemplate("doc1.ftl");
32 File outFile = new File("D:/outFile.doc");
33 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
34 t.process(map, out);
35 }
36
37 public static void main(String[] args) throws Exception {
38 new CreateDoc().create();
39
40 }
41 }
添加图片
如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码:
1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">iVBORw0…(很省略很省略)…CC</w:binData>
只要将base64的代码替换成例如:${image},如下:
1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">${image}</w:binData>
这里要注意“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。
然后用代码生成:
1 import freemarker.template.Configuration;
2 import freemarker.template.Template;
3 import sun.misc.BASE64Encoder;
4
5 import java.io.*;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 /**
10 * @Class name: CreateDoc
11 * @author: youfeng
12 * @modified: 8/29/11
13 */
14 public class CreateDocWithImage {
15
16 private Configuration configuration = null;
17
18 public CreateDocWithImage() {
19 configuration = new Configuration();
20 configuration.setDefaultEncoding("utf-8");
21 }
22
23 public void create() throws Exception {
24 Map<String, Object> map = new HashMap<String, Object>();
25 map.put("year", "2011");
26 map.put("person", "Zhu You Feng");
27 map.put("image", getImageStr());
28
29 configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
30 Template t = configuration.getTemplate("doc2.ftl");
31 File outFile = new File("D:/outFile.doc");
32 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
33 t.process(map, out);
34 }
35
36 private String getImageStr() {
37 String imgFile = "d:/test.jpg";
38 InputStream in = null;
39 byte[] data = null;
40 try {
41 in = new FileInputStream(imgFile);
42 data = new byte[in.available()];
43 in.read(data);
44 in.close();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 BASE64Encoder encoder = new BASE64Encoder();
49 return encoder.encode(data);
50 }
51
52 public static void main(String[] args) throws Exception {
53 new CreateDocWithImage().create();
54
55 }
56 }
2 import freemarker.template.Template;
3 import sun.misc.BASE64Encoder;
4
5 import java.io.*;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 /**
10 * @Class name: CreateDoc
11 * @author: youfeng
12 * @modified: 8/29/11
13 */
14 public class CreateDocWithImage {
15
16 private Configuration configuration = null;
17
18 public CreateDocWithImage() {
19 configuration = new Configuration();
20 configuration.setDefaultEncoding("utf-8");
21 }
22
23 public void create() throws Exception {
24 Map<String, Object> map = new HashMap<String, Object>();
25 map.put("year", "2011");
26 map.put("person", "Zhu You Feng");
27 map.put("image", getImageStr());
28
29 configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
30 Template t = configuration.getTemplate("doc2.ftl");
31 File outFile = new File("D:/outFile.doc");
32 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
33 t.process(map, out);
34 }
35
36 private String getImageStr() {
37 String imgFile = "d:/test.jpg";
38 InputStream in = null;
39 byte[] data = null;
40 try {
41 in = new FileInputStream(imgFile);
42 data = new byte[in.available()];
43 in.read(data);
44 in.close();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 BASE64Encoder encoder = new BASE64Encoder();
49 return encoder.encode(data);
50 }
51
52 public static void main(String[] args) throws Exception {
53 new CreateDocWithImage().create();
54
55 }
56 }
自定义载入模板
1 import freemarker.cache.TemplateLoader;
2 import freemarker.template.Configuration;
3 import freemarker.template.Template;
4 import freemarker.template.TemplateException;
5 import sun.misc.BASE64Encoder;
6
7 import java.io.*;
8 import java.util.HashMap;
9 import java.util.Map;
10
11 public class DocumentGenerator {
12 private Configuration configuration = null;
13
14 public static void main(String[] args) throws Exception {
15 Map<String, Object> map = new HashMap<String, Object>();
16 map.put("date", "2012");
17 map.put("modifyDate", "2011/8/29");
18 map.put("modifyUser", "Zhu You Feng");
19 new DocumentGenerator().createDoc("", "D:/outFile2.doc", map);
20 }
21
22 public DocumentGenerator() {
23 configuration = new Configuration();
24 configuration.setDefaultEncoding("utf-8");
25 configuration.setClassicCompatible(true);
26 configuration.setTemplateLoader(new ByteArrayStreamTemplateLoader(new ByteArrayInputStream(
27 getBytesFromFile(new File("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"))
28 )));
29 }
30
31 /**
32 * @param fileName
33 * @param outFileName
34 * @param dataMap
35 */
36 public void createDoc(String fileName, String outFileName, Map dataMap) {
37 Template t = null;
38 try {
39 t = configuration.getTemplate(fileName);
40 } catch (IOException e) {
41 e.printStackTrace();
42 }
43 File outFile = new File(outFileName);
44 Writer out = null;
45 try {
46 out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
47 } catch (FileNotFoundException e1) {
48 e1.printStackTrace();
49 }
50 try {
51 t.process(dataMap, out);
52 } catch (TemplateException e) {
53 e.printStackTrace();
54 } catch (IOException e) {
55 e.printStackTrace();
56 }
57 }
58
59 public byte[] getBytesFromFile(File f) {
60 if (f == null) {
61 return null;
62 }
63 try {
64 FileInputStream stream = new FileInputStream(f);
65 ByteArrayOutputStream out = new ByteArrayOutputStream(1000);
66 byte[] b = new byte[1000];
67 int n;
68 while ((n = stream.read(b)) != -1)
69 out.write(b, 0, n);
70 stream.close();
71 out.close();
72 return out.toByteArray();
73 } catch (IOException e) {
74 e.printStackTrace();
75 }
76 return null;
77 }
78 }
79
80
81 class ByteArrayStreamTemplateLoader implements TemplateLoader {
82
83 InputStream in = null;
84
85 public ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
86 in = inputStream;
87 }
88
89 public Object findTemplateSource(String name) throws IOException {
90 System.out.println("findTemplateSource");
91 return in;
92 }
93
94 public long getLastModified(Object templateSource) {
95 return 0;
96 }
97
98 public Reader getReader(Object templateSource, String encoding) throws IOException {
99 System.out.println("getReader");
100 return new InputStreamReader(in);
101 }
102
103 public void closeTemplateSource(Object templateSource) throws IOException {
104 System.out.println("closeTemplateSource");
105 if (in != null) {
106 in.close();
107 }
108 }
109 }
3 import freemarker.template.Template;
4 import freemarker.template.TemplateException;
5 import sun.misc.BASE64Encoder;
6
7 import java.io.*;
8 import java.util.HashMap;
9 import java.util.Map;
10
11 public class DocumentGenerator {
12 private Configuration configuration = null;
13
14 public static void main(String[] args) throws Exception {
15 Map<String, Object> map = new HashMap<String, Object>();
16 map.put("date", "2012");
17 map.put("modifyDate", "2011/8/29");
18 map.put("modifyUser", "Zhu You Feng");
19 new DocumentGenerator().createDoc("", "D:/outFile2.doc", map);
20 }
21
22 public DocumentGenerator() {
23 configuration = new Configuration();
24 configuration.setDefaultEncoding("utf-8");
25 configuration.setClassicCompatible(true);
26 configuration.setTemplateLoader(new ByteArrayStreamTemplateLoader(new ByteArrayInputStream(
27 getBytesFromFile(new File("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"))
28 )));
29 }
30
31 /**
32 * @param fileName
33 * @param outFileName
34 * @param dataMap
35 */
36 public void createDoc(String fileName, String outFileName, Map dataMap) {
37 Template t = null;
38 try {
39 t = configuration.getTemplate(fileName);
40 } catch (IOException e) {
41 e.printStackTrace();
42 }
43 File outFile = new File(outFileName);
44 Writer out = null;
45 try {
46 out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
47 } catch (FileNotFoundException e1) {
48 e1.printStackTrace();
49 }
50 try {
51 t.process(dataMap, out);
52 } catch (TemplateException e) {
53 e.printStackTrace();
54 } catch (IOException e) {
55 e.printStackTrace();
56 }
57 }
58
59 public byte[] getBytesFromFile(File f) {
60 if (f == null) {
61 return null;
62 }
63 try {
64 FileInputStream stream = new FileInputStream(f);
65 ByteArrayOutputStream out = new ByteArrayOutputStream(1000);
66 byte[] b = new byte[1000];
67 int n;
68 while ((n = stream.read(b)) != -1)
69 out.write(b, 0, n);
70 stream.close();
71 out.close();
72 return out.toByteArray();
73 } catch (IOException e) {
74 e.printStackTrace();
75 }
76 return null;
77 }
78 }
79
80
81 class ByteArrayStreamTemplateLoader implements TemplateLoader {
82
83 InputStream in = null;
84
85 public ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
86 in = inputStream;
87 }
88
89 public Object findTemplateSource(String name) throws IOException {
90 System.out.println("findTemplateSource");
91 return in;
92 }
93
94 public long getLastModified(Object templateSource) {
95 return 0;
96 }
97
98 public Reader getReader(Object templateSource, String encoding) throws IOException {
99 System.out.println("getReader");
100 return new InputStreamReader(in);
101 }
102
103 public void closeTemplateSource(Object templateSource) throws IOException {
104 System.out.println("closeTemplateSource");
105 if (in != null) {
106 in.close();
107 }
108 }
109 }
相关推荐
### 使用Freemarker生成Word文档的关键技术点解析 #### 一、引言 在实际工作中,经常需要批量生成带有特定格式或数据填充的Word文档,如报表、合同、通知等。传统的手工创建方法效率低下且易出错。利用Java语言...
### 使用FreeMarker生成Word文档 1. **配置FreeMarker**:首先,需要在项目中引入FreeMarker的依赖,例如通过Maven或Gradle添加对应的依赖库。然后,配置FreeMarker的环境,包括设置模板目录、缓存策略等。 2. **...
Java 利用 Freemarker 生成 Word.pdf,这个标题告诉我们,我们将使用 Java 语言和 Freemarker 库来生成 Word 文档,并将其导出为 PDF 文件。 描述解释 在描述中,我们可以看到,整个过程可以分为三步:首先,我们...
使用freemarker生成word ,并集成struts2 同时生成及下载文档 资料附有Java源代码和自己总结的使用说明及注意事项 大至预览如下: 1、用word编辑好模板 普通字符串替换为 ${string} 表格循环用标签 姓名:${...
3. 使用Freemarker生成Word文档 - 创建Freemarker模板:首先,我们需要创建一个`.ftl`文件,定义好Word文档的结构和样式,使用Freemarker语法(例如`${expression}`)来表示需要动态填充的部分。 - 解析XML数据:...
在Java中使用Freemarker生成Word文档的过程主要包括以下几个步骤: 1. **环境配置**:首先,你需要在项目中引入必要的库,包括Apache POI用于处理Word文档,以及Freemarker库。在Maven项目中,可以在pom.xml文件中...
Springboot项目中: 1. 使用Apache POI 3.9 自定义样式导出Excel文件...2. 使用freemarker动态生成word .doc文档(带图片Word以及复杂格式word) 详细说明见个人博客及 github: https://github.com/DuebassLei/excel-poi
4. **生成Word文档**:使用`Template`对象的`process()`方法,传入数据模型和输出流,FreeMarker会根据模板和数据生成Word文档。生成的文档通常以`.doc`或`.docx`格式保存。 5. **处理复杂Word文档**:虽然...
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出‘.doc’ word文档。经测试这样方式生成的word文档完全符合office标准,...
freemarker生成word文档模板,配合文档使用,效果更佳。https://blog.csdn.net/xueshuiyy/article/details/86748009
本篇文章将深入探讨如何使用FreeMarker生成Word文档。 1. FreeMarker 概述: FreeMarker 是一个基于模板的Java库,它允许开发者通过模板语言将数据模型与HTML、XML或其他文本格式分离。模板是纯文本文件,包含控制...
总结来说,通过Java-Freemarker生成Word文档的关键步骤包括:创建Word模板、转换为XML、编辑XML模板,以及使用Freemarker的模板引擎将数据注入XML模板生成最终的Word文档。这个过程大大简化了动态生成Word文档的复杂...
2. **使用Freemarker生成Word文档**: 为了使用Freemarker生成Word文档,开发者通常会创建一个HTML模板,该模板包含Word文档的结构和占位符。然后,使用Freemarker API将数据模型与模板结合,生成HTML,最后再转换...
3. 使用Freemarker API加载模板,绑定数据模型,生成Word文档。 4. 使用JFreeChart生成图表并保存为图片文件。 5. 在生成的Word文档中,确保图表图像正确显示。 最后,压缩包中的"FreemarkerWord"可能包含了以下...
在这个示例中,我们将深入探讨如何使用Freemarker根据XML模板生成Word文档。 首先,你需要了解Freemarker的基本概念。Freemarker是一个基于模板的语言,它的核心是模板文件,模板文件中包含了一系列控制结构(如...
在Java中,生成Word文档通常借助于Apache POI库,而FreeMarker则作为模板引擎,负责数据和模板的结合。Apache POI提供API来操作Word文档,包括创建表格、插入图片等。FreeMarker则可以将动态数据与预先设计好的Word...
Freemarker + XML 生成word 文档 。具体步骤先用word做好模板,然后另存为xml 2003 版本的,修改后缀为.ftl文件。在文件中加入需要处理的循环标签 。一般是在开始的前面。
最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用freemarker模板生成word文档。里面包括完整代码和所需jar包。