当单元格注释过多时,单击随Apache POI一起导出的excel中的箭头时,下拉选项不会出现

时间:2019-08-14 10:45:57

标签: apache-poi

我使用带有下拉列表和许多单元格注释的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尝试。

1 个答案:

答案 0 :(得分:0)

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

使用new CellRangeAddressList(0, 0, 0, 0),您可以将验证完全应用于一个单元格(A1)。

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

您应该更改的第二件事是公式。您应该写!A$1:A$代替!$A$1:$A$