2012-11-16 11 views
6

Korzystanie Apache POI, jestem w stanie znaleźć nazwany zakres:Redefine Nazwany Excel Zakres następnie Zapisz użyciu Apache POI

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

z tym, że jestem w stanie to komórki AreaReference:

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

I wreszcie mogę uzyskać wszystkie komórki w tym zakresie:

CellReference[] cells = area.getAllReferencedCells(); 

To wszystko działa dobrze. Burt Mam przypadek użycia, w którym muszę przedefiniować obszar, który obejmuje zasięg. Czy jest jakiś sposób na zrobienie tego? Zauważam, że metoda range.getRefersToFormula() zwraca String, podobnie jak MySheet!$A$1:$B$8. Jest range.setRefersToFormula(String formula), ale muszę wierzyć, że istnieje sposób, poza samodzielnym pisaniem parsera formuł Excela na własną rękę. Czy nie ma sposobu generowania elementu AreaReference z ustawieniem na Cell odwołań do czegoś bardziej bezpiecznego dla typu? Czy rzeczywiście muszę wygenerować String, aby reprezentować nowy zakres? Myślę, że gdzieś będzie API, które mi pomoże, ale nie mogę tego znaleźć.

Aktualizacja

Znalazłem kilka API, ale nie wydają się działać, przynajmniej nie zapisać poprawnie. Oto co zrobiłem.

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

Wygląda na to, że formuła została poprawnie ustawiona, ale po przesłaniu skoroszytu z powrotem na dysk zakres jest całkowicie błędny.

Odpowiedz

7

można zaktualizować istniejący plik referencyjny i ustawić go zgodnie z wymaganiami. Załóżmy odniesienie zawiera TestSheet!$A$1:$B$8 i chcesz go zmienić na MySheet!$B$5:$C$12

Dla każdej komórki, powiedzieć „B5”, w czasie wykonywania,

cell.getReference(); 

da Ci komórek odniesienia (jak w przykładzie ... go powróci ty „B5”)

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

daje odwołanie do kolumny (da wam „B”, jeśli bieżąca komórka jest B5). Teraz

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

dostarczy Ci indeks wiersza (da ci "5", jeśli bieżąca komórka to B5).

W ten sam sposób można uzyskać swój początek i koniec odwołań do komórek (słownie B5 i C12).

Teraz przychodzi jak mogę zaktualizować istniejące referencje. Wystarczy zaktualizować swoją wartość z nowo utworzonego łańcucha odniesienia

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