2013-10-06 32 views
-1

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

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

回答

2

截至目前作为apache POI limitation是说“您当前无法创建图表。但是,您可以在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); 

更新它的值由您手动要根据命名的范围这种方式,你只需要创建名字手动的范围,然后图/图表,然后你需要更新命名的范围...由于图表/图形基于此,它会自动更新。

+0

我得到了大部分的答案,但最后一部分有点困惑。假设我的图表基于B5到B10。当程序更新数据时,它会反映在图表中。但是,如果想要改变范围,例如从B5到B15,该怎么办?我可以通过java来完成,还是必须手动完成? –

+0

您也可以更改范围。如果最初的图表基于B5到B10的数据,现在它基于B5到B15,则可以更改名称范围值,并且图表会相应更新。为了理解你可以认为NamedRanges是代表数据范围的变量。图表基于这个变量。因此,变量值的任何更改都会反映在图表中,您也可以通过程序更改变量值。 – Sankumarsingh

+0

让我试试看。这真的可以达到我的目的。感谢您的输入..非常感谢。 –