1.springboot使用jxls
在看此文章之前,请您关注以下文章,下面文章有springboot使用jxls的教程
使用jxls生成多个excel并压缩打包自动下载
2.导出生成连接
基本原理: 在classpath:static/file下生成一个临时的空的文件,然后获得此文件的输出流,然后获取模版(classpath:template/hatangLog.xlsx)的输入流,通过JxlsUtils.exportExcelForFile将数据和模板合成的文件流输入到static下的临时文件
然后将static文件下的文件配制成静态文件,通过链接访问static下面的文件即可
1).生产模板和临时目录
2).配置静态文件
spring:
application:
name: xxx
mvc:
static-path-pattern: /img/**
resources:
static-locations: classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources
3).生成临时文件,将模板流输入到临时文件,并向前端返回文件链接
@PostMapping(value = "/export")
public WebResponse logExport(HttpServletRequest request, @RequestBody Map<String, Object> reqMap) throws Exception {
try {
//通过自己的接口获取数据
WebResponse webResponse = wxHatangLogFeign.export(reqMap);
List<WxHatangLogDto> voList = webResponse.getListData(WxHatangLogDto.class);
//生成索引
voList.forEach(vo -> {
vo.setIndex(voList.indexOf(vo) + 1);
});
//Excel导出配置 获取resources下面的模板
File file = ResourceUtils.getFile("classpath:template/hatangLog.xlsx");
Map<String, Object> map = new HashMap();
map.put("detailList", voList);
File fileOut = ResourceUtils.getFile("classpath:static/file");
fileOut = new File(fileOut.getPath() + "/hatangLog" + ".xls");
// 创建多级目录
if (!fileOut.exists()) {
fileOut.getParentFile().mkdirs();
}
//创建文件
if (!fileOut.exists()) {
fileOut.createNewFile();
}
try (InputStream is = new FileInputStream(file)) {
//通过文件路径获取输出流
try (FileOutputStream fileOs = new FileOutputStream(fileOut.getPath())) {
//开始导出excel
JxlsUtils.exportExcelForFile(is, fileOs, map);
}
}
//返回文件连接
return new WebResponse("/img/file/hatangLog" + ".xls");
} catch (Exception e) {
e.printStackTrace();
}
return new WebResponse();
}
public static void exportExcelForFile(InputStream is, FileOutputStream fileOs, Map<String, Object> model) throws IOException {
Context context = PoiTransformer.createInitialContext();
if (model != null) {
for (String key : model.keySet()) {
context.putVar(key, model.get(key));
}
}
JxlsHelper jxlsHelper = JxlsHelper.getInstance();
Transformer transformer = jxlsHelper.createTransformer(is, fileOs);
//获得配置
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
//设置静默模式,不报警告
evaluator.getJexlEngine().setSilent(true);
//函数强制,自定义功能
Map<String, Object> funcs = new HashMap<String, Object>();
funcs.put("utils", new JxlsUtils()); //添加自定义功能
evaluator.getJexlEngine().setFunctions(funcs);
//必须要这个,否者表格函数统计会错乱
jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
}
4).访问后台返回的链接接口
链接:服务器ip:port/img/img/file/hatangLog.xls