package com.estate.expert.admin.stat.report.render; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.deepoove.poi.policy.DynamicTableRenderPolicy; import com.estate.expert.admin.domain.exam.record.error.ErrorLevel; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.springframework.util.CollectionUtils; import java.util.List; /** * 这里循环渲染表格 * */ public class CheckInfoTablePolicy extends DynamicTableRenderPolicy { private String colorCommon = "000000"; private String colorP1 = "FF0000"; // 橙色 private String colorP2 = "FF8000"; /** * 渲染检查信息表格 * @param table 表格 * @param data 数据 * @throws Exception 异常 */ @Override public void render(XWPFTable table, Object data) throws Exception { if(data == null) return; List categories = (List) data; var title = table.getRow(0).getCell(0).getText(); boolean isErrorSummary = title.contains("问题汇总表"); if(isErrorSummary){ // renderErrors(categories, table); } int colCnt = table.getRow(1).getTableCells().size(); String colTitle = table.getRow(1).getCell(1).getText(); for(var category : categories) { var checkInfos = category.getJSONArray("分项"); for(var checkInfo : checkInfos) { var info = (JSONObject) checkInfo; switch (colCnt) { case 3: { if(colTitle.equals("分项风险评价")) { //分项评估结果,样式0 var row = table.insertNewTableRow(table.getRows().size()-1); RenderHelper.renderCell(row, info.getString("类别")); RenderHelper.renderCell(row, info.getString("评价")); RenderHelper.renderCell(row, info.getString("模糊得分")); }else { //分项评估结果,样式1 var row = table.insertNewTableRow(table.getRows().size() - 1); RenderHelper.renderCell(row, info.getString("类别")); RenderHelper.renderCell(row, info.getString("权重")); String ns = "-"; try { var totalScore = 100f; if (info.containsKey("总分")) totalScore = Float.parseFloat(info.getString("总分")); var normalizedScore = Float.parseFloat(info.getString("得分")) * 100 / totalScore; ns = String.format("%.2f", normalizedScore); } catch (Exception e) { e.printStackTrace(); } RenderHelper.renderCell(row, ns); } }break; case 4: { if(isErrorSummary){ // 问题汇总表 var errors = info.getJSONArray("问题"); if(!CollectionUtils.isEmpty(errors)){ var highLevelColor = highLevelColor(errors); for(var error : errors){ var e = (JSONObject) error; var row = table.insertNewTableRow(table.getRows().size()); var textColor = colorCommon; var errorLevel = e.getString("隐患等级"); if(errorLevel.equals("一级隐患")){ textColor = colorP1; }else if(errorLevel.equals("二级隐患")){ textColor = colorP2; } RenderHelper.renderCell(row, info.getString("类别"), highLevelColor); RenderHelper.renderCell(row, e.getString("问题部位"), textColor); RenderHelper.renderCell(row, e.getString("问题备注"), textColor); RenderHelper.renderCell(row, e.getString("隐患等级"), textColor); } } }else { // 检查问题分布 var row = table.insertNewTableRow(table.getRows().size() -1); RenderHelper.renderCell(row, info.getString("序号")); RenderHelper.renderCell(row, info.getString("类别")); RenderHelper.renderCell(row, info.getString("问题数量")); RenderHelper.renderCell(row, info.getString("问题百分比")); } }break; default: break; } } } int endRow = table.getRows().size() - 1; if(isErrorSummary && endRow > 3){ RenderHelper.mergeCellsVertically(table, 2, 0); } } /** * 获取最高隐患等级颜色 * @param errorRecords 错误记录 * @return 最高隐患等级颜色 */ private String highLevelColor(JSONArray errorRecords){ var minLevel = ErrorLevel.P4; for(var errorRecord : errorRecords){ var e = (JSONObject) errorRecord; var levelStr = e.getString("隐患等级"); var level = ErrorLevel.getByDesc(levelStr); if(level != null && level.ordinal() < minLevel.ordinal()){ minLevel = level; } } switch (minLevel){ case P1: return colorP1; case P2: return colorP2; default: return colorCommon; } } /* * 问题汇总表 * 主要差异是需要合并第0列的相同内容 */ private void renderErrors(List categories, XWPFTable table){ for(var category : categories) { var checkInfos = category.getJSONArray("分项"); for (var checkInfo : checkInfos) { var info = (JSONObject) checkInfo; var errors = info.getJSONArray("问题"); if(errors != null && !errors.isEmpty()){ for (var error : errors) { var errorInfo = (JSONObject) error; var row = table.insertNewTableRow(table.getRows().size() ); RenderHelper.renderCell(row, errorInfo.getString("项目级别")); RenderHelper.renderCell(row, errorInfo.getString("问题部位")); RenderHelper.renderCell(row, errorInfo.getString("问题描述")); RenderHelper.renderCell(row, errorInfo.getString("隐患等级")); } } } } // 将第0列的连续包含相同内容的单元格合并 RenderHelper.mergeCellsVertically(table, 1, 0); } }