【问题标题】:Proper way to get data from Spring REST API and save as Excel file stream using AngularJS?从 Spring REST API 获取数据并使用 AngularJS 保存为 Excel 文件流的正确方法?
【发布时间】:2016-11-23 10:58:25
【问题描述】:

我们有一些 Spring REST API,它们从我们的后端数据库获取数据并将它们作为 JSON 数据返回给客户端。 AngularJS 是我们现在使用的客户端 JavaScript 框架。现在我们需要将一些数据保存为 Excel 文件,以便客户下载。该文件需要作为流下载,因为某些文件可能很大。这个问题有什么优雅的解决方案吗?

【问题讨论】:

    标签: java angularjs json spring rest


    【解决方案1】:

    我假设您有一个生成 JSON 报告的端点。让我们将其命名为/api/reports/report1。所以这样的请求:

    GET /api/reports/report1 HTTP/1.1
    Accept: application/json
    

    以 JSON 格式返回报告:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=UTF-8
    
    [
        {
            "fullName": "John Doe",
            "annualIncome": 100000
        },
        (...)
    ]
    

    选项 1

    扩展端点以产生application/vnd.ms-excel。所以对话会是这样的:

    GET /api/reports/report1 HTTP/1.1
    Accept: application/vnd.ms-excel
    
    HTTP/1.1 200 OK
    Content-Type: application/vnd.ms-excel
    
    (... binary excel data ...)
    

    如果您想将下载内容嵌入为 HTML 链接,这将无法正常工作,因为那时无法设置 Accept 标头。

    选项 2

    生成下载链接。这将适用于大量下载(正如您提到的那样)。但是,在这种情况下,您将需要一个不同的 URL 用于报告的 Excel 表示形式(例如 /api/reports/report1/excel/api/reports/report1?format=excel)。或者您可以使用 选项 1 并将 Excel 设置为您的 enpoint 的默认 mime(当请求中的 Accept 标头设置为 */* 时)。

    实施

    其他参考

    【讨论】:

    • 感谢您的详细回答。我们已经尝试过 POI 解决方案,当 excel 中有许多单元格时,该解决方案效率不高,尤其是当您需要为所有单元格绘制线条时。我会尝试第一个选项。
    • 您到底遇到了哪些效率问题,“为所有单元画线”是什么意思?预计生成大型电子表格需要一段时间,而 Excel 处理它的速度取决于 Excel。如果您更详细地描述问题,也许我可以帮助您。
    • “为所有单元格画线”是指为所有单元格设置边框和样式,这在我们的测试中非常慢。我们刚刚找到了一种在服务器端呈现 JSP 页面的方法,在客户端我们使用 FileSaver.js 将页面下载为 excel 文件。现在这对我们来说效果很好。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多