Доступ к настройкам полей сводной таблицы с помощью Apache POI

Я создаю книгу с листом, заполненным данными из источника данных, а затем создаю второй лист с представлением сводной таблицы этих данных. Все работает нормально, но я не могу изменить внешний вид сводной таблицы по умолчанию. Я пытаюсь получить настройку ( Метки строк --> Щелкните один из списка --> Настройки поля --> Промежуточные итоги --> Нет и метки строки --> Щелкните один из списка --> Параметры поля --> Макет и печать -> «Показать метки элементов в табличной форме») проверил при создании сводной таблицы, но не смог найти дескриптор / флаг в POI. Пытался найти что-то под pivotTable.getCTPivotTableDefinition() или pivotTable.getCTPivotTableDefinition().getPivotTableStyleInfo(), но без блокировки. Пожалуйста, сообщите, есть ли способ установить эти настройки с помощью poi во время создания сводной таблицы, а не после выполнения шагов, указанных в скобках. Вот мой код сводной таблицы:

XSSFSheet sheet = (XSSFSheet)wb.createSheet("Data");
...
...
//filling data sheet, skipping this part as it's not relevant 
...
XSSFSheet pivotSheet = (XSSFSheet)wb.createSheet("Pivot Table");
AreaReference source = new AreaReference(sheet.getSheetName()+"!A$1:W$"+String.valueOf(sheet.getLastRowNum()));
CellReference position = new CellReference("A3");
XSSFPivotTable pivotTable = pivotSheet.createPivotTable(source, position);


        /* Add filters */
        pivotTable.addRowLabel(17);
        pivotTable.addRowLabel(20);
        pivotTable.addRowLabel(21);
        pivotTable.addRowLabel(22);
        pivotTable.addRowLabel(13);
        pivotTable.addRowLabel(19);
        pivotTable.addRowLabel(6);
        pivotTable.addRowLabel(0);
        pivotTable.addRowLabel(18);
        pivotTable.addRowLabel(1);
        pivotTable.addRowLabel(7);
        pivotTable.addRowLabel(9);

person UCJava    schedule 12.08.2015    source источник


Ответы (3)


Наконец понял это; отсутствие хорошей документации вынудило меня перепробовать миллион вещей и, наконец, смог добиться того, чего хотел; вот код:

for(CTPivotField ctPivotField:pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldList()){
            ctPivotField.setAutoShow(false);
            ctPivotField.setOutline(false);
            ctPivotField.setSubtotalTop(false);
            ctPivotField.setSubtotalCaption("");
        }
person UCJava    schedule 12.08.2015
comment
Однако здесь есть одна проблема: ctPivotField.setSubtotalCaption(); фактически не удаляет ячейку, ctPivotField.setSubtotalCaption(null); также не удаляет ячейку промежуточного итога, поэтому все еще ищет способ пометить промежуточный итог сводного поля как «нет» - person UCJava; 19.08.2015
comment
Вы когда-нибудь догадывались об этом? Я хочу сделать то же самое. - person Todd Sharp; 25.08.2015
comment
@ToddSharp вместо того, чтобы каждый раз создавать сводную таблицу, я создал один XLS-файл шаблона со всеми нужными стилями и включил его в исходный код, теперь я открываю этот файл, заполняя необходимые данные на вкладке исходного кода, и сохраняю файл XLS с помощью динамические данные с другим именем; поскольку вкладка сводной таблицы помечена для обновления при открытии, она выполняет свою работу. Вместо использования POI API с ограничениями сводных таблиц создание шаблона и его использование намного проще и гибче, если вы создадите сводную таблицу в том же стиле для динамических данных. - person UCJava; 01.09.2015
comment
@UCJava, как вы сделали это, создав шаблон сводной таблицы, а затем заполнив его данными в java? пожалуйста, могли бы привести пример или подсказать, как редактировать данные существующей сводной таблицы в java? - person ninjaxelite; 22.06.2017
comment
@ninjaxelite смотрите мой пример ниже - person UCJava; 04.07.2017

вместо того, чтобы каждый раз создавать сводную таблицу, я создал один XLS-файл шаблона со всеми нужными стилями и включил его в исходный код, теперь я открываю этот файл, заполняя необходимые данные на вкладке исходного кода, и сохраняю файл XLS с динамическим данные с другим именем; поскольку вкладка сводной таблицы помечена для обновления при открытии, она выполняет свою работу. Вместо использования POI API с ограничениями сводных таблиц создание шаблона и его использование намного проще и гибче, если вы создадите сводную таблицу в том же стиле для динамических данных.

person UCJava    schedule 31.08.2015
comment
это было некоторое время, но пример высоко ценится - person jareeq; 19.01.2017
comment
Я делаю то же самое. Но в моем случае, когда в исходном листе более десяти записей, расчеты в сводной таблице правильные, но есть некоторые строки, которые переполняются из сводной таблицы. Вот ссылка на мой вопрос: stackoverflow. com/questions/48443001/ Пожалуйста, сообщите - person Muhammad Salman Farooq; 25.01.2018

@ninjaxelite вот как это происходит:

       List<Object[]> resultSet = //get raw data


        XSSFWorkbook wb = null;
        try {
            wb = new XSSFWorkbook(new FileInputStream(this.getClass().getResource("/content/XLS_template.xlsx").getPath()));
        } catch (FileNotFoundException e1) {
            //error
        } catch (IOException e1) {
            //error
        }



        Map<String, CellStyle> styles = createStyles(wb); // some local function to get styles 
        XSSFSheet sheet = (XSSFSheet)wb.getSheetAt(0);

        XSSFRow row;
        XSSFCell cell;
        int rowNum = 0;
        for (Object[] aRow : resultSet) {
            rowNum++;
            row = sheet.createRow(rowNum);

            cell = row.createCell(0);
            cell.setCellValue((String)aRow[0]);
            cell.setCellStyle(styles.get("cell_normal_centered"));

             ...
             ..
             .
person UCJava    schedule 04.07.2017
comment
Проблема в том, что вам нужно расширить область источника данных для сводной таблицы, если у вас больше строк данных, чем в шаблоне. в противном случае для сводной таблицы будут использоваться не все доступные строки, а только строки из ссылки на область шаблона. - person ninjaxelite; 04.07.2017
comment
Я просто расширил область источника данных в шаблоне до максимума. Теперь все работает, спасибо. - person ninjaxelite; 05.07.2017
comment
приведенный выше код также будет делать то же самое динамически; когда вы добавляете строку, вызывая : row = sheet.createRow(rowNum);, вы в основном расширяете источник данных. Коду все равно, сколько данных вы поместите. - person UCJava; 05.07.2017