步骤一: 实体类加上@Excel注解
步骤二:通过反射动态设置导出的Excel列名
/**
* 通过反射动态设置导出的Excel列名
*
* @param annotatedColumnName:实体类中被@Excel注解的字段名
* @param annotationFieldName:实体类中被@Excel中注解的属性名
* @param newAnnotationFieldValue:属性的新值
*/
private void setExcelAnnotationValue(String annotatedColumnName, String annotationFieldName, String newAnnotationFieldValue){
try{
Class<AdStatisticalOut> airQualityRankingRespClass = AdStatisticalOut.class;
Field classDeclaredField = airQualityRankingRespClass.getDeclaredField(annotatedColumnName);
Excel excel = classDeclaredField.getAnnotation(Excel.class);
InvocationHandler excelInvocationHandler = Proxy.getInvocationHandler(excel);
Field excelInvocationHandlerField = excelInvocationHandler.getClass().getDeclaredField("memberValues");
excelInvocationHandlerField.setAccessible(true);
Map map = (Map) excelInvocationHandlerField.get(excelInvocationHandler);
map.put(annotationFieldName, newAnnotationFieldValue);
} catch (Exception e) {
e.printStackTrace();
}
}
步骤三:封装实体类导出
@ApiOperation(value = "综合统计Excel导出")
@PostMapping("/exportExcel")
public void exportExcel(HttpServletResponse response,
@RequestBody List<AdStatisticalOut> adStatisticalOutList
) throws IOException {
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename" + URLEncoder.encode("综合统计.xls", "UTF-8"));
// 前端传入需要修改的动态列名称
String tjzbName = adStatisticalOutList.get(0).getTjzbName();
/**
* 修改导出的Excel列名
* @param annotatedColumnName:实体类中被@Excel注解的字段名
* 注解的name属性
* 注解的name属性
*/
setExcelAnnotationValue("tjzb","name",tjzbName);
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("综合统计", "综合统计"), AdStatisticalOut.class, adStatisticalOutList);
// 设置自适应列宽
autoSizeColumn(workbook.getSheet("综合统计"));
workbook.write(response.getOutputStream());
workbook.close();
}