Достъп до настройките на полето на обобщена таблица с помощта на Apache POI

Създавам работна книга с данни, попълнени в лист от източник на данни, след което създавам втори лист с изглед на обобщена таблица на тези данни. Всичко работи добре, но изглежда не мога да променя изгледа по подразбиране на обобщената таблица. Опитвам се да получа настройката ( Етикети на редове-->Щракнете върху едно от списъка-->Настройки на полето-->Междинни суми-->Няма и Етикети на редове-->Щракнете върху едно от списъка-->Настройки на полето--> Layout & Print-->'Show item labels in tabular form' ) е отметнато при създаването на обобщената таблица, но не можа да намери манипулатора/флагчето в 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 файла с динамичните данни с различно име; тъй като разделът Pivot table е маркиран да се опреснява при отваряне, той върши работата. Вместо да преминавате през API на POI с ограниченията на обобщените таблици, създаването на шаблон и използването му е много по-лесно и гъвкаво, ако генерирате обобщена таблица със същия стил за динамични данни. - person UCJava; 01.09.2015
comment
@UCJava как го направи със създаването на шаблон за обобщена таблица и след това попълването му с данни в java? моля, можете ли да ми дадете пример или намек как да редактирам данни от съществуваща обобщена таблица в java? - person ninjaxelite; 22.06.2017
comment
@ninjaxelite вижте моя пример по-долу - person UCJava; 04.07.2017

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

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