导出到Excel无法工作

3

我遇到了一些问题,需要使用AngularJS和ASP.NET MVC将内容导出为可下载的Excel文件。但是我的结果是什么都没有发生。

示例ASP.NET Controller方法:

[HttpPost]
public ActionResult ExportToExcel(Model form)
{
    var gv = new GridView();
    gv.DataSource = _service.getSomeStuff(form);
    gv.DataBind();
    Response.ClearContent();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", "attachment; filename=Stuff.xls");
    Response.ContentType = "application/ms-excel";
    Response.Charset = "";
    var sw = new StringWriter();
    var htw = new HtmlTextWriter(sw);
    gv.RenderControl(htw);
    Response.Output.Write(sw.ToString());
    Response.Flush();
    Response.End();

    byte[] temp = System.Text.Encoding.UTF8.GetBytes(sw.ToString());
    return File(temp, "application/ms-excel");
}

Angular控制器方法:-> 通过ng-click处理程序触发

function exportToExcel() {
    $http.post('/Controller/ExportToExcel/', vm.Model)
           .success(function (data) {
           })
           .error(function (data) {
                alerts.error(data);
            });
}

查看:

<a href="" ng-click="vm.exportToExcel()">click me</a>

有什么建议我做错了吗?

1
你在返回文件之前调用了 Response.End()。我想这会导致问题。 - DLeh
@user167698,使用以下任一代码:Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=Stuff.xls"); Response.ContentType = "application/ms-excel"; Response.Charset = ""; var sw = new StringWriter(); var htw = new HtmlTextWriter(sw); gv.RenderControl(htw); Response.Output.Write(sw.ToString()); Response.Flush(); Response.End(); 或者byte[] temp = System.Text.Encoding.UTF8.GetBytes(sw.ToString()); return File(temp, "application/ms-excel");。不要同时使用两个。 - yW0K5o
很不幸,我已经尝试使用Response.End()和不使用它。结果没有任何区别。如果从标准表单提交调用,“ExportToExcel(Model form)”方法似乎可以产生一个下载。 - user167698
似乎这样也可以。function exportToExcel() { $http.post('/Controller/ExportToExcel/', Model) .success(function (data) { var element = angular.element('<a/>'); element.attr({ href: 'data:application/ms-excel;charset=utf-8,' + encodeURI(data), target: '_blank', download: 'file.xslt' })[0].click(); }) .error(function (data) { alerts.error(data); }); } - user167698
1个回答

0

我已经做了类似的事情,而不需要使用AJAX或任何JS。只需要调整Razor代码即可。

其次,我的个人建议是根本不要转换为Excel文件。原因是用户需要在本地机器上安装Office。这也意味着,如果您将项目上传到网站,则服务器机器需要安装Office才能生成您的Excel文件。

话虽如此,我建议只使用CSV文件。如果用户安装了Office,则可以像任何电子表格一样使用Excel查看该文件。

以下是一些代码,它将使用StringBuilderReflection从您的dbcontext中的dbset创建名为Export.csv的CSV文件。

public ActionResult Export()
    {
        StringBuilder str = new StringBuilder();
        var tmp = db.Users.FirstOrDefault();     
        Type comp = tmp.GetType();                // get type
        foreach (PropertyInfo prop in comp.GetProperties())
        {
            str.Append(prop.Name + ",");          //set column names
        }
        str.Replace(",", "\n", str.Length - 1, 1);
        foreach (object item in db.Users)
        {
            foreach (PropertyInfo prop in item.GetType().GetProperties())
            {
                try
                {
                    string a = prop.GetValue(item, null).ToString();
                    str.Append(a + ",");
                }
                catch (NullReferenceException)
                {
                    str.Append("null" + ",");           //for nulls, append string with "null"
                }
            }
            str.Replace(",", "\n", str.Length - 1, 1);
        }
        string csv = str.ToString();
        return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "Export.csv");
    }

然后你可以通过视图上的链接访问并下载文件,就像这样:

<a href="@Url.Action("Export", "Controller")">click me</a>

希望这有所帮助。

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