Java 导出Excel增加下拉框选项

作者:小小小LIN子 时间:2021-10-13 07:58:50 

excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项

选项较少(一般少于5个):

private static DataValidation setFewDataValidation(Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {
   DataValidationHelper helper = sheet.getDataValidationHelper();
   //加载下拉列表内容
   DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);
   constraint.setExplicitListValues(textList);
   //设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
   CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
   //数据有效性对象
   return helper.createValidation(constraint, regions);
}

选项较多

创建隐藏工作簿:

Sheet sheetHidden = wb.createSheet("Sheet2");
wb.setSheetHidden(1, true);

每一个列表占用一列

当然也可以每个列表使用一张工作簿,只用第一列。 这里是使用一个工作簿使用每个列,先26个字母,一般够用了

String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
for (int j = 0; j < dataList.size(); j++) {
   if (index == 0) { //第1个下拉选项,直接创建行、列
       row = sheetHidden.createRow(j); //创建数据行
       //      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
       row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值
   } else { //非第1个下拉选项
       int rowCount = sheetHidden.getLastRowNum();
       if (j <= rowCount) { //前面创建过的行,直接获取行,创建列
           //获取行,创建列
           sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值

} else { //未创建过的行,直接创建行、创建列
           //  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
           //创建行、创建列
           sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
       }
   }
}

index 代表第几个下拉框,也就是在隐藏工作簿的第几列,dataList表示下拉框的内容

创建公式:

String strFormula = "Sheet2!$" + arr[index] + "$1:$" + arr[index] + "$" + dataList.size();

Sheet2第A1到A5000作为下拉列表来源数据

xls和xlsx生成下拉框的选项不一样

private static DataValidation setMoreDataValidation(Workbook wb, Sheet sheet, String strFormula, int startRow, int endRow, int startColumn, int endColumn) {

DataValidation dataValidation;
   // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
   CellRangeAddressList regions = new CellRangeAddressList(startRow, endRow, startColumn, endColumn);
   if (wb instanceof XSSFWorkbook) {
       //获取新sheet页内容
       XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
       // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
       // 数据有效性对象
       DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);
       dataValidation = help.createValidation(constraint, regions);
       dataValidation.setSuppressDropDownArrow(true);
       dataValidation.setShowErrorBox(true);
   } else {
       // 设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
       DVConstraint constraint = DVConstraint.createFormulaListConstraint(strFormula);
       dataValidation = new HSSFDataValidation(regions, constraint);
       dataValidation.setSuppressDropDownArrow(false);
   }
   dataValidation.setEmptyCellAllowed(true);
   dataValidation.setShowPromptBox(true);
   dataValidation.createErrorBox("Error", "请选择下拉框中的数据");
   dataValidation.createPromptBox("提示", "只能选择下拉框里面的数据");
   return dataValidation;

}

加入工作簿:

sheet.addValidationData()

完整代码:

private static void setValidationDate(Workbook wb, Sheet sheet, List<DataValidationCell> dataValidationCellList) {
   if (dataValidationCellList.isEmpty()) {
       return;
   }
   String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
   int index = 0;
   Row row;
   Sheet sheetHidden = wb.createSheet("Sheet2");
   wb.setSheetHidden(1, true);
   for (DataValidationCell dataValidationCell : dataValidationCellList) {
       List<String> dataList = dataValidationCell.getDataList();
       if (CollectionUtils.isEmpty(dataList)) {
           continue;
       }
       if (dataList.size() <= 5) {
           sheet.addValidationData(setFewDataValidation(sheet, dataList.toArray(new String[0]),
                   dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),
                   dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //超过255个报错
       } else {
           //String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作为下拉列表来源数据
           String strFormula = "Sheet2!$" + arr[index] + "$1:$" + arr[index] + "$" + dataList.size(); //Sheet2第A1到A5000作为下拉列表来源数据
           sheet.addValidationData(setMoreDataValidation(wb, sheet, strFormula,
                   dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),
                   dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //下拉列表元素很多的情况
           //2、生成sheet2内容
           for (int j = 0; j < dataList.size(); j++) {
               if (index == 0) { //第1个下拉选项,直接创建行、列
                   row = sheetHidden.createRow(j); //创建数据行
                   //      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
                   row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值
               } else { //非第1个下拉选项
                   int rowCount = sheetHidden.getLastRowNum();
                   if (j <= rowCount) { //前面创建过的行,直接获取行,创建列
                       //获取行,创建列
                       sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
                   } else { //未创建过的行,直接创建行、创建列
                       //  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
                       //创建行、创建列
                       sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
                   }
               }
           }
           index++;
       }
   }
}
public static class DataValidationCell{
   private int startRow;
   private int endRow;
   private int startColumn;
   private int endColumn;
   private List<String> dataList;
}

来源:https://juejin.cn/post/6999544378951729160

标签:Java,导出,Excel,J,增加,下拉框,选项
0
投稿

猜你喜欢

  • android 6.0 写入SD卡的权限申请实例讲解

    2023-07-27 03:12:37
  • C语言实现贪吃蛇游戏演示

    2023-07-03 14:16:43
  • Android控件CardView实现卡片布局

    2022-12-05 02:10:32
  • Java 反射(Reflect)详解

    2022-09-27 08:34:44
  • 基于java集合中的一些易混淆的知识点(详解)

    2023-08-29 03:06:26
  • android studio使用SQLiteOpenHelper()建立数据库的方法

    2023-10-28 12:50:35
  • C#中ref关键字的用法

    2022-07-17 21:30:47
  • spring springMVC中常用注解解析

    2023-09-14 20:45:46
  • Android使用SQLite数据库的示例

    2023-09-17 07:36:58
  • java程序员如何编写更好的单元测试的7个技巧

    2023-09-05 14:57:24
  • java 自动生成略缩图示例代码

    2021-11-11 01:27:37
  • Android中解决WebView上下滑动监听问题

    2022-04-18 04:45:37
  • Springboot如何获取上下文ApplicationContext

    2023-11-27 23:42:41
  • Spring Security实现用户名密码登录详解

    2021-05-24 14:32:36
  • Java求最小生成树的两种算法详解

    2023-11-10 07:21:24
  • Android获取设备传感器的方法

    2022-10-07 10:50:16
  • Android使用VideoView播放本地视频和网络视频的方法

    2023-06-28 11:17:32
  • Spring Boot应用事件监听示例详解

    2022-06-12 22:39:02
  • 详解springboot测试类注解

    2023-06-04 21:04:37
  • Android View如何测量

    2023-12-06 14:53:53
  • asp之家 软件编程 m.aspxhome.com