我使用带有下拉列表和许多单元格注释的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尝试。
答案 0 :(得分:0)
我认为这与评论和评论数量无关。
使用new CellRangeAddressList(0, 0, 0, 0)
,您可以将验证完全应用于一个单元格(A1)。
通过将其更改为new CellRangeAddressList(0, rowNum - 1, 0, columnNum - 1)
,您可以将验证应用于所有创建的单元格。
您应该更改的第二件事是公式。您应该写!A$1:A$
代替!$A$1:$A$
。