From f1208474f771a1c233d7425c8ed13fbaa0d521ac Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期三, 12 三月 2025 09:35:13 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/5.X' into 5.X --- ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java | 108 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 67 insertions(+), 41 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java index b3f68ed..32fee7a 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java @@ -55,6 +55,7 @@ * 涓嬫媺鍙�夐」 */ private final List<DropDownOptions> dropDownOptions; + private final DictService dictService; /** * 褰撳墠鍗曢�夎繘搴� */ @@ -63,7 +64,6 @@ * 褰撳墠鑱斿姩閫夋嫨杩涘害 */ private int currentLinkedOptionsSheetIndex; - private final DictService dictService; public ExcelDownHandler(List<DropDownOptions> options) { this.dropDownOptions = options; @@ -139,8 +139,8 @@ } else if (everyOptions.getOptions().size() > 10) { // 褰撲竴绾ч�夐」鍙傛暟涓暟澶т簬10锛屼娇鐢ㄩ澶栬〃鐨勫舰寮� dropDownWithSheet(helper, workbook, sheet, everyOptions.getIndex(), everyOptions.getOptions()); - } else if (everyOptions.getOptions().size() != 0) { - // 褰撲竴绾ч�夐」涓暟涓嶄负绌猴紝浣跨敤榛樿褰㈠紡 + } else { + // 鍚﹀垯浣跨敤榛樿褰㈠紡 dropDownWithSimple(helper, sheet, everyOptions.getIndex(), everyOptions.getOptions()); } }); @@ -171,9 +171,23 @@ Sheet linkedOptionsDataSheet = workbook.createSheet(WorkbookUtil.createSafeSheetName(linkedOptionsSheetName)); // 灏嗕笅鎷夎〃闅愯棌 workbook.setSheetHidden(workbook.getSheetIndex(linkedOptionsDataSheet), true); - // 瀹屽杽妯悜鐨勪竴绾ч�夐」鏁版嵁琛� + // 閫夐」鏁版嵁 List<String> firstOptions = options.getOptions(); Map<String, List<String>> secoundOptionsMap = options.getNextOptions(); + + // 閲囩敤鎸夎濉厖鏁版嵁鐨勬柟寮忥紝閬垮厤EasyExcel鍑虹幇鏁版嵁鏃犳硶鍐欏叆鐨勯棶棰� + // Attempting to write a row in the range that is already written to disk + + // 浣跨敤ArrayList璁拌浇鏁版嵁锛岄槻姝贡搴� + List<String> columnNames = new ArrayList<>(); + // 鍐欏叆绗竴琛岋紝鍗崇涓�绾х殑鏁版嵁 + Row firstRow = linkedOptionsDataSheet.createRow(0); + for (int columnIndex = 0; columnIndex < firstOptions.size(); columnIndex++) { + String columnName = firstOptions.get(columnIndex); + firstRow.createCell(columnIndex) + .setCellValue(columnName); + columnNames.add(columnName); + } // 鍒涘缓鍚嶇О绠$悊鍣� Name name = workbook.createName(); @@ -190,28 +204,12 @@ // 璁剧疆鏁版嵁鏍¢獙涓哄簭鍒楁ā寮忥紝寮曠敤鐨勬槸鍚嶇О绠$悊鍣ㄤ腑鐨勫埆鍚� this.markOptionsToSheet(helper, sheet, options.getIndex(), helper.createFormulaListConstraint(linkedOptionsSheetName)); - for (int columIndex = 0; columIndex < firstOptions.size(); columIndex++) { - // 鍏堟彁鍙栦富琛ㄤ腑涓�绾т笅鎷夌殑鍒楀悕 + // 鍒涘缓浜岀骇閫夐」鐨勫悕绉扮鐞嗗櫒 + for (int columIndex = 0; columIndex < columnNames.size(); columIndex++) { + // 鍒楀悕 String firstOptionsColumnName = getExcelColumnName(columIndex); - // 涓�娆″惊鐜槸姣忎竴涓竴绾ч�夐」 - int finalI = columIndex; - // 鏈寰幆鐨勪竴绾ч�夐」鍊� - String thisFirstOptionsValue = firstOptions.get(columIndex); - // 鍒涘缓绗竴琛岀殑鏁版嵁 - Optional.ofNullable(linkedOptionsDataSheet.getRow(0)) - // 濡傛灉涓嶅瓨鍦ㄥ垯鍒涘缓绗竴琛� - .orElseGet(() -> linkedOptionsDataSheet.createRow(finalI)) - // 绗竴琛屽綋鍓嶅垪 - .createCell(columIndex) - // 璁剧疆鍊间负褰撳墠涓�绾ч�夐」鍊� - .setCellValue(thisFirstOptionsValue); - - // 绗簩琛屽紑濮嬶紝璁剧疆绗簩绾у埆閫夐」鍙傛暟 - List<String> secondOptions = secoundOptionsMap.get(thisFirstOptionsValue); - if (CollUtil.isEmpty(secondOptions)) { - // 蹇呴』淇濊瘉鑷冲皯鏈変竴涓叧鑱旈�夐」锛屽惁鍒欏皢瀵艰嚧Excel瑙f瀽閿欒 - secondOptions = Collections.singletonList("鏆傛棤_0"); - } + // 瀵瑰簲鐨勪竴绾у�� + String thisFirstOptionsValue = columnNames.get(columIndex); // 浠ヨ涓�绾ч�夐」鍊煎垱寤哄瓙鍚嶇О绠$悊鍣� Name sonName = workbook.createName(); @@ -222,7 +220,9 @@ linkedOptionsSheetName, firstOptionsColumnName, firstOptionsColumnName, - secondOptions.size() + 1 + // 浜岀骇閫夐」瀛樺湪鍒欒缃负(閫夐」涓暟+1)琛岋紝鍚﹀垯璁剧疆涓�2琛� + Math.max(Optional.ofNullable(secoundOptionsMap.get(thisFirstOptionsValue)) + .orElseGet(ArrayList::new).size(), 1) + 1 ); // 璁剧疆鍚嶇О绠$悊鍣ㄧ殑寮曠敤浣嶇疆 sonName.setRefersToFormula(sonFunction); @@ -235,25 +235,51 @@ // 浜岀骇鍙兘涓昏〃姣忎竴琛岀殑姣忎竴鍒楁坊鍔犱簩绾ф牎楠� markLinkedOptionsToSheet(helper, sheet, i, options.getNextIndex(), helper.createFormulaListConstraint(secondOptionsFunction)); } + } - for (int rowIndex = 0; rowIndex < secondOptions.size(); rowIndex++) { - // 浠庣浜岃寮�濮嬪~鍏呬簩绾ч�夐」 - int finalRowIndex = rowIndex + 1; - int finalColumIndex = columIndex; - - Row row = Optional.ofNullable(linkedOptionsDataSheet.getRow(finalRowIndex)) - // 娌℃湁鍒欏垱寤� - .orElseGet(() -> linkedOptionsDataSheet.createRow(finalRowIndex)); - Optional - // 鍦ㄦ湰绾т竴绾ч�夐」鎵�鍦ㄧ殑鍒� - .ofNullable(row.getCell(finalColumIndex)) - // 涓嶅瓨鍦ㄥ垯鍒涘缓 - .orElseGet(() -> row.createCell(finalColumIndex)) - // 璁剧疆浜岀骇閫夐」鍊� - .setCellValue(secondOptions.get(rowIndex)); + // 灏嗕簩绾ф暟鎹鐞嗕负鎸夎鍖哄垎 + Map<Integer, List<String>> columnValueMap = new HashMap<>(); + int currentRow = 1; + while (currentRow >= 0) { + boolean flag = false; + List<String> rowData = new ArrayList<>(); + for (String columnName : columnNames) { + List<String> data = secoundOptionsMap.get(columnName); + if (CollUtil.isEmpty(data)) { + // 娣诲姞绌哄瓧绗︿覆濉厖浣嶇疆 + rowData.add(" "); + continue; + } + // 鍙栫涓�涓� + String str = data.get(0); + rowData.add(str); + // 閫氳繃绉婚櫎鐨勬柟寮忛伩鍏嶉噸澶� + data.remove(0); + // 璁剧疆鍙互缁х画 + flag = true; + } + columnValueMap.put(currentRow, rowData); + // 鍙互缁х画锛屽垯澧炲姞琛屾暟锛屽惁鍒欑疆涓鸿礋鏁拌烦鍑哄惊鐜� + if (flag) { + currentRow++; + } else { + currentRow = -1; } } + // 濉厖绗簩绾ч�夐」鏁版嵁 + columnValueMap.forEach((rowIndex, rowValues) -> { + Row row = linkedOptionsDataSheet.createRow(rowIndex); + for (int columnIndex = 0; columnIndex < rowValues.size(); columnIndex++) { + String rowValue = rowValues.get(columnIndex); + // 濉厖浣嶇疆鐨勯儴鍒嗕笉娓叉煋 + if (StrUtil.isNotBlank(rowValue)) { + row.createCell(columnIndex) + .setCellValue(rowValue); + } + } + }); + currentLinkedOptionsSheetIndex++; } -- Gitblit v1.9.3