2015-10-05 17 views
5

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?

risposta

3

Se utilizzo l'URI completo corretto per lo spazio dei nomi, la cartella di lavoro viene salvata e tutto va bene finché non provo a valutare la formula con PDI. Uso la cartella di lavoro setForceFormulaRecalculation e funziona quando Excel è aperto. Credo che sia ancora un bug nel POI, ma avevo bisogno di una soluzione rapida e questo lo fa per me.

2

Nota: Mi rendo conto che questo è un post molto vecchio, ma solo nel caso in cui qualcuno in futuro potrebbe essere alla ricerca di una soluzione a questo come ho appena incontrato lo stesso problema ...

state sulla la traccia giusta, ma non vedo dove stai applicando una formula alla cella nella riga totale effettiva. Se non lo imposti, la riga totale sarà presente ma vuota all'apertura del file.

Quando si crea la tabella

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

Quando si creano le colonne

column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT); 

Dopo aver popolato tutti i dati della tabella

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

È necessario compilare tableLastRow e lastColumnPosition per i valori specifici del codice. Questo funziona per me con Apache POI 3.17 ed Excel 2016.

Problemi correlati