Springboot将数据以模板的形式 存入word
使用前提 先创建word模板(以下是生成方式)
1.首先使用word 创建好你需要的模板 如:
2.将文件另存为xml形式
然后会得到一个xml文件 将后缀改为ftl
生成完成后将模板放到项目的resources下
步入正题
项目引入需要的依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
引入配置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*</include>
<include>*/*</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
</build>
导出数据到word需要用到的工具类
package com.topcom.cpwz.utils;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class DocumentHandler {
private Configuration configuration = null;
public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
public void createDoc() throws IOException {
// 要填入模本的数据文件
Map dataMap = new HashMap<>();
getData(dataMap);
// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
// 这里我们的模板是放在com.ftl包下面
configuration.setClassForTemplateLoading(DocumentHandler.class, "/");
Template t = null;
// 输出文档路径及名称
File outFile = new File("D:/work/test.doc");
Writer out = null;
try {
// test.ftl为要装载的模板
Locale locale = new Locale("zh");
t = configuration.getTemplate("test.ftl", locale, "UTF-8");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));
t.process(dataMap, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 注意dataMap里存放的数据Key值要与模板中的参数相对应
*
* @param dataMap
*/
@SuppressWarnings("unchecked")
private void getData(Map dataMap) {
List<Map<String, Object>> newsList= new ArrayList<>();
for(int i=1;i<=10;i++){
Map<String, Object> map= new HashMap<>();
map.put("one", "进货日期"+i);
map.put("two", "产品名称"+i);
newsList.add(map);
}
dataMap.put("lists",newsList);
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DocumentHandler dh = new DocumentHandler();
dh.createDoc();
System.out.println("end");
}
}
关键步骤(遇到的问题)
解决方式
1.去resources下打开demo.ftl
2.需要自己进行排版(个别快捷键不同,自行百度),排版后找到设置的模板属性名
(在上边word里设置的属性名为${one}、${two})使用搜索找到对应的位置
将 ${one} 修改成 ${one!''}
其他属性同理 在重新运行即可完成。
ps:如果想导出一个集合 请使用下面的四行 将你的代码块包含住。
包含的内容为储存one two 的tr。(就是上边将将 ${one} 修改成 ${one!''}的那块)
然后将${one!''} 修改为 ${list.one!''} 。其他同理!
<#if lists?? && lists?size gt 0>
<#list lists as list>
这里替换成你的代码
</#list>
</#if>
<#if lists?? && lists?size gt 0>
<#list lists as list>
<w:tr w:rsidR="00EB3D52" w:rsidTr="00EB3D52">
<w:tc>
<w:tcPr>
<w:tcW w:w="0" w:type="auto"/>
</w:tcPr>
<w:p w:rsidR="00EB3D52" w:rsidRDefault="009D71D9" w:rsidP="009D71D9">
<w:pPr>
<w:ind w:firstLineChars="200" w:firstLine="420"/>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
</w:rPr>
<w:t>
${list.one!''}
</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="0" w:type="auto"/>
</w:tcPr>
<w:p w:rsidR="00EB3D52" w:rsidRDefault="009D71D9">
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
</w:rPr>
<w:t>${list.two}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
</#if>