【问题标题】:Download Excel File with WebAPI/MVC使用 WebAPI/MVC 下载 Excel 文件
【发布时间】:2016-09-02 16:11:51
【问题描述】:

我正在尝试通过 WebAPI 下载 Excel 文件。基本上 Excel 文件是通过内存流在此 Post 的帮助下创建的

Excel 内容生成正常,但是当我在 Chrome 网络工具的响应选项卡中看到响应本身是纯 XML 时,我无法下载 Excel。以下是我的 C# 代码

var sheet = linq.ExportToExcel(userAddedList);

            var stream = new MemoryStream();
            var sw = new StreamWriter(stream);
            sw.Write(sheet);
            sw.Flush();

            var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(stream.GetBuffer()) };
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Report.xml" };
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");

            var response = ResponseMessage(result);
            return response;

这就是我通过 Angular 调用它的方式。

var httpRequest = commonFunctions.getRequestObject("GET", requestURL, {}, null);

        $http(httpRequest).then(function (response) {
            vm.isProcessing = false;
        }, function (error) { displayError(error); });

【问题讨论】:

  • 您正在指定一个 XML 扩展,然后将内容类型设置为 Excel 的 BIFF 版本。你到底期待什么结果?我会看看stackoverflow.com/a/4212908/534109
  • @TiesonT. 正如我提到的,我只是按照帖子中的示例进行操作。无论如何,正如你所建议的,我将扩展名更改为 xls 并将 MIME 类型更改为 application/vnd.ms-excel。没有 AJAX 请求它可以正常工作,但是我很想知道如何使它与 AJAX 一起工作

标签: c# angularjs excel linq asp.net-web-api


【解决方案1】:

如果您的目标浏览器支持文件 API,您可以使用 Blob object。这是,包装在一个函数中,取自this fiddle

var setFile = function( data, fileName, fileType ) {
    // Set objects for file generation.
    var blob, url, a, extension;

    // Get time stamp for fileName.
    var stamp = new Date().getTime();

    // Set MIME type and encoding.
    fileType = ( fileType || "text/csv;charset=UTF-8" );
    extension = fileType.split( "/" )[1].split( ";" )[0];
    // Set file name.
    fileName = ( fileName || "ActiveVoice_" + stamp + "." + extension );

    // Set data on blob.
    blob = new Blob( [ data ], { type: fileType } );

    // Set view.
    if ( blob ) {
        // Read blob.
        url = window.URL.createObjectURL( blob );

        // Create link.
        a = document.createElement( "a" );
        // Set link on DOM.
        document.body.appendChild( a );
        // Set link's visibility.
        a.style = "display: none";
        // Set href on link.
        a.href = url;
        // Set file name on link.
        a.download = fileName;

        // Trigger click of link.
        a.click();

        // Clear.
        window.URL.revokeObjectURL( url );
    } else {
        // Handle error.
    }
};

您可以像这样将它用作代码的一部分:

$http(httpRequest).then(function (response) {
    vm.isProcessing = false;
    setFile(response.data, "Report.xls", "application/ms-excel");
}, function (error) { displayError(error); });

【讨论】:

  • 建议 OP 向 'research/google 寻求 javascript 解决方案' 并仅提供指向第三方库演示的链接既不是完整的回应,也不是答案。这应该是一条评论。
  • @Jeeped - 更新答案更具体。
猜你喜欢
  • 2017-01-24
  • 2016-05-22
  • 2017-03-23
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
相关资源
最近更新 更多