首页 > 解决方案 > 当有很多单元格注释时,在使用 Apache POI 导出的 Excel 中单击箭头时,不会出现下拉选项

问题描述

我使用带有下拉列表和许多单元格注释的 Apache POI 导出 excel。生成较少的单元格注释时,单击下拉箭头时会出现下拉选项供选择,但是当生成的单元格注释较多时,不会出现下拉选项。

我使用最新的 Apache POI 版本进行测试 - 4.1.0。

    HSSFWorkbook wb=new HSSFWorkbook();
    HSSFSheet sheet=wb.createSheet("my sheet");

    // create cell and add comments
    int rowNum = 25;
    int columnNum = 50;
    HSSFPatriarch p=sheet.createDrawingPatriarch();
    for (int i=0; i<rowNum; i++) {
        HSSFRow row = sheet.createRow(i);

        for (int j=0; j<columnNum; j++) {
            HSSFCell cell = row.createCell(j);
            cell.setCellValue(new HSSFRichTextString((i+1)+","+(j+1)));

            if (i != 0 || j != 0) {
                HSSFComment comment=p.createComment(new HSSFClientAnchor(0,0,0,0,(short)3,3,(short)5,6));
                comment.setString(new HSSFRichTextString("comment for cell: " + (i+1) +","+(j+1)));
                cell.setCellComment(comment);
            }
        }
    }

    // add drop down
    String hiddenSheetName = "hiddenSheet";
    HSSFSheet hiddenSheet = wb.createSheet(hiddenSheetName);
    wb.setSheetHidden(wb.getSheetIndex(hiddenSheet), true);
    HSSFRow hiddenRow = null;
    HSSFCell hiddenCell = null;
    String[] menuItems = {"Yes", "No"};
    for (int i = 0; i < menuItems.length; i++)
    {
        hiddenRow = hiddenSheet.createRow(i);
        hiddenCell = hiddenRow.createCell(0);
        hiddenCell.setCellValue(menuItems[i]);
    }
    HSSFName namedCell = wb.createName();
    String formulaId = "formulaId";
    namedCell.setNameName(formulaId);
    namedCell.setRefersToFormula(hiddenSheetName + "!A$1:A$" + menuItems.length);
    HSSFDataValidationHelper dvHelper = new HSSFDataValidationHelper(sheet);
    DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint(formulaId);
    CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);
    HSSFDataValidation validation = (HSSFDataValidation)dvHelper.createValidation(dvConstraint, addressList);
    sheet.addValidationData(validation);

    FileOutputStream out = null;
    try{
        out=new FileOutputStream("exportExcelTest.xls");
        wb.write(out);
        out.close();
    } catch (Exception e) {

    }

从我的测试结果来看,当注释掉单元格注释生成部分时,单击下拉箭头时会出现下拉选项供选择,并且当将变量 rowNum 设置为 15 时,也会出现下拉选项。将变量 rowNum 设置为 25 时,它将生成更多的单元格注释,然后不会出现下拉选项。如果将 rowNum 设置为大于 25,选项也不会出现。所以我推断这个问题与生成的评论数量有关。我不确定这是 Apache POI 问题还是我在代码中写错了什么。希望有人可以帮助我解决这个问题。

我给rowNum的这些数字只是为了测试,你可以给任何rowNum试试。

标签: apache-poi

解决方案


我认为这与评论和评论数量无关。

通过使用new CellRangeAddressList(0, 0, 0, 0),您可以将验证应用到一个单元格 (A1)。

通过将其更改为new CellRangeAddressList(0, rowNum - 1, 0, columnNum - 1)您将验证应用于创建的所有单元格。

你应该改变的第二件事是你的公式。而不是!A$1:A$你应该写!$A$1:$A$.


推荐阅读