Grails:如何将Grails列表导出到Microsoft Excel?

3

我有一个包含信息的列表,想要将它导出到Excel中。我该怎么做?

“Export Plugin”好用吗?我记得之前看到过一个可以将文件导出到Excel的插件,但现在找不到了。


你的列表包含哪些对象?这可能有助于提供更具体的答案。 - Rob Hruska
3个回答

6
如果你想要实际的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))
        }
    }
}

使用该库可以让您完成格式设置、使用多个工作表等操作。

好的,但是我有一个图标,可以将列表中的所有内容导出到Excel。 - randomizertech
很抱歉,我不太明白你的意思。当你提到“图标”时,你指的是什么? - Rob Hruska
所以,我需要更新我的控制器,使其类似于您提供的代码吗? - randomizertech
抱歉,在将数据导出到Excel之前,我必须先完成其他工作。在这一行代码中 WorkbookSettings workbookSettings = new WorkbookSettings(),我遇到了一个错误,它显示:density.DensityController: 128: 无法解析类 WorkbookSettings @第128行,第26列。 WorkbookSettings workbookSettings = new WorkbookSettings()。 - randomizertech
确保1)您的控制器具有我的示例中的导入,以及2)jxl jar在类路径上。您把jar文件放在哪里了? - Rob Hruska
显示剩余9条评论

1

Grails导出插件在其所做的事情上表现非常出色:将域对象列表(或查询结果)导出到单个工作表(或页面),支持多种格式,包括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)
}

然而,当我需要的不仅仅是一个简单的列表时,我也使用了Rob建议的JExcel。选择合适的工具才能做好工作。 :-)


0

我已经使用Grails的JXL插件有一段时间了,它完美地工作。

它甚至有一个选项可以将Excel文件写入响应中,这样用户就可以直接通过我的REST服务下载文件。

链接是:http://grails.org/plugin/jxl

以下是创建工作簿的简单示例:

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

您可以在这里找到更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接