package com.ruoyi.errand.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 org.apache.poi.ss.usermodel.Workbook; 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 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 dynamicColumns = new ArrayList<>(); // 5. 生成动态列(2025-2027,每年4个季度) List 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> dataList = new ArrayList<>(); for (int i = 1; i <= 5; i++) { // 生成5行数据 Map 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 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 generateDynamicHeaders(int startYear, int endYear) { List 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; } }