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<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;
|
}
|
}
|