У меня возникла проблема с методом setDefaultSubtotal для pivotFields axisRow. Когда я устанавливаю значение false для поля RowLabel, Excel не нравится. Вручную создавая вещи, как я хочу их в Excel, а затем сохраняя, получается значительно другой XML, слишком отличный для меня, чтобы рассмотреть возможность фиксации за кулисами. Я не могу (пока) манипулировать XML, чтобы таблица электронных таблиц POI открывалась в Excel.Apache POI XSSFPivotTable setDefaultSubtotal
Фактический код немного длинный и громоздкий для размещения, но вот работоспособная часть с той же проблемой:
private static void sample() throws IOException{
Workbook wb = new XSSFWorkbook();
String[][] data = new String[][]{{"STATUS","PASSED","VALUE"},{"BLUE","Y","20"},{"RED","N","10"},{"BLUE","N","30"}};
XSSFSheet sheet = (XSSFSheet) wb.createSheet("data");
XSSFSheet pivot = (XSSFSheet) wb.createSheet("summary");
for(String[] dataRow : data){
XSSFRow row = sheet.createRow(sheet.getPhysicalNumberOfRows());
for(String dataCell : dataRow){
XSSFCell cell = row.createCell(row.getPhysicalNumberOfCells());
cell.setCellValue(dataCell);
}
}
XSSFTable table = sheet.createTable();
CTTable cttable = table.getCTTable();
table.setDisplayName("table");
cttable.setRef("A1:C4");
cttable.setId(1);
CTTableColumns columns = cttable.addNewTableColumns();
columns.setCount(3);
int i = 1;
for (String colName : data[0]){
CTTableColumn column = columns.addNewTableColumn();
column.setId(++i);
column.setName(colName);
}
XSSFPivotTable pivotTable = pivot.createPivotTable(new AreaReference("A1:C4", SpreadsheetVersion.EXCEL2007), new CellReference("A4"), sheet);
pivotTable.addRowLabel(0);
CTPivotField fld = pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldList().get(0);
fld.setOutline(false);
//fld.setDefaultSubtotal(false); // uncomment and Excel has problems
pivotTable.addRowLabel(1);
fld = pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldList().get(1);
fld.setOutline(false);
//fld.setDefaultSubtotal(false); // uncomment and Excel has problems
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 2, "test");
FileOutputStream fileOut = new FileOutputStream("c:/temp/pivotsample.xlsx");
wb.write(fileOut);
wb.close();
}
Когда я произвожу версию POI, они являются расположение и pivotFields элементами сводная таблица XML внутри архива:
<location firstDataCol="1" firstDataRow="1" firstHeaderRow="1" ref="F10:G11" colPageCount="1"/>
<pivotFields count="5">
<pivotField axis="axisRow" showAll="false" compact="true" outline="false" defaultSubtotal="false">
<items count="4">
<item t="default"/>
<item t="default"/>
<item t="default"/>
<item t="default"/>
</items>
</pivotField>
<pivotField dataField="true" showAll="false"/>
<pivotField dataField="true" showAll="false"/>
<pivotField axis="axisPage" showAll="false">
<items count="4">
<item t="default"/>
<item t="default"/>
<item t="default"/>
<item t="default"/>
</items>
</pivotField>
<pivotField axis="axisRow" showAll="false" compact="true" outline="false" defaultSubtotal="false">
<items count="4">
<item t="default"/>
<item t="default"/>
<item t="default"/>
<item t="default"/>
</items>
</pivotField>
</pivotFields>
Когда я открываю в Excel и позволить ему восстановить лист, я затем внести изменения в Excel, чтобы делать то, что я хотел, а именно две строки этикетки без подытог в табличной форме , это то, что сохраняет Excel:
<location ref="F10:I15" firstHeaderRow="1" firstDataRow="2" firstDataCol="2" rowPageCount="1" colPageCount="1"/>
<pivotFields count="5">
<pivotField axis="axisRow" outline="0" showAll="0" defaultSubtotal="0">
<items count="3">
<item x="0"/>
<item x="1"/>
<item x="2"/>
</items>
</pivotField>
<pivotField dataField="1" showAll="0"/>
<pivotField dataField="1" showAll="0"/>
<pivotField axis="axisPage" showAll="0">
<items count="3">
<item x="0"/>
<item x="1"/>
<item t="default"/>
</items>
</pivotField>
<pivotField axis="axisRow" outline="0" showAll="0" defaultSubtotal="0">
<items count="2">
<item x="0"/>
<item x="1"/>
</items>
</pivotField>
</pivotFields>
Я попытался просто обо всем, и я понимаю, формат Excel, но это зависит от pivotCacheRecords, так что я бы в конечном итоге, чтобы написать код, чтобы заполнить это. Если есть кто-нибудь, кто может понять, почему этот код терпит неудачу, я был бы признателен за указатель.
Я получаю тот же вопрос. Можете ли вы рассказать мне, как вы решили это по-другому. Будет здорово, если вы дадите мне пример кода. –
Извините, @RajKantaria, я еще не сделал этого с этим, теперь перешел на некоторые другие вопросы, вернусь к нему в конце концов. Удачи. –
@RajKantaria, ответ ниже работает отлично, надеюсь, что он и для вас. –