0

I'm working on creating pivot table,Previously i have put one of the row values as column it working fine but now when i have added one more columnlabel in pivot table it's getting removed

My code giving o/p like enter image description here

required o/p enter image description here

here is my code

          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);
        }
}

Please help me with this,

1 Answer 1

1

The code provided in the question does not create a proper file for Microsoft Excel. Excel will not opening that file but will throw an error about wrong content instead and give the option to repair the file. Only after these repairs it will show the pivot table.

Openoffice and Libreoffice are more tolerant about this. So if the only need is to create a proper file for Openoffice and Libreoffice, then only the following additions to the code provided in the question are necessary (my additions are not indented):

...
            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);
...

But *.xlsx is not the default file format for Openoffice and Libreoffice but for Microsoft Excel. So a *.xlsx should be a proper file for Microsoft Excel.

To support Microsoft Excel a proper pivot cache definition is needed. And for this proper pivot field items are necessary at first (my additions are not indented):

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);
        }
    }

Of course this code sample shows only the principle. The problem is how to get the needed distinct data (in this example "tom", "Ram" and "Terk") from any kind of data column which shall be used for the pivot table. This is the challenge.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.