2012-04-03 25 views

答えて

2

はい、方法があります。 「エクスポート」と表示されるコマンドボタンを追加します。

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

その後、export()方法では、あなたが<ui:repeat>や印刷にそこに有効なCSV形式でそれぞれの行/列を表示していList<Something>を反復処理します。 CSV形式のルールは非常に単純で、3つしかありません。

  • フィールドはカンマで区切ります。
  • フィールド内にカンマがある場合は、そのフィールドを二重引用符で囲む必要があります。
  • フィールド内で二重引用符が使用される場合、フィールドは二重引用符で囲む必要があり、フィールド内の二重引用符は別の二重引用符でエスケープする必要があります。

だから、このようなものを見てみましょう:

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

はあなたに非常に多くのBalusCをありがとう – user1166528

関連する問題