Просмотр исходного кода

fix : 导出时下拉列表BUG修复

18339543638 2 лет назад
Родитель
Сommit
6e6e07d8ee

+ 43 - 9
tr-modules/tr-module-export/src/main/java/cn/tr/module/excel/core/handler/write/CustomRowWriteHandler.java

@@ -141,12 +141,13 @@ public class CustomRowWriteHandler implements RowWriteHandler {
         }
 
         DataValidationHelper dvHelper = sheet.getDataValidationHelper();
-        // 第一级设置DataValidation
-        DataValidationConstraint firstConstraint = dvHelper.createExplicitListConstraint(new ArrayList<String>(cascadeSelectSource.keySet()).toArray(new String[CollectionUtil.size(cascadeSelectSource)]));
-        CellRangeAddressList firstRangeAddressList = new CellRangeAddressList(1, ExcelConstant.MAX_ROW, cascadeParentIndex , cascadeParentIndex );
-        DataValidation firstDataValidation = dvHelper.createValidation(firstConstraint, firstRangeAddressList);
-        firstDataValidation.setSuppressDropDownArrow(true);
-        sheet.addValidationData(firstDataValidation);
+//        // 第一级设置DataValidation
+//        DataValidationConstraint firstConstraint = dvHelper.createExplicitListConstraint(new ArrayList<String>(cascadeSelectSource.keySet()).toArray(new String[CollectionUtil.size(cascadeSelectSource)]));
+//        CellRangeAddressList firstRangeAddressList = new CellRangeAddressList(1, ExcelConstant.MAX_ROW, cascadeParentIndex , cascadeParentIndex );
+//        DataValidation firstDataValidation = dvHelper.createValidation(firstConstraint, firstRangeAddressList);
+//        firstDataValidation.setSuppressDropDownArrow(true);
+//        sheet.addValidationData(firstDataValidation);
+        createDropDownList(sheet,workbook,"hidden"+node.getFieldName(),cascadeParentIndex,new ArrayList<>(cascadeSelectSource.keySet()));
 
         if(StrUtil.isBlank(node.getSubordinateFieldName())){
             return;
@@ -156,9 +157,7 @@ public class CustomRowWriteHandler implements RowWriteHandler {
             return;
         }
         // 剩下的层级设置DataValidation
-        char[] offset = new char[1];
-        offset[0] = (char) ('A'  + cascadeChildIndex - 1);
-        String formulaString = buildFormulaString(new String(offset), 2);
+        String formulaString = buildFormulaString(Hex26.toHex26(cascadeChildIndex), 2);
         XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(formulaString);
         CellRangeAddressList regions = new CellRangeAddressList(1, ExcelConstant.MAX_ROW,cascadeChildIndex,  cascadeChildIndex);
         XSSFDataValidation dataValidationList = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
@@ -166,6 +165,41 @@ public class CustomRowWriteHandler implements RowWriteHandler {
         sheet.addValidationData(dataValidationList);
     }
 
+    /**
+     * 创建下拉列表
+     * @param workbook
+     * @param column
+     */
+    private void createDropDownList(Sheet sheet,Workbook workbook,String sheetName,Integer column,List<String> values){
+        if(CollectionUtil.isEmpty(values)){
+            return;
+        }
+        DataValidationHelper helper = sheet.getDataValidationHelper();
+        Sheet hiddenSheet = workbook.createSheet(sheetName);
+        Name name = workbook.createName();
+        name.setNameName(sheetName);
+        CellRangeAddressList regions = createColumnCellRange(column);
+        for (int i = 0; i < values.size(); i++) {
+            Row row = hiddenSheet.getRow(i);
+            if(row==null){
+                row=hiddenSheet.createRow(i);
+            }
+            row.createCell(0).setCellValue(CollectionUtil.get(values,i));
+        }
+        String refers= sheetName + "!$A$1:$A$"+ CollectionUtil.size(values);
+
+        XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, refers);
+        // 数据有效性对象
+        DataValidationHelper hiddenHelper = hiddenSheet.getDataValidationHelper();
+        DataValidation validation = hiddenHelper.createValidation(constraint, regions);
+        sheet.addValidationData(validation);
+
+        validation.setSuppressDropDownArrow(true);
+        int sheetIndex = workbook.getSheetIndex(hiddenSheet);
+        workbook.setSheetHidden(sheetIndex,true);
+    }
+
+
     private String buildRange(int offset, int startRow, int rowCount) {
         String start = Hex26.toHex26(offset+1);
         return "$" + start + "$" + startRow + ":$" + start + "$" + (startRow + rowCount - 1);