package com.estate.expert.admin.stat.report.render; import com.alibaba.fastjson.JSONObject; import com.deepoove.poi.policy.DynamicTableRenderPolicy; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.springframework.util.CollectionUtils; import java.util.List; /** * 这里循环渲染表格 * */ public class CheckInfoTablePolicy extends DynamicTableRenderPolicy { /** * 渲染检查信息表格 * @param table 表格 * @param data 数据 * @throws Exception 异常 */ @Override public void render(XWPFTable table, Object data) throws Exception { if(data == null) return; List categories = (List) data; int headerRowIndex = table.getRow(0).getTableCells().size() == 1 ? 1 : 0; var title = table.getRow(0).getCell(0).getText(); boolean isErrorSummary = title.contains("问题汇总表") || title.contains("问题清单"); if(isErrorSummary){ // renderErrors(categories, table); } int colCnt = table.getRow(headerRowIndex).getTableCells().size(); String colTitle = table.getRow(headerRowIndex).getCell(1).getText(); int errorSummaryInsertIndex = headerRowIndex + 1; for(var category : categories) { var checkInfos = category.getJSONArray("分项"); for(var checkInfo : checkInfos) { var info = (JSONObject) checkInfo; switch (colCnt) { case 2: { // 分项得分结果,去掉权重/评价列后只保留名称与得分 var row = table.insertNewTableRow(table.getRows().size() - 1); RenderHelper.renderCell(row, info.getString("类别")); RenderHelper.renderCell(row, renderScore(info)); }break; case 3: { if(colTitle.equals("分项")) { // 检查问题分布,去掉百分比列 var row = table.insertNewTableRow(table.getRows().size() -1); RenderHelper.renderCell(row, info.getString("序号")); RenderHelper.renderCell(row, info.getString("类别")); RenderHelper.renderCell(row, info.getString("问题数量")); } else 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 = RenderHelper.highLevelColor(errors); for(var error : errors){ var e = (JSONObject) error; var row = table.insertNewTableRow(errorSummaryInsertIndex++); var errorLevel = e.getString("隐患等级"); var textColor = RenderHelper.getErrorLevelColor(errorLevel); 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; case 6: { if(isErrorSummary){ // 问题汇总表(新增两列:同类隐患出现频次、检查频次) var errors = info.getJSONArray("问题"); if(!CollectionUtils.isEmpty(errors)){ var highLevelColor = RenderHelper.highLevelColor(errors); for(var error : errors){ var e = (JSONObject) error; var row = table.insertNewTableRow(errorSummaryInsertIndex++); var errorLevel = e.getString("隐患等级"); var textColor = RenderHelper.getErrorLevelColor(errorLevel); RenderHelper.renderCell(row, info.getString("类别"), highLevelColor); RenderHelper.renderCell(row, e.getString("问题部位"), textColor); RenderHelper.renderCell(row, e.getString("问题备注"), textColor); RenderHelper.renderCell(row, e.getString("隐患等级"), textColor); RenderHelper.renderCell(row, String.valueOf(e.getLongValue("同类隐患出现频次")), textColor); RenderHelper.renderCell(row, String.valueOf(e.getLongValue("检查频次")), textColor); } } } }break; default: break; } } } int endRow = table.getRows().size() - 1; if(isErrorSummary && endRow > 3){ RenderHelper.mergeCellsVertically(table, 2, 0); } } private String renderScore(JSONObject info) { if (!info.containsKey("得分")) { return info.getString("模糊得分"); } if (!info.containsKey("总分")) { return info.getString("得分"); } try { var totalScore = Float.parseFloat(info.getString("总分")); if (totalScore <= 0) { return info.getString("得分"); } var normalizedScore = Float.parseFloat(info.getString("得分")) * 100 / totalScore; return String.format("%.2f", normalizedScore); } catch (Exception e) { e.printStackTrace(); return info.getString("得分"); } } /* * 问题汇总表 * 主要差异是需要合并第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); } }