-1

我正在使用 POI 创建 xls 格式的报告。然后我对其进行了增强以显示报告中数据的图表。由于 POI 的限制,它不能在 Excel 中创建图形。因此,我每次都使用模板并在其中重写数据,并且图表会刷新。

Cell cell = row.getCell(columnsArray[j1]);
cell.setCellValue(Integer.valueOf(count));

不好的做法,但我必须硬编码数组中单元格的位置。

int columnsArray[] = {
    1,2,3,4,5,6,7,8,9,10
};

有人使用更好的方法或任何其他 POI 替代方案可以实现这一目标吗?

提前致谢,GV

4

1 回答 1

2

到目前为止,由于apache POI 限制“您当前无法创建图表。但是,您可以在 Excel 中创建图表,使用 HSSF 修改图表数据值并写出新的电子表格。这是可能的,因为 POI 试图保留现有记录尽可能完好无损”。

但是在同样的情况下,我使用命名范围并使用 java 在 excel 表上手动创建了一个图表,我正在根据我的要求更新命名范围。由于图表基于命名范围,因此它也会得到更新。

您可以更新命名范围的现有参考并根据您的要求进行设置。假设引用包含MySheet!$A$1:$B$8并且您想将其更改为 MySheet!$B$5:$C$12

对于任何单元格,例如“B5”,在运行时,

cell.getReference(); 

将为您提供单元格引用(例如......它将返回“B5”)

char startCellColRef = cell.getReference().toString().charAt(0); 

将为您提供列参考(如果当前单元格为 B5,将为您提供“B”)。现在

int startCellRowRef = cell.getReference().toString().charAt(1);

会给你行索引(如果当前单元格是 B5,会给你“5”)。

通过同样的方式,您可以获得开始和结束单元格引用(例如 B5 和 C12)。

现在来了如何更新现有的引用。只需使用新创建的引用字符串更新其值

Name reference = wb.getName("NameReferenceInExcelSheet");
referenceString = sheetName+"!$"+startCellColRef+"$"+startCellRowRef+":$"+endCellColRef+"$"+endCellRowRef;
reference.setRefersToFormula(referenceString);

通过这种方式,您只需要手动创建名称范围,然后根据命名范围手动创建您想要的图形/图表,然后您需要更新命名范围......由于图表/图表基于此,它将获得自动更新。

于 2013-10-29T06:30:40.183 回答