2011-03-31 58 views
4

Grails提供了Converter類來快速將任何類型的Java/Groovy對象轉換爲XML/JSON響應。 一樣,在grails中以CSV格式呈現

render obj as XML 

render obj as JSON 

我上一個Grails應用程序,需要我來渲染CSV格式的對象工作。有沒有辦法做到這一點?

我嘗試了一些東西,我已經解釋了下面這些:

片段我的代碼

csv { 
    def results = [] 
    for(d in Data.list()) { 
     def r= [d.id, d.name] 
     results << r 
    } 
    def result = '' 
    results.each{ row -> 
     row.each{ 
      col -> result += col + ',' 
     } 
     result = result[0..-2] 
     result += '\n' 
    } 
    println result 

    render(contentType:'text/csv',text:result) 
} 

我存儲在一個ArrayList我的結果,然後將其轉換爲一個逗號分隔字符串,然後通過它到一個渲染方法。當我在瀏覽器上運行上面的代碼時,它會創建所需的文件,並且瀏覽器會彈出一個對話框以「另存爲」文件。

當我將contentType更改爲text/html時,文件內容將在瀏覽器中顯示,不帶換行符。

有沒有更好的方法來呈現瀏覽器上csv文件的內容,就像它在文件上一樣。

謝謝。

回答

3

可以渲染的CSV爲text/plain,而不是text/html。瀏覽器會將其渲染爲純文本,類似於您在編輯器中打開文件時看到的內容。

+0

謝謝ataylor ..這正是我正在尋找.. – 2011-05-10 19:19:31

2

如果你想在瀏覽器中顯示的CSV數據,您需要使用

<br> 

,而不是\ n作爲一個新的生產線,如果你想在HTML正確顯示新的生產線。瀏覽器通常忽略控制字符,並且只在HTML標籤上進行基礎格式化。
如果你想讓用戶下載一個csv文件代碼就像下面的工作。

response.setHeader("Content-disposition", "attachment; filename=Edata.csv") 
render(contentType: "text/csv", text:varContainingData) 
3

所以我只是想解決同樣的問題 - 用CSV下載響應Grails 3請求。

我從Grails的閒置通道獲得了一條提示,使用Apache Commons CSV代碼來處理逗號,引號和其他特殊字符等細節。

要使用它,您需要將它添加到項目的依賴關係中。在build.gradle,下dependencies地址:

compile "org.apache.commons:commons-csv:1.2" 

這裏有一個例子控制器,它把一切融合在一起,並響應與CSV所有請求下載域對象Item

package name.of.package 

import grails.rest.* 
import grails.converters.* 
import org.apache.commons.csv.CSVFormat 
import org.apache.commons.csv.CSVPrinter 

class ItemController extends RestfulController { 

    static responseFormats = ['json', 'xml', 'csv'] 
    ItemController() { 
     super(ApprovedHotel) 
    } 

    def export(Integer max) { 

     def items = Item.list() 
     withFormat { 
      csv { 
       def results = [] 
       for(d in items) { 
        def r= [d.column1, d.column2] 
        results << r 
       } 

       StringWriter stringWriter = new StringWriter(); 
       CSVPrinter printer = new CSVPrinter(stringWriter, CSVFormat.EXCEL); 
       printer.printRecords(results) 
       printer.flush() 
       printer.close() 
       result = stringWriter.toString() 

       response.setHeader("Content-disposition", "attachment; filename=filename.csv") 
       render(contentType:'text/csv',text:result) 
      } 
     } 
    } 
} 
+0

感謝您的答案山姆。只要注意需要聲明變量的結果以避免錯誤groovy.lang.MissingPropertyException沒有這樣的屬性:結果爲類... – user615274 2017-08-31 19:45:54