导出excel通常使用的是apache poi,但是poi的api相当复杂,所以当导出的excel样式比较复杂时,写起来就比较头疼了,这里推荐使用easypoi, 可以很方便的根据模板来导出复杂excel
文档地址: 1.1 介绍 - Powered by MinDoc
我们要实现如图所示效果,该怎么实现呢
第一步,导入依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>
第二步,新建excel模板,然后写入内容
如果是变量,就用双大括号包裹变量,如果是列表,则使用$fe指令,maplist是变量名,t.id是要输出的字段,最后以t.hdje}}结果表示结束
模板指令文档:EasyPoi教程_V1.0
示例模板下载地址: src/test/resources/WEB-INF/doc/专项支出用款申请书_map.xls · 悟耘开源/easypoi-test - Gitee.com
第三步,获取数据,写入输出流
public class ExportController extends BaseController {
@Operation(summary = "导出支出用款申请书")
@GetMapping("exportPayForm")
public void exportPayForm(HttpServletRequest request, HttpServletResponse response) throws IOException {
TemplateExportParams params = new TemplateExportParams(
"template/专项支出用款申请书_map.xls");
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2014-12-25");
map.put("money", 2000000.00);
map.put("upperMoney", "贰佰万");
map.put("company", "执笔潜行科技有限公司");
map.put("bureau", "财政局");
map.put("person", "JueYue");
map.put("phone", "1879740****");
List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
for (int i = 0; i < 4; i++) {
Map<String, String> lm = new HashMap<String, String>();
lm.put("id", i + 1 + "");
lm.put("zijin", i * 10000 + "");
lm.put("bianma", "A001");
lm.put("mingcheng", "设计");
lm.put("xiangmumingcheng", "EasyPoi " + i + "期");
lm.put("quancheng", "开源项目");
lm.put("sqje", i * 10000 + "");
lm.put("hdje", i * 10000 + "");
listMap.add(lm);
}
map.put("maplist", listMap);
Workbook workbook = ExcelExportUtil.exportExcel(params, map);
addFileHeader(request, response, "专项支出用款申请书.xls", "application/octet-stream");
workbook.write(response.getOutputStream());
}
}
public void addFileHeader(HttpServletRequest request, HttpServletResponse response,
String fileName, String contentType) {
try {
String agent = request.getHeader("USER-AGENT").toLowerCase();
response.setContentType(contentType);
String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
if (agent.contains("firefox")) {
response.setCharacterEncoding("utf-8");
response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO8859-1"));
} else {
response.setHeader("content-disposition", "attachment;filename=" + codedFileName);
}
} catch (Exception e) {
e.printStackTrace();
}
}