2012-04-03 4 views

Antwort

2

Ja, es gibt einen Weg. Fügen Sie eine Befehlsschaltfläche hinzu, die "export" sagt.

<h:form> 
    <h:commandButton value="export" action="#{bean.export}" /> 
</h:form> 

Dann wird in den export() Verfahren iterieren die List<Something>, die Sie dort in den <ui:repeat> sind die Anzeige und jede Zeile/Spalte in gültigem CSV-Format drucken. Die CSV-Format Regeln sind sehr einfach, es gibt nur 3:

  • Felder sind durch ein Komma getrennt.
  • Wenn in einem Feld ein Komma vorkommt, muss das Feld in doppelte Anführungszeichen gesetzt werden.
  • Wenn innerhalb eines Felds ein doppeltes Anführungszeichen auftritt, muss das Feld in Anführungszeichen gesetzt werden, und das doppelte Anführungszeichen innerhalb des Feldes muss durch ein weiteres Anführungszeichen ersetzt werden.

So wird es in etwa so aussehen:

public void export() throws IOException { 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    ExternalContext ec = fc.getExternalContext(); 
    String filename = "somename.csv"; 

    ec.responseReset(); 
    ec.setResponseContentType("text/csv"); 
    ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 
    Writer writer = ec.getResponseOutputWriter(); 

    for (Something something : somethings) { // somethings is your List<Something> 
     writer.append(toCsvField(something.getFoo())) 
       .append(',') 
       .append(toCsvField(something.getBar())) 
       .append(','); 
       .append(toCsvField(something.getBaz())) 
       .append('\n'); 
    }  

    fc.responseComplete(); // Important! Otherwise JSF will perform navigation. 
} 

public static String toCsvField(Object value) { 
    if (value == null) { 
     return ""; 
    } 

    String field = String.valueOf(value).replace("\"", "\"\""); 

    if (field.indexOf(',') > -1 || field.indexOf('"') > -1) { 
     field = '"' + field + '"'; 
    } 

    return field; 
} 
+0

Vielen Dank BalusC – user1166528

Verwandte Themen