如何使用数据透视表中的apache poi在列标签中添加多个列

时间:2017-07-24 07:27:37

标签: java apache-poi

我正在创建数据透视表,以前我已将其中一个行值作为列工作正常但现在当我在数据透视表中添加了一个更多的columnlabel时,它已被删除

我的代码给o / p之类的  enter image description here

要求o / p enter image description here

这是我的代码

          public class ApacheCreatePivotTable
    {
        public static void main(String[] args) throws Exception
        {
            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFSheet sheet =  wb.createSheet();
            //Create some data to build the pivot table on
            setCellData(sheet);
            int endclonum = wb.getSheetAt(0).getRow(0).getLastCellNum()-1;
            int endrownum = wb.getSheetAt(0).getLastRowNum();
            AreaReference source = new AreaReference(new CellReference(0,0),new CellReference(endrownum,endclonum));
            XSSFSheet sheet2 = wb.createSheet("pivot");
            CellReference position = new CellReference("A1"); //convertColStringToIndex
            XSSFPivotTable pivotTable = sheet2.createPivotTable(source, position, sheet);
            pivotTable.addRowLabel(0);
            pivotTable.addRowLabel(1);
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).setDefaultSubtotal(false);

            pivotTable.addColumnLabel(DataConsolidateFunction.AVERAGE, 3);
            pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 3);

            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).setAxis(
                    org.openxmlformats.schemas.spreadsheetml.x2006.main.STAxis.AXIS_COL);

            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).addNewItems();
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).getItems().addNewItem().setT(
                    org.openxmlformats.schemas.spreadsheetml.x2006.main.STItemType.DEFAULT);
            FileOutputStream fileOut = new FileOutputStream("output.xlsx");
            wb.write(fileOut);
            fileOut.close();
            wb.close();
        }

        public static void setCellData(XSSFSheet sheet)
        {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Row row1 = sheet.createRow(0);
            // Create a cell and put a value in it.
            Cell cell11 = row1.createCell(0);
            cell11.setCellValue("Names");
            Cell cell12 = row1.createCell(1);
            cell12.setCellValue("falility");
            Cell cell13 = row1.createCell(2);
            cell13.setCellValue("date");
            Cell cell14 = row1.createCell(3);
            cell14.setCellValue("cost");
            Cell cell15 = row1.createCell(4);
            cell15.setCellValue("growth");


            Row row2 = sheet.createRow(1);
            Cell cell21 = row2.createCell(0);
            cell21.setCellValue("tom");
            Cell cell22 = row2.createCell(1);
            cell22.setCellValue("Nal stop");
            Cell cell23 = row2.createCell(2);
            Calendar cal = Calendar.getInstance();
            cal.set(2017,07,18);
            cell23.setCellValue(sdf.format(cal.getTime()));
            Cell cell24 = row2.createCell(3);
            cell24.setCellValue(10);
            Cell cell25 = row2.createCell(4);
            cell25.setCellValue(.18);


            Row row3 = sheet.createRow(2);
            Cell cell31 = row3.createCell(0);
            cell31.setCellValue("Ram");
            Cell cell32 = row3.createCell(1);
            cell32.setCellValue("Vadgao");
            Cell cell33 = row3.createCell(2);
            cal.set(2017,07,19);
            cell33.setCellValue(sdf.format(cal.getTime()));
            Cell cell34 = row3.createCell(3);
            cell34.setCellValue(12);
            Cell cell35 = row3.createCell(4);
            cell35.setCellValue(.12);

            Row row4 = sheet.createRow(3);
            Cell cell41 = row4.createCell(0);
            cell41.setCellValue("Terk");
            Cell cell42 = row4.createCell(1);
            cell42.setCellValue("Deccan");
            Cell cell43 = row4.createCell(2);
            cal.set(2017,07,20);
            cell43.setCellValue(sdf.format(cal.getTime()));
            Cell cell44 = row4.createCell(3);
            cell44.setCellValue(11);
            Cell cell45 = row4.createCell(4);
            cell45.setCellValue(.35);

            Row row5 = sheet.createRow(4);
            Cell cell51 = row5.createCell(0);
            cell51.setCellValue("tom");
            Cell cell52 = row5.createCell(1);
            cell52.setCellValue("baner");
            Cell cell53 = row5.createCell(2);
            cal.set(2017,07,18);
            cell53.setCellValue(sdf.format(cal.getTime()));
            Cell cell54 = row5.createCell(3);
            cell54.setCellValue(20);
            Cell cell55 = row5.createCell(4);
            cell55.setCellValue(.50);
        }
}

请帮助我,

1 个答案:

答案 0 :(得分:1)

问题中提供的代码不会为Microsoft Excel创建正确的文件。 Excel不会打开该文件,但会抛出有关错误内容的错误,并提供修复文件的选项。只有在这些修理之后,它才会显示数据透视表。

OpenofficeLibreoffice对此更加宽容。因此,如果唯一的需要是为OpenofficeLibreoffice创建一个正确的文件,那么只需要对问题中提供的代码进行以下添加(我的添加内容不会缩进):

...
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).setAxis(
                    org.openxmlformats.schemas.spreadsheetml.x2006.main.STAxis.AXIS_COL);

            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).addNewItems();
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).getItems().addNewItem().setT(
                    org.openxmlformats.schemas.spreadsheetml.x2006.main.STItemType.DEFAULT);

//new ColField needs to be inserted at position 0
pivotTable.getCTPivotTableDefinition().getColFields().insertNewField(0).setX(2);
pivotTable.getCTPivotTableDefinition().getColFields().setCount(2);
...

*.xlsx不是OpenofficeLibreoffice的默认文件格式,而是Microsoft Excel的默认文件格式。因此,*.xlsx 应该是Microsoft Excel的正确文件。

要支持Microsoft Excel,需要正确的数据透视缓存定义。对于这个正确的枢轴字段项目首先是必要的(我的添加不缩进):

import java.io.*;

import org.apache.poi.ss.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.xssf.usermodel.*;

import java.util.Calendar;
import java.text.SimpleDateFormat;

  public class ApacheCreatePivotTable2
    {
        public static void main(String[] args) throws Exception
        {
            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFSheet sheet =  wb.createSheet();
            //Create some data to build the pivot table on
            setCellData(sheet);
            int endclonum = wb.getSheetAt(0).getRow(0).getLastCellNum()-1;
            int endrownum = wb.getSheetAt(0).getLastRowNum();
            AreaReference source = new AreaReference(new CellReference(0,0),new CellReference(endrownum,endclonum));
            XSSFSheet sheet2 = wb.createSheet("pivot");
            CellReference position = new CellReference("A1"); //convertColStringToIndex
            XSSFPivotTable pivotTable = sheet2.createPivotTable(source, position, sheet);
            pivotTable.addRowLabel(0);
            pivotTable.addRowLabel(1);

//set tabular layout instead of tree layout
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).setOutline(false);

            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).setDefaultSubtotal(false);

            pivotTable.addColumnLabel(DataConsolidateFunction.AVERAGE, 3);
            pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 3);

            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).setAxis(
                    org.openxmlformats.schemas.spreadsheetml.x2006.main.STAxis.AXIS_COL);

            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).addNewItems();
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(2).getItems().addNewItem().setT(
                    org.openxmlformats.schemas.spreadsheetml.x2006.main.STItemType.DEFAULT);

//new ColField needs to be inserted at position 0
pivotTable.getCTPivotTableDefinition().getColFields().insertNewField(0).setX(2);
pivotTable.getCTPivotTableDefinition().getColFields().setCount(2);


//next code is necessary to create a proper file for Microsoft Excel

for (int i = 0; i < 3; i++) {
 //take the first 3 items as numbered items: <item x="0"/><item x="1"/>
 pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).getItems().getItemArray(i).unsetT();
 pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).getItems().getItemArray(i).setX((long)i);
}

for (int i = 4; i > 2; i--) {
 //remove further items
 pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).getItems().removeItem(i);
}

//set new items count
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).getItems().setCount(3);

//build a cache definition which has shared elements for those items 
//<sharedItems><s v="tom"/><s v="Ram"/><s v="Terk"/></sharedItems>
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldList().get(0).getSharedItems().addNewS().setV("tom");
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldList().get(0).getSharedItems().addNewS().setV("Ram");
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldList().get(0).getSharedItems().addNewS().setV("Terk");

            FileOutputStream fileOut = new FileOutputStream("output.xlsx");
            wb.write(fileOut);
            fileOut.close();
            wb.close();
        }

        public static void setCellData(XSSFSheet sheet)
        {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Row row1 = sheet.createRow(0);
            // Create a cell and put a value in it.
            Cell cell11 = row1.createCell(0);
            cell11.setCellValue("Names");
            Cell cell12 = row1.createCell(1);
            cell12.setCellValue("falility");
            Cell cell13 = row1.createCell(2);
            cell13.setCellValue("date");
            Cell cell14 = row1.createCell(3);
            cell14.setCellValue("cost");
            Cell cell15 = row1.createCell(4);
            cell15.setCellValue("growth");


            Row row2 = sheet.createRow(1);
            Cell cell21 = row2.createCell(0);
            cell21.setCellValue("tom");
            Cell cell22 = row2.createCell(1);
            cell22.setCellValue("Nal stop");
            Cell cell23 = row2.createCell(2);
            Calendar cal = Calendar.getInstance();
            cal.set(2017,07,18);
            cell23.setCellValue(sdf.format(cal.getTime()));
            Cell cell24 = row2.createCell(3);
            cell24.setCellValue(10);
            Cell cell25 = row2.createCell(4);
            cell25.setCellValue(.18);


            Row row3 = sheet.createRow(2);
            Cell cell31 = row3.createCell(0);
            cell31.setCellValue("Ram");
            Cell cell32 = row3.createCell(1);
            cell32.setCellValue("Vadgao");
            Cell cell33 = row3.createCell(2);
            cal.set(2017,07,19);
            cell33.setCellValue(sdf.format(cal.getTime()));
            Cell cell34 = row3.createCell(3);
            cell34.setCellValue(12);
            Cell cell35 = row3.createCell(4);
            cell35.setCellValue(.12);

            Row row4 = sheet.createRow(3);
            Cell cell41 = row4.createCell(0);
            cell41.setCellValue("Terk");
            Cell cell42 = row4.createCell(1);
            cell42.setCellValue("Deccan");
            Cell cell43 = row4.createCell(2);
            cal.set(2017,07,20);
            cell43.setCellValue(sdf.format(cal.getTime()));
            Cell cell44 = row4.createCell(3);
            cell44.setCellValue(11);
            Cell cell45 = row4.createCell(4);
            cell45.setCellValue(.35);

            Row row5 = sheet.createRow(4);
            Cell cell51 = row5.createCell(0);
            cell51.setCellValue("tom");
            Cell cell52 = row5.createCell(1);
            cell52.setCellValue("baner");
            Cell cell53 = row5.createCell(2);
            cal.set(2017,07,18);
            cell53.setCellValue(sdf.format(cal.getTime()));
            Cell cell54 = row5.createCell(3);
            cell54.setCellValue(20);
            Cell cell55 = row5.createCell(4);
            cell55.setCellValue(.50);
        }
    }

当然,此代码示例仅显示原理。问题是如何从任何类型的数据列中获取所需的不同数据(在本例中为“tom”,“Ram”和“Terk”),该数据列将用于数据透视表。这是挑战。