I POI 3,12-Beta1 bin mit:XSSF (POI) - Hinzufügen von "Formel" Spaltentabelle zu schwenken
<!-- Apache POI (for Excel) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12-beta1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12-beta1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
Ich versuche, eine berechnete Pivot-Tabelle Spalte zu erstellen, die wie folgt definiert ist: = 'Ended'/'Generated' * 100
.
Ich ging weiter und manuell das Blatt in Excel bearbeiten diese, zur Arbeit zu kommen und wenn ich die *.xlsx
-Datei in ein ZIP-Verzeichnis umgedreht und sah durch sie, fand ich den folgenden Code in \xl\pivotCache\pivotCacheDefinition1.xml
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pivotCacheDefinition xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="rId1" refreshOnLoad="1" refreshedBy="vyasrav" refreshedDate="42110.580247453705" createdVersion="3" refreshedVersion="3" minRefreshableVersion="3" recordCount="352">
<cacheSource type="worksheet">
<worksheetSource ref="A1:O353" sheet="Data"/>
</cacheSource>
<cacheFields count="16">
<!-- OMITTED -->
<cacheField name="Avg Pct Processed" numFmtId="0" formula="'Ended'/'Generated' * 100" databaseField="0"/>
</cacheFields>
</pivotCacheDefinition>
Also ging ich zurück zu meinem Java-Programm und fügte den folgenden Code hinzu, um es automatisch zu generieren, aber es registriert nicht die Datenspalte "15" und ich erhalte einen IndexOutOfBounds-Fehler.
// Add pivot (pivot table):
Sheet pivotSheet = workbook.createSheet("Pivot");
LOGGER.trace("Created sheet: '" + String.valueOf(pivotSheet) + "'.");
XSSFPivotTable pivotTable = ((XSSFSheet)pivotSheet).createPivotTable(new AreaReference(tableRange), new CellReference("A1"), dataSheet);
CTPivotTableDefinition ctPivotTableDefinition = pivotTable.getCTPivotTableDefinition();
CTPivotTableStyle ctPivotTableStyle = ctPivotTableDefinition.getPivotTableStyleInfo();
ctPivotTableStyle.setName("PivotStyleMedium4");
// Row Labels:
pivotTable.addRowLabel(...); // ...
...
// Add column 15 (this is a calculated column):
CTCacheFields ctCacheFields = pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields();
CTCacheField ctCacheField = ctCacheFields.addNewCacheField();
ctCacheField.setName("Avg Pct Processed");
ctCacheField.setFormula("'Ended'/'Generated' * 100");
// Column Labels:
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 8, "Sum of Generated");
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 12, "Sum of Ended");
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 13, "Sum of Unended");
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 15, "Average of Processed Percent");
...
Die Stacktrace der IndexOutOfBoundsException, die oben auf der fett gedruckten Linie auftritt:
Exception in thread "main" java.lang.IndexOutOfBoundsException at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTPivotFieldsImpl.setPivotFieldArray(Unknown Source) at org.apache.poi.xssf.usermodel.XSSFPivotTable.addDataColumn(XSSFPivotTable.java:372) at org.apache.poi.xssf.usermodel.XSSFPivotTable.addColumnLabel(XSSFPivotTable.java:296) at com...
Wer weiß, wie kann ich POI diese Spalte zu erzeugen, verwenden?
EDIT:
Ich habe versucht, mit beiden:
CTPivotTableDefinition ctPivotTableDefinition = pivotTable.getCTPivotTableDefinition();
und
CTCacheField ctCacheField = ctCacheFields.insertNewCacheField(15);
und in beiden Szenarien, erhalte ich die gleiche Ausnahme, wenn diese Zeile ausführt:
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 15, "Average of Processed Percent");
Als Anmerkung, ich habe versucht, die Zeile auskommentieren, wo ich die neue Spaltenbeschriftung hinzufügen, und wenn ich dies tun, wenn ich die Arbeitsmappe in Excel 2010 öffne, erhalte ich die folgende Fehlermeldung beim Start:
Removed Feature: PivotTable report from /xl/pivotTables/pivotTable1.xml part (PivotTable view) Removed Records: Workbook properties from /xl/workbook.xml part (Workbook)
Danke!
Haben Sie versucht, insertNewCacheField (int i); – cronos2546
@ cronos2546: Danke für den Vorschlag, habe ich die Zeile in meinem Code oben geändert: 'CTCacheField ctCacheField = ctCacheFields.addNewCacheField();' zu 'CTCacheField ctCacheField = ctCacheFields.insertNewCacheField (15);', aber ich bekomme immer noch das gleiche 'java.lang.IndexOutOfBoundsException' at' at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTPivotFieldsImpl.setPivotFieldArray (Unbekannte Quelle) 'wenn das Skript versucht, aufzurufen:' pivotTable.addColumnLabel (DataConsolateFunction.SUM, 15, "Durchschnitt der verarbeiteten Prozent"); '. – anonymous
Was für ein Schmerz. Gibt es einen Grund dafür, dass Ihre Durchschnittsformel kein "=" enthält? – cronos2546