2012-11-16 22 views
6

使用Apache POI,我能夠找到一個名爲範圍:重新定義命名的Excel範圍,然後保存使用Apache POI

XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()]; 
for (int i = 0; i < _wb.getNumberOfNames(); i++) 
    ranges[i] = workbook.getNameAt(i); 

就這樣,我能細胞的AreaReference:

AreaReference area = new AreaReference(ranges[0].getRefersToFormula()); 

然後終於我可以得到所有的細胞範圍內:

CellReference[] cells = area.getAllReferencedCells(); 

這一切都工作得很好。伯特我有一個用例,我必須重新定義範圍覆蓋的區域。有沒有辦法做到這一點?我注意到range.getRefersToFormula()方法返回一個字符串,類似MySheet!$A$1:$B$8。有一個range.setRefersToFormula(String formula),但我必須相信有一種方法,而不是訴諸自己編寫一個Excel範圍公式分析器。有沒有辦法生成一個AreaReference的設置爲Cell引用更安全的類型?我實際上是否必須生成String來表示新範圍?我想會有API來幫助我,但我似乎無法找到它。

更新

我發現了一些API,但它似乎沒有工作,至少它不正確保存。這就是我所做的。

AreaReference newArea = new AreaReference(firstCell, lastCell); 
ranges[0].setRefersToFormula(newArea.formatAsString()) 

它似乎正確地設置公式,但是當我將工作簿重新流出到磁盤時,範圍是完全錯誤的。

回答

7

您可以更新現有的Reference並根據您的要求進行設置。 假設引用包含TestSheet!$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);