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

Export JSON data to Excel sheet using ASP.Net MVC Web Api

本文关键字:Excel 工作 数据 JSON Net ASP MVC Web Api 使用      更新时间:2024-02-04

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

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

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

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

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

编辑

下面是我写的代码-

用于绑定的JavaScript代码-

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

在微风中实现的数据上下文文件中,代码返回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()方法。

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

我的直觉是BreezeJS对于这个特定的工作来说是错误的工具。。。作为BreezeJS的合著者,我这样说。

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

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

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

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