Не могу создать сводную таблицу с Apache POI 4.0.1 - PullRequest
0 голосов
/ 28 февраля 2019

Мы пытаемся создать сводную таблицу на основе файла .xlsx, который мы создаем программным способом.

      FileInputStream input_document = new FileInputStream(new File("testme.xlsx"));

    XSSFWorkbook wb = new XSSFWorkbook(input_document);
    XSSFSheet pivotSheet = wb.createSheet("Pivot sheet");


    //create pivot table
     XSSFPivotTable pivotTable = pivotSheet.createPivotTable(
            new AreaReference(new CellReference("\'Selected Messages\'!A3"), new CellReference("\'Selected Messages\'!T4620"), //make the reference big enough for later data
                    SpreadsheetVersion.EXCEL2007),
            new CellReference("\'Pivot sheet\'!C5"), wb.getSheet("Selected Messages"));
    //Configure the pivot table
    //Use first column as row label
    pivotTable.addRowLabel(0);

    pivotTable.addRowLabel(2);

    pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 5, "Number of messages");

    pivotTable.addColLabel(4);

    pivotTable.addReportFilter(11);



    wb.write(new FileOutputStream("SXSSFPivotTableTest.xlsx"));
    wb.close();

Вот наш пример кода, который мы используем.Testme.xlsx - это созданный нами файл, который содержит много данных. Данные приведены в листе Selected Message.Мы хотим создать сводную таблицу из этих данных на новом листе в том же файле, а затем создать новый файл, который будет содержать все листы.

Наша проблема в том, что после создания, когда мы пытаемся открыть новый файл, Excel пытается восстановить его, но при этом удаляет сводную таблицу и все XML-файлы, которые за нее отвечают.Полученное нами сообщение об ошибке показано ниже:

Удалена особенность: отчет сводной таблицы из /xl/pivotCache/pivotCacheDefinition1.xml part (кэш сводной таблицы) Удалена особенность: отчет сводной таблицы из / xl / pivotTables/pivotTable1.xml part (представление сводной таблицы) Удаленные записи: свойства рабочей книги из /xl/workbook.xml part (Workbook)

Есть ли у кого-либо такая же проблема в любой предыдущей версии или всамый последний?Любое решение, которое может помочь нам решить нашу проблему?

ПРИМЕЧАНИЕ Созданный .xlsx можно открыть с помощью LibreOffice.Заголовки Type,MRN or Correl ID,From,Sent To,Received,CoA,CoD,Exp,Exc,Size,Type Error,Pointer,Reason,Original Value,Action by recipient,Interchange Error code,Rejected Msg,Action by recipient2,Error code

1 Ответ

0 голосов
/ 01 марта 2019

Я нашел способ обойти это.Мы создали CTTable, который похож на формат кнопки таблицы в Excel, а затем была создана сводная таблица.Ниже приведен пример.Созданному файлу присваивается код, размещенный выше, и создается окончательный файл .xlsx.

    FileInputStream input_document = new FileInputStream(new File("testme.xlsx"));
    XSSFWorkbook my_xlsx_workbook = new XSSFWorkbook(input_document);
    XSSFSheet sheet = my_xlsx_workbook.getSheetAt(0);
    XSSFTable my_table = sheet.createTable();

    CTTable cttable = my_table.getCTTable();
    CTTableStyleInfo table_style = cttable.addNewTableStyleInfo();
    table_style.setName("TableStyleMedium9");
    table_style.setShowColumnStripes(true);
    table_style.setShowRowStripes(true);
    AreaReference my_data_range = new AreaReference(new CellReference(9, 0), new CellReference(18, 19), SpreadsheetVersion.EXCEL2007);
    cttable.setRef(my_data_range.formatAsString());
    cttable.setDisplayName("MYTABLE");      /* this is the display name of the table */
    cttable.setName("Test");    /* This maps to "displayName" attribute in <table>, OOXML */
    cttable.setId(1L); //id attribute against table as long value
    for(int x = my_xlsx_workbook.getSheetAt(0).getRow(2).getRowNum();x < my_xlsx_workbook.getSheetAt(0).getLastRowNum(); x++) {
        //add columns for each row
        CTTableColumns columns = cttable.addNewTableColumns();
        //define number of columns for each row
        columns.setCount(my_xlsx_workbook.getSheetAt(0).getRow(x).getLastCellNum());
        //loop the columns to add value and id
        for (int i = 0; i < my_xlsx_workbook.getSheetAt(0).getRow(x).getLastCellNum(); i++) {
            CTTableColumn column = columns.addNewTableColumn();
            column.setName(my_xlsx_workbook.getSheetAt(0).getRow(x).getCell(i).getStringCellValue());
            column.setId(my_xlsx_workbook.getSheetAt(0).getRow(x).getCell(i).getColumnIndex() + i);
        }
        //add each row into the table
        cttable.setTableColumns(columns);
    }
    sheet.setAutoFilter(new CellRangeAddress(2,2,0,19));

    /* Write output as File */
    FileOutputStream fileOut = new FileOutputStream("Excel_Format_As_Table.xlsx");
    my_xlsx_workbook.write(fileOut);
    fileOut.close();
}
...