Pu Zhibing
2025-04-22 d138293736414a314467a2641e6116ff263ead48
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
package com.ruoyi.bussiness.utils;
 
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.file.FileUtils;
import org.apache.poi.ss.usermodel.Workbook;
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
 
public class BatchNumberUtils {
 
    private static final String PREFIX = "第";
    private static final String SUFFIX = "批";
 
    /**
     * 生成批次信息
     *
     * @param lastBatchNumber
     * @return
     */
    public static String getBatchNumber(String lastBatchNumber) {
        if (lastBatchNumber == null || !lastBatchNumber.startsWith(PREFIX) || !lastBatchNumber.endsWith(SUFFIX)) {
            return PREFIX + "1" + SUFFIX;
        }
        try {
            // 提取中间的数字
            String numberPart = lastBatchNumber.substring(PREFIX.length(), lastBatchNumber.length() - SUFFIX.length());
            int batchNumber = Integer.parseInt(numberPart);
 
            if (batchNumber < 1 || batchNumber >= 9999) {
                throw new GlobalException("批次数必须在 1 到 9999 之间");
            }
 
            // 计算下一个批次
            return PREFIX + (batchNumber + 1) + SUFFIX;
        } catch (NumberFormatException e) {
            throw new GlobalException("批次中的数字解析失败,请确保格式正确");
        }
    }
 
    public static void main(String[] args) throws Exception {
        // 1. 创建导出参数
        ExportParams exportParams = new ExportParams("动态表头示例", "Sheet1");
 
        // 2. 创建表头
        List<ExcelExportEntity> columnList = new ArrayList<>();
 
        // 3. 添加静态列
        columnList.add(new ExcelExportEntity("编号", "id"));
        columnList.add(new ExcelExportEntity("补偿资金总额(万元)", "totalCompensation"));
        columnList.add(new ExcelExportEntity("25%首付款", "firstPayment"));
        columnList.add(new ExcelExportEntity("过渡补贴", "transitionSubsidy"));
 
        // 4. 创建父级列 "每季度需支付款项(万元)",设置 key 为 "dynamic"
        ExcelExportEntity parentColumn = new ExcelExportEntity("每季度需支付款项(万元)", "dynamic");
        List<ExcelExportEntity> dynamicColumns = new ArrayList<>();
 
        // 5. 生成动态列(2025-2027,每年4个季度)
        List<String> dynamicHeaders = generateDynamicHeaders(2025, 2027);
        for (String header : dynamicHeaders) {
            ExcelExportEntity column = new ExcelExportEntity(header, header);
            column.setFormat("0.00"); // 确保Excel数值格式正确
            dynamicColumns.add(column);
        }
 
        // 6. 关联子列
        parentColumn.setList(dynamicColumns);
        columnList.add(parentColumn);
 
        // 7. 组织数据
        List<Map<String, Object>> dataList = new ArrayList<>();
        for (int i = 1; i <= 5; i++) { // 生成5行数据
            Map<String, Object> row = new HashMap<>();
            row.put("id", i);
            row.put("totalCompensation", 500 + i * 10);
            row.put("firstPayment", 120 + i * 5);
            row.put("transitionSubsidy", 30 + i * 2);
 
            // 新建子Map存放动态列数据
            Map<String, Object> dynamicData = new HashMap<>();
            for (String header : dynamicHeaders) {
                dynamicData.put(header, Math.round(Math.random() * 100 * 100.0) / 100.0); // 存储 Double 类型数据
            }
            // 将子Map以 key "dynamic" 存入 row 中
            row.put("dynamic", dynamicData);
 
            System.out.println("生成数据:" + row); // 调试输出
            dataList.add(row);
        }
 
        // 8. 导出 Excel
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, columnList, dataList);
 
        // 9. 写入文件
        try (FileOutputStream fos = new FileOutputStream("DynamicTable.xlsx")) {
            workbook.write(fos);
        }
        workbook.close();
 
        System.out.println("Excel 导出成功!");
    }
 
    // 生成动态季度时间列
    public static List<String> generateDynamicHeaders(int startYear, int endYear) {
        List<String> headers = new ArrayList<>();
        String[] quarters = {"1月", "4月", "7月", "10月"};
        for (int year = startYear; year <= endYear; year++) {
            for (String quarter : quarters) {
                headers.add(year + "年" + quarter);
            }
        }
        return headers;
    }
}