Durante la scrittura di uno strumento per esportare i set di risultati in Excel, ho riscontrato un problema. Sto creando con successo tabelle con formattazione e filtri sulle intestazioni delle colonne, nessun problema. Il problema è che non riesco a capire come far funzionare "le righe totali". Voglio utilizzare le righe totali vere in modo che rispondano ai filtri applicati, ma finora posso ottenere una riga con i subtotali che funzionano ma non fanno parte della tabella o posso ottenere una riga parziale parziale vuota.Apache POI Excel Tot. Tabella Minore
Credo che ci debba essere un po 'di magia, come un analizzatore di formule o qualcosa di simile, ma devo ancora inciampare su di esso nel javadocs o nel codice di esempio. Sto usando il codice allo this location con le seguenti modifiche. All'interno del ciclo che definisce le intestazioni delle colonne:
if(i == 0)
column.setTotalsRowLabel("Totals:");
else
column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT);
Poi fuori del ciclo:
cttable.setTotalsRowShown(true);
cttable.setTotalsRowCount(1);
Nessuna fortuna, se posso aggiungere una riga vuota per i totali, si è formattato come una parte del tavolo , ma nessun valore mostra. Se imposto una formula per una delle celle totali, la formula funziona, ma a Excel non piace la tabella e rimuove la riga totale, sebbene la formula sia presente e funzioni, ma non come una riga totale.
Quando guardo il sotto XML grezzo, è praticamente indistinguibile da un foglio Excel salvato per la tabella, mentre il foglio di lavoro è considerevolmente diverso.
AGGIORNAMENTO: Sono stato lontano da questo progetto per un po 'di tempo, recentemente tornato ad esso. Ho rinunciato a fare POI automaticamente e invece ho cercato di backdoor attraverso la manipolazione del DOM.
Sono così vicino che non posso arrendermi. Tutto questo sta arrivando a un problema di namespace nel foglio di lavoro finale. Questo codice:
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);
produce il seguente nel file sheet1.xml:
<c r="D5">
<main:f>SUBTOTAL(103,MYTABLE[Human])</f>
</c>
Se uso createElement ("f"), ottengo:
<c r="D5">
<f xmlns="">SUBTOTAL(103,MYTABLE[Human])</f>
</c>
Se io manualmente modifica il foglio all'interno dell'archivio e rimuovi il tag o il qualificatore del namespace, funziona! Non riesco a vedere come risolvere il problema NS senza salvare il libro di lavoro e quindi procedendo ad aprirlo e correggere i problemi con il file IO. Qualcuno ha qualche suggerimento su questo?