Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用DataValidationHelper(POI)的Excel下拉列表_Java_Excel_Apache Poi - Fatal编程技术网

Java 使用DataValidationHelper(POI)的Excel下拉列表

Java 使用DataValidationHelper(POI)的Excel下拉列表,java,excel,apache-poi,Java,Excel,Apache Poi,我正在使用包含一百万行的SXSSFWorkbook(流)生成一个excel文件(.xlsx)。一列必须包含一个具有4-5个值的下拉列表。我能够生成这个,但我有两个问题- 生成excel需要花费大量时间。7分钟有下拉菜单,11秒无下拉菜单,可播放250000行 文件生成后无法打开,因为它要求恢复最终将失败的数据。消息说“在文件D:\Test.xlsx中检测到错误已删除功能:数据验证来自/xl/worksheets/sheet2.xml部分” 下面是代码片段 DataValidationHelper

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

  • 生成excel需要花费大量时间。7分钟有下拉菜单,11秒无下拉菜单,可播放250000行
  • 文件生成后无法打开,因为它要求恢复最终将失败的数据。消息说“在文件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);
                    }
                }
            }
    
    main(){
    新建工作簿=新建XSSFWorkbook();
    hiddenRiskSheet=新建工作簿.createSheet(“RiskHidden”);
    createRiskHiddenSheet(hiddenPrepaidSheet);
    hiddenRiskSheet.protectSheet(“passw0rd”);
    hiddenRiskSheet.enableLocking();
    DataValidationHelper validationHelper=null;
    CellRangeAddressList addressList=新的CellRangeAddressList(0,sh.getLastRowNum(),cellnum,cellnum);
    DataValidationConstraint=validationHelper..createFormulaListConstraint(“风险隐藏!$A$1:$A$4”);
    DataValidation DataValidation=validationHelper.createValidation(约束,地址列表);
    dataValidation.setSuppressDropDownArrow(真);
    addValidationData(dataValidation);
    }   
    公共作废createRiskHiddenSheet(XSSFSheet HiddenSheet)
    {
    字符串[]风险={“高风险”、“中风险”、“低风险”、“无风险”};
    对于(int i=0;i<4;i++){
    Row Row=hiddenRiskSheet.createRow(i);
    Cell Cell=行createCell(i);
    字符串cat=风险[i];
    cell.setCellValue(cat);
    }
    }
    }
    
    createRiskHiddenSheet应修改-创建单元格时的一部分。它应该是:row.createCell(0.setValue(风险[i]);