“mitao”
2026-03-25 309b5eb17c510c781daec96bbfef3b693f3a4d7e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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<JSONObject> categories = (List<JSONObject>) 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 = RenderHelper.highLevelColor(errors);
                                for(var error : errors){
                                    var e = (JSONObject) error;
                                    var row = table.insertNewTableRow(table.getRows().size());
                                    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(table.getRows().size());
                                    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);
        }
    }
 
    /*
     * 问题汇总表
     * 主要差异是需要合并第0列的相同内容
     */
    private void renderErrors(List<JSONObject> 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);
    }
}