!666 fix: 模板导出多个字段下拉值超过100个异常,采用多个sheet的方案解决。

* fix: 模板导出多个字段下拉值超过100个异常,采用多个sheet的方案解决。
This commit is contained in:
velenooo 2025-04-02 05:20:53 +00:00 committed by 疯狂的狮子Li
parent 9e551a0b2a
commit 023ceaaf91

View File

@ -291,9 +291,11 @@ public class ExcelDownHandler implements SheetWriteHandler {
* @param value 下拉选可选值 * @param value 下拉选可选值
*/ */
private void dropDownWithSheet(DataValidationHelper helper, Workbook workbook, Sheet sheet, Integer celIndex, List<String> value) { private void dropDownWithSheet(DataValidationHelper helper, Workbook workbook, Sheet sheet, Integer celIndex, List<String> value) {
//由于poi的写出相关问题超过100个会被临时写进硬盘导致后续内存合并会出Attempting to write a row[] in the range [] that is already written to disk
String tmpOptionsSheetName = OPTIONS_SHEET_NAME + "_" + currentOptionsColumnIndex;
// 创建下拉数据表 // 创建下拉数据表
Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))) Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(tmpOptionsSheetName)))
.orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))); .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(tmpOptionsSheetName)));
// 将下拉表隐藏 // 将下拉表隐藏
workbook.setSheetHidden(workbook.getSheetIndex(simpleDataSheet), true); workbook.setSheetHidden(workbook.getSheetIndex(simpleDataSheet), true);
// 完善纵向的一级选项数据表 // 完善纵向的一级选项数据表
@ -302,9 +304,9 @@ public class ExcelDownHandler implements SheetWriteHandler {
// 获取每一选项行如果没有则创建 // 获取每一选项行如果没有则创建
Row row = Optional.ofNullable(simpleDataSheet.getRow(i)) Row row = Optional.ofNullable(simpleDataSheet.getRow(i))
.orElseGet(() -> simpleDataSheet.createRow(finalI)); .orElseGet(() -> simpleDataSheet.createRow(finalI));
// 获取本级选项对应的选项列如果没有则创建 // 获取本级选项对应的选项列如果没有则创建上述采用多个sheet,默认索引为1列
Cell cell = Optional.ofNullable(row.getCell(currentOptionsColumnIndex)) Cell cell = Optional.ofNullable(row.getCell(0))
.orElseGet(() -> row.createCell(currentOptionsColumnIndex)); .orElseGet(() -> row.createCell(0));
// 设置值 // 设置值
cell.setCellValue(value.get(i)); cell.setCellValue(value.get(i));
} }
@ -312,13 +314,13 @@ public class ExcelDownHandler implements SheetWriteHandler {
// 创建名称管理器 // 创建名称管理器
Name name = workbook.createName(); Name name = workbook.createName();
// 设置名称管理器的别名 // 设置名称管理器的别名
String nameName = String.format("%s_%d", OPTIONS_SHEET_NAME, celIndex); String nameName = String.format("%s_%d", tmpOptionsSheetName, celIndex);
name.setNameName(nameName); name.setNameName(nameName);
// 以纵向第一列创建一级下拉拼接引用位置 // 以纵向第一列创建一级下拉拼接引用位置
String function = String.format("%s!$%s$1:$%s$%d", String function = String.format("%s!$%s$1:$%s$%d",
OPTIONS_SHEET_NAME, tmpOptionsSheetName,
getExcelColumnName(currentOptionsColumnIndex), getExcelColumnName(0),
getExcelColumnName(currentOptionsColumnIndex), getExcelColumnName(0),
value.size()); value.size());
// 设置名称管理器的引用位置 // 设置名称管理器的引用位置
name.setRefersToFormula(function); name.setRefersToFormula(function);