最近做导出word和excel,因为title太复杂,所以结合EasyPoi的模板来导出。将模板文件放到resources/template下,idea里还可以导出,打包之后不能导出,已解决。
1、准备模板
常用的模板指令就参考官方文档:模板 指令介绍
但是再word中使用求和指令“sum: ”不管用,不知道为什么。所以是在代码里计算之后占位到word中。
模板的位置:
word模板:
excel模板:
2、导出代码
/**
* 模板:导出word
* @param template 模板,放在、resources/template下
* @param paramsMap {{参数}}
* @param response web 响应
*/
public void exportWordTemplate(String template, Map<String, Object> paramsMap, HttpServletResponse response) {
InputStream is = this.getClass().getResourceAsStream(template);
exportWordTemplate(is, paramsMap,response);
}
/**
* 模板:导出word
* @param is 模板流,放在、resources/template下
* @param paramsMap {{参数}}
* @param response web 响应
*/
public static void exportWordTemplate(InputStream is, Map<String, Object> paramsMap, HttpServletResponse response) {
String fileName = paramsMap.getOrDefault("fileName", "exportWord").toString()+".docx";
try {
// 文件名
MyXWPFDocument doc = new MyXWPFDocument(is);
WordExportUtil.exportWord07(doc, paramsMap);
// 设置响应体内容类型
response.setContentType("application/octet-stream");
// 添加响应头
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 暴露新添加的响应头
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
//将word文档流输出到输出流中
doc.write(response.getOutputStream());
//关闭流
doc.close();
} catch (Exception e) {
e.printStackTrace();
log.info(e.getMessage());
throw new BusinessException(e.getMessage());
}
}
/**
* 模板:导出excel
* @param is 模板流,放在、resources/template下
* @param paramsMap {{参数}}
* @param response web响应
*/
public static void exportExcelTemplate(InputStream is, Map<String, Object> paramsMap, HttpServletResponse response) {
// 文件名
String fileName = paramsMap.getOrDefault("fileName", "exportExcel").toString() + ".xls";
try {
TemplateExportParams params = new TemplateExportParams();
Workbook workbook = WorkbookFactory.create(is);
params.setTemplateWb(workbook);
Workbook book = ExcelExportUtil.exportExcel(params, paramsMap);
downLoadExcel(fileName,response,book);
}catch (Exception e) {
e.printStackTrace();
log.info(e.getMessage());
throw new BusinessException(e.getMessage());
}
}
/**
* excel下载
*
* @param fileName 下载时的文件名称
* @param response
* @param workbook excel数据
*/
public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
try {
fileName = fileName.contains("xls")?fileName:fileName + ".xlsx";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
workbook.write(response.getOutputStream());
} catch (Exception e) {
throw new IOException(e.getMessage());
}
}
3、调用代码
@PostMapping("/??")
@ApiOperation("word导出")
public void exportWeekReport(@RequestBody @Validated StatisticalParamDTO dto) {
// 获取导出所需的数据
Map<String, Object> params = warningStatisticalService.getExportWeekReportParams(dto);
// 导出word
InputStream is = this.getClass().getResourceAsStream("/template/weekReportExport.docx");
EasyPoiUtil.exportWordTemplate(is, params, httpServletResponse);
}
@GetMapping("/??")
@ApiOperation("excel导出")
public void focusControlStatisticalExport() {
Map<String, Object> params = warningStatisticalService.focusControlStatistical();
InputStream is = this.getClass().getResourceAsStream("/template/focusControlStatistical.xls");
EasyPoiUtil.exportExcelTemplate(is, params, httpServletResponse);
}
4、路径问题
1、报“ No valid entries or contents found, this is not a valid OOXML (Office Open XML) file”错误,在pom.xml中添加:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
<nonFilteredFileExtension>doc</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
2、打包之后找不到路径
因为在static里读取的路径会改变,看了easypoi源码,先在非static方法里读取文件,再把文件流传给esaypoi:
public void exportWordTemplate(String template, Map<String, Object> paramsMap, HttpServletResponse response) {
InputStream is = this.getClass().getResourceAsStream(template);
exportWordTemplate(is, paramsMap,response);
}