使用EasyPoi模板时,给满足一定条件的数据添加不同的样式。
给语文成绩高于数学成绩的学生的语文成绩添加红色背景色:
public void excelDownload(Map<String, Object> dataMap, TemplateExportParams params, String fileName, HttpServletResponse response) throws IOException {
try{
OutputStream out = response.getOutputStream();
Workbook workbook = ExcelExportUtil.exportExcel(params, dataMap);
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") );
//获取表格对象
Sheet sheet =workbook.getSheetAt(0);
//表格行数
int lastRowNum = sheet.getLastRowNum();
// 获取列数
int physicalNumberOfCells = sheet.getRow(0).getPhysicalNumberOfCells();
//开始遍历单元格并进行判断是否渲染
for (int i = 3; i <= lastRowNum - 1; i++) {
//获取每行对象
Row row = sheet.getRow(i);
//获取单元格对象
Cell cell = row.getCell(5);
//获取单元格样式对象
CellStyle cellStyle = workbook.createCellStyle();
//保留原有样式
cellStyle.cloneStyleFrom(cell.getCellStyle());
//获取单元格内容对象
Font font = workbook.createFont();
//一定要装入,样式中才会生效
cellStyle.setFont(font);
//获取当前单元格 中的value
double math = Double.valueOf(sheet.getRow(i).getCell(2).getStringCellValue());
double chanese = Double.valueOf(sheet.getRow(i).getCell(3).getStringCellValue());
if (chanses > math) {
//设置单元格背景颜色
cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}
cell.setCellStyle(cellStyle);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workbook.write(baos);
response.setHeader("Content-Length", String.valueOf(baos.size()));
out.write( baos.toByteArray() );
} catch (Exception e) {
log.error("导出失败", JSON.toJSONString(dataMap), e);
}
}
模板如下:
输出结果如下:
保留样式的语句cellStyle.cloneStyleFrom(cell.getCellStyle()),如果没加的话语文分数这一列的样式会初始化(最明显的是边框线没有了)。加上之后字体主题和字号还是与原来不一致,原本是宋体12号,输出结果是Calibri 11号,有没有办法保留原本的字体,求大神指导一下。
参考链接:https://www.cnblogs.com/tiankx/p/13920025.html
原文的示例更具体,有兴趣的可以移步