java - Excel 下拉使用 DataValidationHelper (POI)

标签 java excel apache-poi

我正在使用具有 100 万行的 SXSSFWorkbook(流)生成一个 excel 文件 (.xlsx)。一列必须包含具有 4-5 个值的下拉列表。我能够生成这个,但我有两个问题-

  1. 生成 Excel 需要很多时间。 250,000 行有下拉菜单需要 7 分钟,没有下拉菜单需要 11 秒。
  2. 文件生成后无法打开,因为它要求恢复最终会失败的数据。消息显示“在文件 D:\Test.xlsx 中检测到错误已删除功能:来自/xl/worksheets/sheet2.xml 部分的数据验证”

下面是代码片段

DataValidationHelper validationHelper = sh.getDataValidationHelper();
CellRangeAddressList addressList = new CellRangeAddressList(0, sh.getLastRowNum(), cellnum, cellnum);
DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(new String[] { "High risk", "Medium risk", "Low risk", "No risk" });
DataValidation  dataValidation = validationHelper.createValidation(constraint, addressList);
dataValidation.setSuppressDropDownArrow(true);
sh.addValidationData(dataValidation);

请建议我更好的解决方案。

最佳答案

对此有一个简单的解决方案。在 Excel 中创建一个隐藏(或密码保护)工作表,在下拉菜单中包含您需要的数据。然后在 dataValidationConstraint 标记中引用该工作表。下载应该不会花费太多时间。 PFB示例代码

  main(){
new_workbook = new XSSFWorkbook();
hiddenRiskSheet= new_workbook.createSheet("RiskHidden");
createRiskHiddenSheet(hiddenPrepaidSheet);
                hiddenRiskSheet.protectSheet("passw0rd");
                hiddenRiskSheet.enableLocking();
DataValidationHelper validationHelper = null;
CellRangeAddressList addressList = new CellRangeAddressList(0, sh.getLastRowNum(), cellnum, cellnum);
DataValidationConstraint constraint = validationHelper..createFormulaListConstraint("RiskHidden!$A$1:$A$4");
DataValidation  dataValidation = validationHelper.createValidation(constraint, addressList);
dataValidation.setSuppressDropDownArrow(true);
validationHelper.addValidationData(dataValidation); 
}   
public void createRiskHiddenSheet(XSSFSheet hiddenRiskSheet)
     {
            String[] risk = { "High risk", "Medium risk", "Low risk", "No risk" };
            for (int i = 0; i < 4; i++) {
                Row row = hiddenRiskSheet.createRow(i);

                    Cell cell = row.createCell(i);
                    String cat = risk[i];
                    cell.setCellValue(cat);
                }
            }
        }

关于java - Excel 下拉使用 DataValidationHelper (POI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39867531/

相关文章:

java - Type 类型层次类型应该如何实现?

java - Eclipse 调试中的 IllegalStateException

java - 使用 Apache POI 和丰富文本 (HTML) 写入 docx

java - System.getProperty ("java.version") 与 Class.forName 后备

java - 在 spring 上下文中通过类路径引用文件

excel - 如果偏移量相同,则根据以下值填充空单元格

excel - 通过引用列表中的工作表名称从其他工作表返回单元格值

如果某行上的事件单元格,Excel VBA会添加边框

java - 编辑 Excel 文件时,由于 native 代码错误,崩溃发生在 Java 虚拟机之外

java - 读取 Excel 文件中的值,该值是多个单元格中的单个值