liujie
2026-05-21 0e5d431f85612bf3abc0515fb6e46e500b5cdfe1
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
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;
 
        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<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);
    }
}