数据导出 Excel 实战
作者:卢卡多多
- 2022-10-13 天津
本文字数:2008 字
阅读完需:约 7 分钟
每次都会有一些数据进行导出的操作,可以快速达供用户查看得到具体的图表显示,因为有些数据需要进行统计, 导出的数据一般是 Excel 的类型,这里我们从接口设计到代码实战一条龙服务:
这里我们使用的是 hutool 的 POI 进行导出,我们直接上数据实战导出;
pom.xml 引用
<dependency>
<groupId>com.xiaoleilu</groupId>
<artifactId>hutool-all</artifactId>
<version>3.3.0</version>
</dependency>
复制代码
1. 控制层数据:
@ApiOperation("数据导出")
@Log(operationType = Constants.LogOptEnum.EXPORT)
@PostMapping("/exportData")
public Result exportData(@Valid @RequestBody Data param, HttpServletResponse response) {
List<DataVo> DataList = dataService.exportData(param);
boolean exportExcel = exportExcel(data, response);
if (exportExcel) {
return Result.ok("当前数据导出成功");
} else {
return Result.fail("当前数据导出失败");
}
}
复制代码
2.service 的实现
获取要导出的数据然后将数据导出
/**
* 创建Excel
*
* @return
*/
private boolean exportExcel(List<DataVo> dataList, HttpServletResponse response) {
```
BigExcelWriter writer = (BigExcelWriter) ExcelUtil.getBigWriter();
//增加标题样式
StyleSet style = writer.getStyleSet();
CellStyle cellStyle = style.getHeadCellStyle();
//-信息
Map<String, List<DataVo>> collect = dataList.stream().collect(Collectors.groupingBy(DataVo::getName));
boolean flag = true;
Set<String> keySet = collect.keySet();
List<String> collNameList = new ArrayList(keySet);
for (int i = 0; i < collNameList.size(); i++) {
//创建的sheet表
String collName = collNameList.get(i);
List<DataVo> predictList = collect.get(collName);
//解决新增Excel表默认新增sheet1的工作表的问题
if (i == 0 && flag && StrUtil.isNotBlank(collName)) {
writer.renameSheet(collName);
flag = false;
for (DataVo n : dataList) {
CollUtil.newArrayList(n);
writer.getStyleSet().setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER); //水平左对齐,垂直中间对齐
writer.setColumnWidth(0, 30); //第1列30px宽
writer.setColumnWidth(1, 30);
writer.setColumnWidth(2, 30);
writer.setColumnWidth(3, 30);
writer.setColumnWidth(4, 30);
writer.setColumnWidth(5, 30);
writer.setColumnWidth(6, 30);
writer.setColumnWidth(7, 30);
writer.setColumnWidth(8, 30);
writer.setColumnWidth(9, 30);
}
//导出列名
extracted(writer);
writer.write(dataList, true);
continue;
}
writer.setSheet(i - 1);
writer.setSheet(collName);
for (DataVo n : dataList) {
CollUtil.newArrayList(n);
writer.getStyleSet().setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER); //水平左对齐,垂直中间对齐
writer.setColumnWidth(0, 30); //第1列30px宽
writer.setColumnWidth(1, 30);
writer.setColumnWidth(2, 30);
writer.setColumnWidth(3, 30);
writer.setColumnWidth(4, 30);
writer.setColumnWidth(5, 30);
writer.setColumnWidth(6, 30);
writer.setColumnWidth(7, 30);
writer.setColumnWidth(8, 30);
writer.setColumnWidth(9, 30);
}
//导出列名
extracted(writer);
writer.write(dataList, true);
}
//out为OutputStream,需要写出到的目标流
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");
this.write(writer, response);
return true;}
复制代码
列表导出
private void extracted(ExcelWriter writer) {
writer.addHeaderAlias("data", "日期");
、、、、、
writer.setOnlyAlias(true);
}
复制代码
关闭数据流
//关闭流
@param write
@param response*/
private void write(ExcelWriter write, HttpServletResponse response) {OutputStream out = null;
try {
out = response.getOutputStream();
write.flush(out);
write.close();
IoUtil.close(out);
} catch (IOException e) {
log.error("数据导出异常", e.getMessage());
} finally {
IoUtil.close(out);
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 6
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/ae062e8b7a0e104f4da528e51】。文章转载请联系作者。
卢卡多多
关注
努力寻找生活答案的旅途者 2020-04-12 加入
公众号:卢卡多多,欢迎一起交流学习 2021年度优质创作者
评论