一、创建模板
1、将word文档另存为xml格式文件。
2、格式化xml文件
找一个可以格式化xml文件的在线网站,用记事本或者notepad之类的软件,复制文件内容去格式化,然后把格式化好的内容覆盖到原xml文件中。
3、将xml文件后缀改为ftl,然后修改部分文件内容为可供程序填充的模板
4、修改ftl模板文件
打开ftl文件,修改<w:t></w:t>标签内的内容
如果有需要循环的需求,如果word中需要生成一个表格,则在<w:tr></w:tr>标签外增加标签<#list 。。。></#list>
二、引入依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.27-incubating</version>
</dependency>
三、代码
1、定义模板对象
package com.entity;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: yiwenli
* @Description: 恶劣天气导出word模板对象
* @Date: 2022/4/11
*/
@Data
public class BadWeatherWordTemplate {
/**
* 恶劣天气主要影响地区
*/
private String areaList;
/**
* 地区总的线路跳闸情况
*/
AreaLinePowerOutageDetail totalLinePowerOutageDetail = new AreaLinePowerOutageDetail();
/**
* 地区110kV及以下线路跳闸及非计停明细
*/
List<AreaLinePowerOutageDetail> areaLinePowerOutageDetailList = new ArrayList<>();
}
2、FreeMarker模板转换工具类
package com.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
* @Author: yiwenli
* @Description: FreeMarker模板转换工具
* @Date: 2022/4/12
*/
@Service
public class TemplateParseUtil {
@Autowired
private Configuration config;
/**
* 解析模板,将模板数据放入后生成目标文件
*
* @param templateDirPath 模板目录地址
* @param templateFileName 模板名称
* @param outFilePathName 输出的文件路径 包含名称
* @param dataMap 模板数据参数
*/
public File parse(String templateDirPath, String templateFileName, String outFilePathName, Map<String,Object> dataMap) {
File outFile = new File(outFilePathName);
try(Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8))) {
config.setDirectoryForTemplateLoading(new File(templateDirPath));
// 文件名,并且设置编码
Template template = config.getTemplate(templateFileName, "UTF-8");
if(template != null) {
template.process(dataMap, out);
}
out.flush();
} catch (IOException | TemplateException e) {
e.printStackTrace();
}
return outFile;
}
/**
* 下载文件
*
* @param outFile 源文件
* @param fileName 下载后的文件名
* @param deleteSource 是否删除源文件
* @param responseContentType 内容类型
*/
public boolean download(File outFile, String fileName, Boolean deleteSource, String responseContentType, HttpServletResponse response) {
try (ServletOutputStream outputStream = response.getOutputStream();
InputStream input = new FileInputStream(outFile)) {
byte[] bytes = new byte[input.available()];
int read = input.read(bytes);
if (read > 0) {
response.setContentType(responseContentType);
response.setCharacterEncoding("UTF-8");
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
outputStream.write(bytes);
outputStream.flush();
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
if(deleteSource) {
outFile.delete();
}
}
}
}
3、模板数据写入,模板生成后下载
/**
* 恶劣天气导出 Word文档
*
* @param startTime 查询开始时间
* @param endTime 查询结束时间
* @param loginUser 登录用户
*/
public void badWeatherExportWord(String startTime, String endTime, LoginUser loginUser, HttpServletResponse response) {
// 用户ID
String userId = loginUser.getId();
// 所属调度机构ID
String orgId = loginUser.getOrgId();
// 查询模板数据并封装
BadWeatherWordTemplate badWeatherWordTemplate = getBadWeatherDataForWord(startTime, endTime, orgId);
// 模板名称
String templateFileName = "恶劣天气影响电网运行情况模板.ftl";
// 输出文件路径
String outFilePathName = Constant.TEMPLATE_DIR_PATH + "恶劣天气影响电网运行情况模板" + userId + System.currentTimeMillis() + ".doc";
// 模板数据
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("badWeatherWordTemplate", badWeatherWordTemplate);
// 文件名称
String fileName = badWeatherWordTemplate.getTitleDateStr() + "恶劣天气影响电网运行情况[1].doc";
// 解析模板,将模板数据放入后生成目标文件
File outFile = templateParseUtil.parse(Constant.TEMPLATE_DIR_PATH, templateFileName, outFilePathName, dataMap);
// 下载文件
templateParseUtil.download(outFile, fileName, true, "application/x-www-form-urlencoded", response);
}
4、前端方法调用
function badWeatherExportSubmit() {
let url = `${config.url}/operate/badWeatherExport`
let form = $('<form></form>').attr('action', url).attr('method', 'post');
form.append($('<input>').attr('type', 'hidden').attr('name', 'loginUserJson').attr('value', JSON.stringify(loginUser)));
form.append($('<input>').attr('type', 'hidden').attr('name', 'startTime').attr('value', $('#startTime').val()));
form.append($('<input>').attr('type', 'hidden').attr('name', 'endTime').attr('value', $('#endTime').val()));
form.append($('<input>').attr('type', 'hidden').attr('name', 'type').attr('value', type));
form.appendTo('body').submit();
form.remove();
}