apache-poi - 当有很多单元格注释时,在使用 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试试。
解决方案
我认为这与评论和评论数量无关。
通过使用new CellRangeAddressList(0, 0, 0, 0)
,您可以将验证应用到一个单元格 (A1)。
通过将其更改为new CellRangeAddressList(0, rowNum - 1, 0, columnNum - 1)
您将验证应用于创建的所有单元格。
你应该改变的第二件事是你的公式。而不是!A$1:A$
你应该写!$A$1:$A$
.
推荐阅读
- spring - Mongo Spring Reactive - 无法创建对具有 NULL id 的对象的引用
- groovy - 如何使用 groovy 脚本在 yaml 文件中用环境变量值替换占位符?
- typescript - 错误:模块 '"typescript-declarations"' 没有导出的成员 'ICoordinates'
- .net - 将类映射到记录时,AutoMapper“需要具有 0 args 或仅可选 args 的构造函数”
- mat-dialog - 如何防止 MatDialog 在外部单击时关闭
- apache - Debian 10 上的 Awstats - 访问次数太少 - 修复它的选项
- jquery - django-ajax-selects - 如何保留选定的选项
- docker - 在 docker 容器中使用 apache 服务器配置 SSL
- svelte - 如何通过 getElementById 获取类型?
- python-3.x - 为什么在训练 YOLOv5 模型时出现运行时错误?