2015-10-05 17 views
5

Podczas pisania narzędzia do eksportowania zestawów wyników do programu Excel napotkałem jeden problem. Udaje mi się tworzyć tabele z formatowaniem i filtrami na nagłówkach kolumn, nie ma problemu. Problem polega na tym, że nie mogę wymyślić, jak sprawić, by wszystkie wiersze działały. Chcę użyć prawdziwych wierszy sumarycznych, aby odpowiadały na zastosowane filtry, ale do tej pory mogę albo uzyskać wiersz z sumami częściowymi, które działają, ale nie są częścią tabeli, albo mogę uzyskać pusty wiersz sumy częściowej.Apache POI Table-Totals Excel

Wierzę, że musi istnieć jakaś magia, jak ewaluator formuły lub coś podobnego, ale muszę jeszcze się na to natknąć w javadocs lub przykładowym kodzie. Używam kodu pod numerem this location z następującymi modyfikacjami. Wewnątrz pętli, który wyznacza nagłówki kolumn:

 if(i == 0) 
     column.setTotalsRowLabel("Totals:"); 
    else 
     column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT);   

Wtedy na zewnątrz pętli:

cttable.setTotalsRowShown(true); 
cttable.setTotalsRowCount(1); 

No szczęście, jeśli dodać pusty wiersz do sumy, to jest sformatowana jako część tabeli , ale brak wartości. Jeśli ustawię formułę dla dowolnej z komórek łącznie, formuła działa, ale program Excel nie lubi tabeli i usuwa cały wiersz, chociaż formuła istnieje i działa, po prostu nie jako wiersz całkowity.

Kiedy patrzę na surowy XML pod spodem, jest praktycznie nie do odróżnienia od arkusza kalkulacyjnego Excel dla tabeli, podczas gdy arkusz roboczy jest znacznie inny.

AKTUALIZACJA: Byłem z dala od tego projektu od jakiegoś czasu, ostatnio wróciłem do niego. Zrezygnowałem z POI, robiąc to automatycznie, a zamiast tego zamieniłem się w próbę backdoora poprzez manipulację DOM.

Jestem tak blisko, że nie mogę się poddać. Wszystko to sprowadza się do problemu przestrzeni nazw w ostatecznym arkuszu roboczym. Ten kod:

Element b = (Element) wb.getSheetAt(0).getCTWorksheet().getSheetData().getRowList().get(4).getCArray()[3].getDomNode(); 
Element f = b.getOwnerDocument().createElementNS("main", "f"); 
b.removeAttribute("t"); 
b.removeChild(b.getElementsByTagName("v").item(0)); 
f.appendChild(b.getOwnerDocument().createTextNode("SUBTOTAL(103,MYTABLE[Human])")); 
b.appendChild(f); 

produkuje następujące w pliku sheet1.xml:

<c r="D5"> 
    <main:f>SUBTOTAL(103,MYTABLE[Human])</f> 
</c> 

Jeśli używam createElement ("F"), otrzymuję:

<c r="D5"> 
    <f xmlns="">SUBTOTAL(103,MYTABLE[Human])</f> 
</c> 

Gdybym ręcznie edytuj arkusz wewnątrz archiwum i usuń znacznik obszaru nazw lub kwalifikator, działa! Nie widzę sposobu rozwiązania problemu NS bez zapisywania książki pracy, a następnie kontynuowania otwierania i naprawiania problemów z plikiem IO. Czy ktoś ma jakieś wskazówki na ten temat?

Odpowiedz

3

Jeśli używam poprawnego pełnego identyfikatora URI dla przestrzeni nazw, skoroszyt jest zapisywany i wszystko jest w porządku, o ile nie próbuję oceniać formuły za pomocą POI. Używam skoroszytu setForceFormulaRecalculation na i działa po otwarciu programu Excel. Wciąż jest to błąd związany z POI, ale potrzebowałem szybkiej naprawy i to robi dla mnie.

2

Uwaga: Zdaję sobie sprawę, że jest to bardzo stary post, ale tylko w przypadku gdy ktoś w przyszłości może być patrząc na rozwiązanie tego jak ja po prostu napotkał ten sam problem ...

Jesteś na właściwy tor, ale nie widzę, gdzie stosujesz formułę do komórki w rzeczywistym wierszu całkowitym. Jeśli tego nie ustawisz, cały wiersz będzie obecny, ale pusty po otwarciu pliku.

Tworząc tabelę

cttable.setTotalsRowShown(true); 
cttable.setTotalsRowCount(1); 
cttable.addNewAutoFilter(); 

Podczas tworzenia kolumny

column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT); 

Po wypełniania wszystkich danych tabeli

Row totalsRow = sheet.createRow(tableLastRow); 
Cell totalsCell = totalsRow.createCell(lastColumnPosition); 
totalsCell.setCellFormula("SUBTOTAL(103,MYTABLE[Human])"); 

Będziesz musiał wypełnić tableLastRow i lastColumnPosition dla wartości właściwych dla twojego kodu. Działa to dla mnie z Apache POI 3.17 i Excel 2016.

Powiązane problemy