Визуализация в формате CSV в граалях - PullRequest
4 голосов
/ 31 марта 2011

Grails предоставляет класс Converter для быстрого преобразования любого типа объектов Java / Groovy в ответ XML / JSON. Мол,

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 ]

3 голосов
/ 31 марта 2011

Вы можете отобразить CSV как text/plain вместо text/html.Браузеры отобразят это как обычный текст, аналогично тому, что вы увидите, если откроете файл в редакторе.

3 голосов
/ 22 июля 2016

Так что я просто пытался решить ту же проблему - ответить на запрос Grails 3 с загрузкой CSV.

Я получил совет от слабого канала Grails по использованию CSV-кода Apache Commons, который заботится о таких деталях, как обработка запятых, кавычек и других специальных символов.

Чтобы использовать его, вам нужно добавить его в зависимости вашего проекта. В 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)
            }
        }
    }
}
2 голосов
/ 31 марта 2011

Если вы хотите отобразить данные CSV в браузере, вам нужно использовать

<br>

вместо \ n для новой строки, если вы хотите, чтобы новые строки правильно отображались в HTML. Браузеры обычно игнорируют управляющие символы и используют базовое форматирование только для тегов HTML.
Если вы хотите разрешить пользователю загружать CSV-файл, будет работать следующий код:

response.setHeader("Content-disposition", "attachment; filename=Edata.csv")
render(contentType: "text/csv", text:varContainingData )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...