如果对 POI组件、Maven依赖不了解的小伙伴,在观看本篇文章之前可以先观看我上一篇文章: Apache组件POI,将图片下载到Excel文件中并导出。 。 本篇文章主要讲解Excel文件如何实现勾选导出。
我们先看一下勾选导出时的入参参数,其中 "exportField" 字段是 List<String> 类型,里面存放着需要导出的字段及其顺序,exportField字段中的值及字段顺序,是前端同事给与。
{
"age":"",
"createDate":"",
"distinct":true,
"exportField":[
"name",
"age",
"id",
"isDeleted",
"remark",
"headPhoto"
],
"id":"",
"isDeleted":"",
"name":""
}
Service层核心代码简单讲解:
/**
* 用户信息 勾选导出
*
* @param paramDTO 用户入参DTO
* @param response response请求
*
* @throws Exception
*
* @author moon 2023/6/27 10:31
*/
@Override
public void exportUser2(UserParamDTO paramDTO, HttpServletResponse response) throws Exception {
Assert.isTrue(!CollectionUtils.isEmpty(paramDTO.getExportField()), ExceptionEnum.Exception_20000.getDesc());
// 1-1、获取列表查询数据
List<UserVO> userVOList = userMapperExt.selectUserByParamDTO(paramDTO);
// 1-2、将 UserVO 转成 UserExportVO
List<UserExportVO> exportVOS = userVOList.stream().map(infoVO -> BeanUtils.convert(infoVO, UserExportVO.class)).collect(Collectors.toList());
//空数据导出不了标题 需要放一个空对象
if (CollectionUtils.isEmpty(exportVOS)) {
exportVOS = new ArrayList<>();
}
// Map<'英文名', '中文名'> 组合形式.
Map<String, String> aliasMap = ExcelUtils.getDTOAliasTitle(UserExportVO.class, Constant.BooleanFlag.FALSE);
// 勾选导出关键点:根据入参 "exportField" 中的字段顺序,确定头行标题.
List<String> headerList = new ArrayList<>(paramDTO.getExportField());
// 2-1、创建 工作簿 对象.
Workbook workbook = new XSSFWorkbook();
// 2-2、创建工作表对象
Sheet sheet = workbook.createSheet();
// 设置标题行,第0行.
Row headerRow = sheet.createRow(Constant.Digital.ZERO);
// 获取头部单元格样式
CellStyle headerCellStyle = ExcelUtils.getCellStyle(workbook, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, Constant.Digital.TWO);
// 2-3、设置头部单元格样式
for (int i = 0; i < headerList.size(); i++) {
// 获取中文值
String value = aliasMap.get(headerList.get(i));
Cell cell = headerRow.createCell(i);
// 设置 样式
cell.setCellStyle(headerCellStyle);
// 设置 值
cell.setCellValue(value);
}
// 2-4、填充单元格数据,为方便观看代码,我将图片处理部分删除。
for (int i = 0; i < exportVOS.size(); i++) {
// 创建行对象,从第1行开始。
int rowNum = i + 1;
Row row = sheet.createRow(rowNum);
UserExportVO tempVO = exportVOS.get(i);
// 创建单元格对象(列)并设置值
for (int j = 0; j < headerList.size(); j++) {
Cell cell = row.createCell(j);
Field field = UserExportVO.class.getDeclaredField(headerList.get(j));
// 若属性为私有,需要设置可访问。
field.setAccessible(Constant.BooleanFlag.TRUE);
String fieldValue;
// 判断 field.get(tempVO) 是否为 null
if (Objects.isNull(field.get(tempVO))) {
fieldValue = Constant.CommonlySymbols.EMPTY;
} else {
fieldValue = field.get(tempVO).toString();
}
cell.setCellValue(fieldValue);
}
}
// 将工作簿写入文件中
try {
response = ExcelUtils.getHttpServletResponse(response, Constant.ExcelProperty.USER_EXPORT_NAME);
ServletOutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
} finally {
workbook.close();
}
}
在上述代码块中,通过 List<String> headerList 来接收前端传递的勾选导出字段,并以此来控制Excel文件的标题、标题顺序、单元格数据。
启动服务后,运行结果如下图二所示:
图一
图二
Gitee上的Demo案例: apache-poi-demo ,项目名称:apache-poi-demo .
入口函数:com.moon.poi.service.impl.UserServiceImpl#exportUser2(...)