ExcelDataValidation.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package jnpf.excel.handle;
  2. import cn.afterturn.easypoi.excel.entity.ExportParams;
  3. import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
  4. import jnpf.excel.ExcelHelper;
  5. import jnpf.excel.ExcelPostHandle;
  6. import jnpf.model.ExcelColumnAttr;
  7. import jnpf.util.ExcelUtil;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.apache.poi.ss.usermodel.*;
  10. import org.apache.poi.ss.util.CellRangeAddressList;
  11. import org.apache.poi.xssf.usermodel.XSSFCell;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. import java.util.Objects;
  16. /**
  17. * excel添加数据下拉校验
  18. * 下拉选择(单选)、单选框组、开关导入EXCEL内生成【数据验证】下拉框
  19. */
  20. public class ExcelDataValidation implements ExcelPostHandle {
  21. String sheetName;
  22. Map<String, ExcelColumnAttr> modelMap;
  23. ExcelHelper data;
  24. private Workbook workbook;
  25. int hiddenIndex = 0;
  26. int headerRowLen = 0;
  27. int lastRowNum = 0;
  28. Map<String, String[]> optionMap;
  29. /**
  30. * 用于下拉内容很多,字符超过255
  31. * <p>
  32. * 下拉选项(先将数据放到另一个sheet页,然后下拉的数据再去sheet页读取,解决普通下拉数据量太多下拉不显示问题)
  33. * <p>
  34. * firstRow 开始行号(下标0开始)
  35. * <p>
  36. * lastRow 结束行号,最大65535
  37. * <p>
  38. * firstCol 区域中第一个单元格的列号 (下标0开始)
  39. * <p>
  40. * lastCol 区域中最后一个单元格的列号
  41. * <p>
  42. * sheetIndex 创建的sheet的index。如果有多个下拉想放到sheet页,则需要设置不同的sheetIndex,(注意不能设置为0,0为主数据页)
  43. * <p>
  44. * selectList 下拉内容
  45. */
  46. public void selectLargeList(Workbook workbook, int firstRow, int lastRow, int firstCol, int lastCol, int sheetIndex, String[] selectList) {
  47. Sheet sheet = workbook.getSheetAt(0);
  48. //将下拉框数据放到新的sheet里,然后excle通过新的sheet数据加载下拉框数据
  49. String sheetName = "sheetName" + sheetIndex;
  50. Sheet hidden = workbook.createSheet(sheetName);
  51. //创建单元格对象
  52. Cell cell = null;
  53. //遍历我们上面的数组,将数据取出来放到新sheet的单元格中
  54. for (int i = 0, length = selectList.length; i < length; i++) {
  55. //取出数组中的每个元素
  56. String name = selectList[i];
  57. //根据i创建相应的行对象(说明我们将会把每个元素单独放一行)
  58. Row row = hidden.createRow(i);
  59. //创建每一行中的第一个单元格
  60. cell = row.createCell(0);
  61. //然后将数组中的元素赋值给这个单元格
  62. cell.setCellValue(name);
  63. }
  64. // 创建名称,可被其他单元格引用
  65. String refers = sheetName + "!$A$1:$A$" + selectList.length;
  66. //这个3代表我的下拉数据从第三行开始生效,前面1,2行不显示下拉,你们根据自己情况修改。
  67. CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
  68. DataValidationHelper helper = sheet.getDataValidationHelper();
  69. DataValidationConstraint constraint = helper.createFormulaListConstraint(refers);
  70. DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
  71. //将第sheetIndex个sheet设置为隐藏
  72. sheet.addValidationData(dataValidation);
  73. hiddenIndex++;
  74. }
  75. @Override
  76. public void execute(ExcelHelper data, Map<String, Object> params) {
  77. hiddenIndex = 0;
  78. workbook = data.getWorkbook();
  79. optionMap = data.getOptionMap() != null ? data.getOptionMap() : new HashMap<>();
  80. List<ExcelExportEntity> list = data.getEntities();
  81. ExportParams exportParams = data.getExportParams();
  82. this.sheetName = exportParams.getSheetName();
  83. this.data = data;
  84. modelMap = data.getModelMap() != null ? data.getModelMap() : new HashMap<>();
  85. Sheet sheet = workbook.getSheet(exportParams.getSheetName());
  86. headerRowLen = data.isComplexTable() ? 2 : 1;
  87. lastRowNum = sheet.getLastRowNum();
  88. for (int i = 0; i < headerRowLen; i++) {
  89. Row headerRow = sheet.getRow(i);
  90. int lastCellNum = headerRow.getLastCellNum();
  91. for (int j = 0; j < lastCellNum; j++) {
  92. Cell cell = headerRow.getCell(j);
  93. addDataValidation(cell, j);
  94. }
  95. }
  96. // 隐藏校验sheet
  97. for (int i = 1; i <= hiddenIndex; i++) {
  98. workbook.setSheetHidden(i, true);
  99. }
  100. }
  101. private void addDataValidation(Cell cell, int columnIndex) {
  102. if (cell == null) return;
  103. String key = ((XSSFCell) cell).getRichStringCellValue().getString();
  104. if (StringUtils.isBlank(key)) return;
  105. String id = ExcelUtil.getIdFromCellValue(key);
  106. ExcelColumnAttr model = modelMap.get(id);
  107. if (Objects.isNull(model)) return;
  108. String[] options = optionMap.get(id);
  109. if (options != null && options.length > 0) {
  110. selectLargeList(workbook, headerRowLen, lastRowNum, columnIndex, columnIndex, columnIndex, options);
  111. }
  112. }
  113. }