使用ASP.Net MVC Web Api将JSON数据导出到Excel工作表

时间:2015-02-20 12:33:36

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

我有一个使用Durandal,ASP.net MVC Web API,Breeze和knockout 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.                           
    });
}

在breeze中实现的数据上下文文件中,代码返回了promise -

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()方法。

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

1 个答案:

答案 0 :(得分:0)

我的直觉是BreezeJS是这项工作的错误工具......我说这是BreezeJS的合着者。

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

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

我没有与你的意图争吵。但我认为你应该像处理任何其他原始资源(例如图像)那样对待它,并使用简单的AJAX使用任何可用的组件来获取它。

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