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?