Grails: Как экспортировать список Grails в Microsoft Excel? - PullRequest
3 голосов
/ 23 сентября 2010

У меня есть список с информацией, и я хочу экспортировать его в Excel.Как мне это сделать?

Хороший ли «Экспортный плагин»?Я думаю, что видел один раз назад, чтобы экспортировать файлы в Excel, но я больше не могу его найти.

Ответы [ 3 ]

6 голосов
/ 23 сентября 2010

Если вы хотите фактические документы Excel (а не только файлы CSV), я использовал библиотеку JExcel с некоторым успехом.Вот быстро написанный пример, который, возможно, немного похож на Groovy.

Редактировать: Обновил мой пример, чтобы сделать это в контроллере.С архитектурной точки зрения было бы более разумно разделить это немного, но это только для примера.

import jxl.*
import jxl.write.*

class SomeController {

    def report = {
        def file = createReport(MyDomain.list())

        response.setHeader('Content-disposition', 'attachment;filename=Report.xls')
        response.setHeader('Content-length', "${file.size()}")

        OutputStream out = new BufferedOutputStream(response.outputStream)

        try {
            out.write(file.bytes)

        } finally {
            out.close()
            return false
        }
    }

    private File createReport(def list) {
        WorkbookSettings workbookSettings = new WorkbookSettings()
        workbookSettings.locale = Locale.default

        def file = File.createTempFile('myExcelDocument', '.xls')
        file.deleteOnExit()

        WritableWorkbook workbook = Workbook.createWorkbook(file, workbookSettings)

        WritableFont font = new WritableFont(WritableFont.ARIAL, 12)
        WritableCellFormat format = new WritableCellFormat(font)

        def row = 0
        WritableSheet sheet = workbook.createSheet('MySheet', 0)

        list.each {
            // if list contains objects with 'foo' and 'bar' properties, this will
            // output one row per list item, with column A containing foo and column
            // B containing bar
            sheet.addCell(new Label(0, row, it.foo, format))
            sheet.addCell(new Label(1, row++, it.bar, format))
        }
    }
}

Использование этой библиотеки позволяет вам делать такие вещи, как форматирование, использование нескольких листов и т. Д.

1 голос
/ 15 апреля 2013

Плагин Grails Export превосходен в том, что он делает: экспортирует список объектов домена (или результатов запроса) на один лист (или страницу) в нескольких форматах, включая Excel.Возможность именовать столбцы, указывать ширину, преобразовывать ваши данные на лету - это здорово - я использовал это в нескольких проектах.

if( params.format && params.format != "html"){
    response.contentType = grailsApplication.config.grails.mime.types[params.format]
    response.setHeader("Content-disposition", "attachment; filename=Docs_${new Date().format('yyyy-MM-dd')}.${params.extension}")

    List fields = ["documentNo", "modifiedBy", "modifiedDate"]
    Map labels = ["documentNo": 'Document No', "modifiedBy":'Modified by', "modifiedDate":'Last modified']

    def fullDocId = { domain, value ->
        return domain.fullDocId()
    }
    def formatDate = { domain, value ->
        return value.format('yyyy-MM-dd HH-mm')
    }

    Map formatters = [documentNo:fullDocId, modifiedDate:formatDate]
    Map parameters = [title: "${query}", "column.widths": [20, 15, 15]]

    exportService.export(params.format, response.outputStream, Document.list(), fields, labels, formatters, parameters)
}

Однако я также использовал JExcel, как это было предложеноРоб, когда я хотел что-то кроме простого списка.Правильный инструмент для работы и все такое.: -)

0 голосов
/ 16 сентября 2013

Я уже некоторое время использую плагин JXL для Grails, и он отлично работает.

У него даже есть возможность записать файл Excel в ответ, чтобы пользователь мог напрямую загрузить файлиспользуя мой сервис REST.

Ссылка: http://grails.org/plugin/jxl

Вот пример того, как просто создать рабочие книги:

new ExcelBuilder().workbook('/path/to/test.xls') {
    sheet('SheetName') {
        cell(0,0,'DEF')
    }
}

Вы можете найти большеинформация здесь .

...