2014-10-20 9 views
6

Utworzyłem tabelę przestawną, używając Apache POI 3.11. w następujący sposób:Wstaw etykietę kolumny do tabeli przestawnej za pomocą Apache POI?

FileInputStream file = new FileInputStream(new File(path+fname)); 

XSSFWorkbook workbook = new XSSFWorkbook(file); 

XSSFSheet sheet = workbook.getSheetAt(0); 
//area of pivot data 
AreaReference a=new AreaReference("A1:J4"); 

CellReference b=new CellReference("N5");  
XSSFPivotTable pivotTable = sheet.createPivotTable(a,b); 

//insert row 
pivotTable.addRowLabel(3); 
pivotTable.addRowLabel(6); 

//insert column 
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 5); 

//export 
FileOutputStream output_file = 
    new FileOutputStream(new File(path+"POI_XLS_Pivot_Example.xlsx")); 
workbook.write(output_file);//write excel document to output stream 
output_file.close(); //close the file 

Po wygenerowaniu raportu prawidłowo pokazuje wiersz. Ale to nie pokazuje etykietę kolumny:

img

chcę wyświetlić etykietę tej kolumny w moim stole obrotowym tak:

img http://www.pivot-table.com/wp-content/uploads/2010/12/calculateditem04.png

Czy ktoś zna rozwiązanie tego problemu ?

Dzięki.

+0

W tej chwili mam dokładnie ten sam problem! Cóż, ponieważ jest to wersja beta, prawdopodobnie nie jest to możliwe w tej chwili ... Szkoda, że ​​nie ma metody "addColumnLabel (int)", która dodawałaby etykietę kolumny bez funkcji konsolidacji danych ... Szukałem trochę przykładowy kod i znaleźli to: https://code.google.com/p/web-design-r/source/browse/trunk/zpoiex-r/src/org/zkoss/zpoiex/ss/usermodel/helpers/PivotTableHelper. java? r = 15 Metoda 'createPivotTable' wygląda interesująco tam, gdzie obsługuje niektóre' CTPivotField's. Nie wiem, czy jest jakaś droga przez te pola ?! – bobbel

+0

Czy to działa? Polecenie Utwórz kolumnę addColumnLabel, jak pokazano poniżej, nadal nie działa. Dzięki – labheshr

Odpowiedz

9

Poniższy sposób (nieco zmodyfikowana wersja XSSFPivotTable.addRowLabel) dodaje się „normalne” etykietę kolumny obrotu:

public static void addColLabel(XSSFPivotTable pivotTable, int columnIndex) { 
    AreaReference pivotArea = new AreaReference(pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition() 
      .getCacheSource().getWorksheetSource().getRef()); 
    int lastRowIndex = pivotArea.getLastCell().getRow() - pivotArea.getFirstCell().getRow(); 
    int lastColIndex = pivotArea.getLastCell().getCol() - pivotArea.getFirstCell().getCol(); 

    if (columnIndex > lastColIndex) { 
     throw new IndexOutOfBoundsException(); 
    } 
    CTPivotFields pivotFields = pivotTable.getCTPivotTableDefinition().getPivotFields(); 

    CTPivotField pivotField = CTPivotField.Factory.newInstance(); 
    CTItems items = pivotField.addNewItems(); 

    pivotField.setAxis(STAxis.AXIS_COL); 
    pivotField.setShowAll(false); 
    for (int i = 0; i <= lastRowIndex; i++) { 
     items.addNewItem().setT(STItemType.DEFAULT); 
    } 
    items.setCount(items.sizeOfItemArray()); 
    pivotFields.setPivotFieldArray(columnIndex, pivotField); 

    CTColFields rowFields; 
    if (pivotTable.getCTPivotTableDefinition().getColFields() != null) { 
     rowFields = pivotTable.getCTPivotTableDefinition().getColFields(); 
    } else { 
     rowFields = pivotTable.getCTPivotTableDefinition().addNewColFields(); 
    } 

    rowFields.addNewField().setX(columnIndex); 
    rowFields.setCount(rowFields.sizeOfFieldArray()); 
} 
0

Od wersji 3.12 of POI, że wszystko działa jak czar (również z własnymi etykietami kolumn):

//insert column 
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 2, "Central"); 
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 3, "East"); 
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 4, "West"); 
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 5, "Grand Total"); 
+1

To, co POI wywołuje "Etykieta kolumny", jest pokazywane jako "Wartość" w Excelu. Ta metoda powinna być nazywana addValue – Gabriel

+0

To rozwiązanie nie ma powodu, ponieważ drugim parametrem 'pivotTable.addColumnLabe' jest' columnIndex' z ** source **. –