2016-08-09 2 views
1

Wir haben ein Web-Tool, das dem Benutzer eine Datentabelle anzeigt und sie a) in eine XSLX exportieren und b) die Tabelle auf der Webseite sortieren und filtern kann. Wir möchten, dass die exportierte Tabelle alle Daten enthält, aber mit Filtern (und vorzugsweise Sortierung) konfiguriert wird, um die Auswahlen auf der Webseite zum Zeitpunkt des Exports zu spiegeln.Ist es möglich, ein XLSX-Dokument mit vorkonfigurierter Sortierung und Filterung zu erstellen?

Wir verwenden as_xlsx, um die Daten direkt von Oracle zu exportieren, aber wir sind bereit, differenziertere Ansätze zu betrachten. Ich habe Apache POI angeschaut, und ich kann nicht herausfinden, ob es tun kann, was wir wollen. Abgesehen davon wäre etwas in der Java-Familie vorzuziehen. XLSX-Export ist ein Muss, und die Dateien sollten in Excel unter Windows ohne Warnung geöffnet werden.

Ist das überhaupt möglich? Wenn ja, gibt es Software, die es einfach macht?

Antwort

0

Es ist möglich mit Apache Poi. Beispiel:

final Date FILTER_DATE = /* ... */; 

XSSFWorkbook workbook = new XSSFWorkbook(); 
XSSFSheet sheet = workbook.createSheet(); 

// Insert data 

for(int rownum = 0; rownum < 100; rownum++){ 
    XSSFRow row = sheet.createRow(rownum); 

    String name = /* ... */; 
    Date birthDate = /* ... */; 

    row.createCell(0).setCellValue(name); 
    row.createCell(1).setCellValue(birthDate); 

    // Manually filter 
    if (! (
     (name.equals("Alice")) && 
     (DateUtil.getExcelDate(birthDate >= DateUtil.getExcelDate(FILTER_DATE)) 
    )) { 
     row.getCTRow().setHidden(true); 
    } 
} 

// Create filters 

sheet.setAutoFilter(CellRangeAddress.valueOf("A1:C100")); 

CTAutoFilter autoFilter = sheet.getCTWorksheet().getAutoFilter(); 

CTFilterColumn nameFilterColumn = autoFilter.insertNewFilterColumn(0); 
nameFilterColumn.setColId(0L); 
CTFilter nameFilter = nameFilterColumn.addNewFilters().insertNewFilter(0); 
nameFilter.setVal("Alice"); 

CTFilterColumn dateFilterColumn = autoFilter.insertNewFilterColumn(0); 
dateFilterColumn.setColId(2L); 
CTCustomFilter dateFilter = dateFilterColumn.addNewCustomFilters().addNewCustomFilter(); 
dateFilter.setOperator(STFilterOperator.GREATER_THAN_OR_EQUAL); 
dateFilter.setVal(Double.toString(DateUtil.getExcelDate(FILTER_DATE))); 

workbook.write(System.out); 
Verwandte Themen