Excel导出下拉方案调整
This commit is contained in:
		| @@ -5,8 +5,19 @@ package com.jeelowcode.framework.excel.handler; | |||||||
| import com.alibaba.excel.write.handler.SheetWriteHandler; | import com.alibaba.excel.write.handler.SheetWriteHandler; | ||||||
| import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; | import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; | ||||||
| import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; | import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; | ||||||
| import org.apache.poi.ss.usermodel.CellStyle; | import org.apache.poi.ss.usermodel.*; | ||||||
|  | import org.apache.poi.ss.util.CellRangeAddressList; | ||||||
| import org.apache.poi.xssf.streaming.SXSSFSheet; | import org.apache.poi.xssf.streaming.SXSSFSheet; | ||||||
|  | import org.apache.poi.xssf.streaming.SXSSFWorkbook; | ||||||
|  | import org.apache.poi.xssf.usermodel.XSSFDataValidation; | ||||||
|  | import org.springframework.web.context.request.RequestContextHolder; | ||||||
|  | import org.springframework.web.context.request.ServletRequestAttributes; | ||||||
|  |  | ||||||
|  | import javax.servlet.http.HttpServletRequest; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * |  * | ||||||
| @@ -15,6 +26,12 @@ public class CustomSheetWriteHandler implements SheetWriteHandler { | |||||||
|  |  | ||||||
|     private static final Integer COLUMN = 26; |     private static final Integer COLUMN = 26; | ||||||
|  |  | ||||||
|  |     private Map<Integer, List<String>> dropDownData; | ||||||
|  |  | ||||||
|  |     public CustomSheetWriteHandler(Map<Integer, List<String>> dropDownData){ | ||||||
|  |         this.dropDownData = dropDownData; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { |     public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { | ||||||
|         for (int i = 0; i < COLUMN; i++) { |         for (int i = 0; i < COLUMN; i++) { | ||||||
| @@ -26,5 +43,25 @@ public class CustomSheetWriteHandler implements SheetWriteHandler { | |||||||
|             // i为列,一整列设置为文本格式 |             // i为列,一整列设置为文本格式 | ||||||
|             sxssfSheet.setDefaultColumnStyle(i, cellStyle); |             sxssfSheet.setDefaultColumnStyle(i, cellStyle); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         for (Map.Entry<Integer, List<String>> entry : dropDownData.entrySet()){ | ||||||
|  |             if(entry.getValue().size()>=10){ | ||||||
|  |                 String[] selectValues = entry.getValue().toArray(new String[entry.getValue().size()]); | ||||||
|  |                 /*   解决办法从这里开始   */ | ||||||
|  |                 //获取一个workbook | ||||||
|  |                 Workbook workbook = writeWorkbookHolder.getWorkbook(); | ||||||
|  |                 //定义sheet的名称 | ||||||
|  |                 String hiddenName = "hidden"+entry.getKey(); | ||||||
|  |                 //1.创建一个隐藏的sheet 名称为 hidden | ||||||
|  |                 Sheet hidden = workbook.createSheet(hiddenName); | ||||||
|  |                 //2.循环赋值(为了防止下拉框的行数与隐藏域的行数相对应,将隐藏域加到结束行之后) | ||||||
|  |                 for (int i = 0, length = selectValues.length; i < length; i++) { | ||||||
|  |                     // 3:表示你开始的行数  3表示 你开始的列数 | ||||||
|  |                     hidden.createRow( i).createCell(0).setCellValue(selectValues[i]); | ||||||
|  |                 } | ||||||
|  |                 workbook.setSheetHidden(workbook.getSheetIndex(hidden), true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -81,6 +81,7 @@ public class RowFormatSetTextHandler implements CellWriteHandler { | |||||||
|         cellData.setOriginCellStyle(cellStyle); |         cellData.setOriginCellStyle(cellStyle); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 单元格样式 |      * 单元格样式 | ||||||
|      */ |      */ | ||||||
| @@ -110,7 +111,15 @@ public class RowFormatSetTextHandler implements CellWriteHandler { | |||||||
|         String[] dropdownOptionsArray = dropdownOptionList.toArray(new String[0]); |         String[] dropdownOptionsArray = dropdownOptionList.toArray(new String[0]); | ||||||
|  |  | ||||||
|         // 创建下拉列表的约束 |         // 创建下拉列表的约束 | ||||||
|         DataValidationConstraint constraint = helper.createExplicitListConstraint(dropdownOptionsArray); |         DataValidationConstraint constraint;//= helper.createExplicitListConstraint(dropdownOptionsArray); | ||||||
|  |         if (dropdownOptionsArray.length < 10) { | ||||||
|  |             // 直接设置下拉选 | ||||||
|  |             constraint = helper.createExplicitListConstraint(dropdownOptionsArray); | ||||||
|  |         } else { | ||||||
|  |             // 联动到另外一个 sheet | ||||||
|  |             //这里如果识别到大于等于10行不管数据量有多少 | ||||||
|  |             constraint = helper.createFormulaListConstraint("hidden"+firstCol+"!$A$1:$A$"+dropdownOptionList.size()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // 设置下拉列表应用的单元格区域,例如第2行到最后一行的第2列 |         // 设置下拉列表应用的单元格区域,例如第2行到最后一行的第2列 | ||||||
|         int firstRow = 1; // 通常Excel中第一行是1,这里假设第一行为表头 |         int firstRow = 1; // 通常Excel中第一行是1,这里假设第一行为表头 | ||||||
|   | |||||||
| @@ -93,7 +93,7 @@ public class ExcelExportUtils { | |||||||
|             rowFormatSetTextHandler.setDropdownOptionsMap(dropdownOptionsMap); |             rowFormatSetTextHandler.setDropdownOptionsMap(dropdownOptionsMap); | ||||||
|             EasyExcel.write(response.getOutputStream()) |             EasyExcel.write(response.getOutputStream()) | ||||||
|                     .registerWriteHandler(rowFormatSetTextHandler) |                     .registerWriteHandler(rowFormatSetTextHandler) | ||||||
|                     .registerWriteHandler(new CustomSheetWriteHandler())// 初始化单元格为文本格式 |                     .registerWriteHandler(new CustomSheetWriteHandler(dropdownOptionsMap))// 初始化单元格为文本格式 | ||||||
|                     .registerWriteHandler(new CustomColumnWidthStyleStrategy())// 单元格宽度 |                     .registerWriteHandler(new CustomColumnWidthStyleStrategy())// 单元格宽度 | ||||||
|                     .registerWriteHandler(CellStyleUtils.getCellStyleStrategy())// 单元格样式 |                     .registerWriteHandler(CellStyleUtils.getCellStyleStrategy())// 单元格样式 | ||||||
|                     .head(head) |                     .head(head) | ||||||
| @@ -145,7 +145,7 @@ public class ExcelExportUtils { | |||||||
|                 WriteSheet writeSheet = EasyExcel.writerSheet(sheetName) |                 WriteSheet writeSheet = EasyExcel.writerSheet(sheetName) | ||||||
|                         .head(head) |                         .head(head) | ||||||
|                         .registerWriteHandler(rowFormatSetTextHandler) |                         .registerWriteHandler(rowFormatSetTextHandler) | ||||||
|                         .registerWriteHandler(new CustomSheetWriteHandler()) |                         .registerWriteHandler(new CustomSheetWriteHandler(dropdownOptionsMap)) | ||||||
|                         .registerWriteHandler(new CustomColumnWidthStyleStrategy()) |                         .registerWriteHandler(new CustomColumnWidthStyleStrategy()) | ||||||
|                         .registerWriteHandler(CellStyleUtils.getCellStyleStrategy()) |                         .registerWriteHandler(CellStyleUtils.getCellStyleStrategy()) | ||||||
|                         .build(); |                         .build(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user