【问题标题】:Export JSON data to Excel sheet using ASP.Net MVC Web Api使用 ASP.Net MVC Web Api 将 JSON 数据导出到 Excel 工作表
【发布时间】:2015-04-22 03:23:52
【问题描述】:

我有一个使用 Durandal、ASP.net MVC Web API、Breeze 和淘汰赛 js 构建的单页应用程序 (SPA)。

我需要将列表导出到 Excel 工作表,单击 html 页面上的按钮应将其下载到下载文件夹。

虽然我已经通过在 javascript 中将 JSON 数据转换为 csv 格式(在客户端)成功地做到了这一点,但如果数据量很大(3000 + 行或者可能在 12000 左右),则需要花费太多时间。

我在通过 Breeze.js 进行的 Web API 调用将 excel 文件作为响应类型发送时遇到问题。

有没有办法以一种应该有点快的方式做到这一点,因为它可能也需要在移动设备上?

编辑

下面是我写的代码——

用于绑定的 JavaScript 代码 -

function exportListToExcel() {                          
    DataContext.exportListToExcel().then(function (data) {
        //Do some stuff.                           
    });
}

在微风中实现的数据上下文文件中,代码正在返回承诺 -

function exportListToExcel() {

    function querySucceeded() {
        //return data;
    }
    return util.sendRequest(config.baseApiPath + 'breeze/MyController/ExportListToExcel')
          .then(querySucceeded)
          .fail(queryFailed);
}

以下代码是发送到 Web API 的请求。不知道应该是HttpPost还是别的什么。

[HttpPost]
public HttpResponseMessage ExportListToExcel()
{
    return ExportListToExcel();
}

下面是后端代码 -

public static HttpResponseMessage ExportListToExcel()
{
    //Method which returns table data. This is working fine though.
    object listObject = GetListData();
    Table listData = (Table)listObject;            
    string attachment = "attachment; filename=Report.xlsx";
    HttpResponseMessage File = new HttpResponseMessage(HttpStatusCode.OK);
    System.Web.HttpContext.Current.Response.ClearContent();
    System.Web.HttpContext.Current.Response.AddHeader("content-disposition", attachment);
    System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";

        StringBuilder str = new StringBuilder();
        str.Append("<table border=`" + "1px" + "`b>");
        str.Append("<tr>");
        foreach (DataColumn dc in listData.Columns)
        {                
            str.Append("<td><b><font face=Arial Narrow size=3>" + dc.ColumnName + "</font></b></td>");                
        }

        str.Append("</tr>");
        foreach (DataRow dr in listData.Rows)
        {
            str.Append("<tr>");                              

            for (int i = 0; i < listData.Columns.Count; i++)
            {
                str.Append("<td><font face=Arial Narrow size=" + "14px" + ">" + dr[i].ToString() + "</font></td>");
            }

            str.Append("</tr>");
        }
        str.Append("</table>");


        byte[] temp = System.Text.Encoding.UTF8.GetBytes(str.ToString());

        //To write the table to the File content.
        File.Content = new StringContent(temp.ToString());

        return File;                                             
    }

但这不起作用,在数据上下文文件中,queryFailed() 方法被执行。

我不知道我哪里出错了,或者我在这里错过了什么。此外,让我知道如何处理 promise 返回的文件/数据会很有帮助。

【问题讨论】:

  • 所以,我们在这篇文章中有很多内容,有必要进行一些澄清。您似乎发现了两个问题:a) 转换时间过长,b) 将 Excel 文件作为响应类型发送时出现问题。当您问“……一种方法……有点快”时,您指的是转换,还是在线时间?我问是因为您提到“移动”。另外,请提供您的响应标头和内容类型配置。如果您能澄清“我在发送时遇到问题...”的意思,这也会有所帮助
  • @EricTaylor 我已经更新了帖子。希望它能让事情变得更清楚。
  • 您可能想看看 Ward 的回答。
  • 我希望有人能回答如何让用户在这样的 SPA 中下载文件。你有想过吗?
  • 很遗憾没有:(

标签: javascript json excel asp.net-web-api breeze


【解决方案1】:

我的直觉是 BreezeJS 是这个特定工作的错误工具……我作为 BreezeJS 的合著者这么说。

麻烦始于范式。我很难将电子表格行视为业务对象通常意义上的“实体”。在我看来,它们更像是简单的数据。

在这个例子中,我们离实体思维还很远。您似乎正在准备一大块 HTML 以在客户端上显示。这没有什么“实体”。

我对你的意图没有异议。但我认为你应该像对待任何其他原始资源(例如图像)一样对待它,并使用任何可用的组件通过简单的 AJAX 获取它。

您可能正在构建一个混合应用程序,其中既有原始数据(或 HTML)又有实体模型。只要您适当地应用,Breeze 就是一款适用于该应用程序的好工具。您的 Breeze 应用程序已经委托给一个低级 AJAX 组件(例如,jQuery.ajax 或 Angular 的 $http),您应该能够在您的代码库中找到该组件并将其直接用于这个特定的 csv 任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多