Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)

Sure!

前言

在Web开发中,我们经常会遇到需要生成Excel文件并提供下载的需求。ASP.NET提供了丰富的接口和库来支持Excel文件的生成和操作。本文将介绍如何通过ASP.NET生成Excel文件,并提供下载链接。

准备工作

在进行生成Excel文件的操作前,需要安装并引用一些库文件:

  1. EPPlus:一款开源的Excel处理库,支持Excel 2007及以上版本的文件操作,包括写入、读取、格式化等,NuGet包名称为EPPlus
  2. Microsoft.AspNet.WebApi.Core:ASP.NET WebApi核心库,NuGet包名称为Microsoft.AspNet.WebApi.Core

可以使用NuGet Package Manager直接安装,也可以手动下载并安装。

生成Excel文件代码示例

在准备工作完成后,接下来我们就可以编写生成Excel文件的代码了。

public class ExcelController : ApiController
{
    [HttpGet]
    public HttpResponseMessage Download()
    {
        // 创建Excel文件
        var file = new FileInfo(@"C:\Sample.xlsx");
        using (var package = new ExcelPackage(file))
        {
            // 添加工作表
            var worksheet = package.Workbook.Worksheets.Add("Sample");

            // 设置单元格内容和格式
            worksheet.Cells[1, 1].Value = "ID";
            worksheet.Cells[1, 2].Value = "Name";
            worksheet.Cells[1, 3].Value = "Age";
            worksheet.Cells[1, 4].Value = "Gender";
            worksheet.Cells[1, 1, 1, 4].Style.Font.Bold = true;

            worksheet.Cells[2, 1].Value = "1";
            worksheet.Cells[2, 2].Value = "张三";
            worksheet.Cells[2, 3].Value = "23";
            worksheet.Cells[2, 4].Value = "男";

            worksheet.Cells[3, 1].Value = "2";
            worksheet.Cells[3, 2].Value = "李四";
            worksheet.Cells[3, 3].Value = "25";
            worksheet.Cells[3, 4].Value = "女";

            worksheet.Cells.AutoFitColumns();
            worksheet.DefaultColWidth = 20;

            // 保存Excel文件
            package.Save();
        }

        // 获取文件内容
        var stream = new MemoryStream();
        using (var fileStream = new FileStream(@"C:\Sample.xlsx", FileMode.Open, FileAccess.Read))
        {
            fileStream.CopyTo(stream);
        }
        stream.Position = 0;

        // 创建响应
        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(stream)
        };
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "Sample.xlsx"
        };

        return response;
    }
}

以上代码演示了如何生成一个包含数据的Excel文件,并将其保存到文件中。接下来,我们将该文件内容放到MemoryStream中,并响应给客户端。

关键点说明:

  1. 通过创建ExcelPackage对象,可以方便地操作Excel文件,进行单元格数据的添加、格式化等操作。
  2. 创建HttpResponseMessage对象,将文件内容放到其Content属性中即可。

下载Excel文件代码示例

上面的代码演示了如何生成Excel文件,而接下来,我们需要将其提供给客户端进行下载。

public class DownloadController : ApiController
{
    [HttpGet]
    public HttpResponseMessage Get(string fileName)
    {
        var filePath = Path.Combine(@"C:\Downloads", fileName);

        if (!File.Exists(filePath))
        {
            return new HttpResponseMessage(HttpStatusCode.NotFound);
        }

        var stream = new MemoryStream();
        using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            fileStream.CopyTo(stream);
        }
        stream.Position = 0;

        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(stream)
        };
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = fileName
        };

        return response;
    }
}

以上代码演示了如何提供Excel文件的下载链接。其中,查询参数中的fileName参数指定下载的文件名。

关键点说明:

  1. ContentType的值根据文件类型进行设置,Excel文件的类型为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  2. ContentDisposition属性用于设置下载的文件名。

疑难问题解决

使用迅雷下载时,会下载到页面而不是Excel文件。

问题分析:可能是由于响应中的ContentType不正确所致。

解决方案:将响应中的ContentType设为application/octet-stream 即可:

var response = new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StreamContent(stream)
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = fileName
};

以上就是本文介绍的生成Excel文件并提供下载的方法和示例代码。希望对大家有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题) - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • asp.net 临时数据保存实现代码

    针对“asp.net 临时数据保存实现代码”的问题,下面是一份详细攻略: 1. 前置知识 在开始这个攻略之前,我们需要掌握以下几个asp.net的知识点: Session机制:它能够在一个用户会话中存储和检索变量的信息。 ViewState机制:它可以在一个ASP.NET Web页面中用于在一些控件之间保存状态信息,从而避免了在每次Post请求时重新获取页面…

    C# 2023年5月31日
    00
  • ASP.NET Core处理管道的深入理解

    ASP.NET Core处理管道的深入理解 在本攻略中,我们将深入理解ASP.NET Core处理管道的工作原理和使用方法。我们将介绍ASP.NET Core处理管道的组成部分、中间件的作用和使用方法,并提供两个示例说明。 处理管道的组成部分 ASP.NET Core处理管道由以下三个组成部分组成: 请求管道:处理HTTP请求的管道。 响应管道:处理HTTP…

    C# 2023年5月16日
    00
  • C#使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化

    序列化是将对象转换为一种格式,以便在需要时可以将其反序列化为原始对象。C#中使用以下三种方式进行序列化和反序列化: BinaryFormatter类:将对象序列化为二进制格式,是.NET中最常用的序列化方式,可以将序列化后的数据存储到磁盘、内存或网络中。 XmlSerializer类:将对象序列化为XML格式,适合在不同平台间传输数据。 ISerializa…

    C# 2023年5月31日
    00
  • C#实现动态数据绘图graphic的方法示例

    我来详细讲解一下“C#实现动态数据绘图graphic的方法示例”的攻略。 1. 概述 动态数据绘图是指对不断变化的数据进行可视化展示。C#的Graphic类提供了丰富的绘图方法,可以轻松实现动态数据的展示效果。本文将介绍如何使用Graphic类实现动态数据绘图功能。 2. 实现过程 2.1 准备工作 要使用Graphic类进行动态数据绘图,我们首先需要创建一…

    C# 2023年5月31日
    00
  • 记一次 .NET某医疗器械清洗系统 卡死分析

    一:背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题,回过头来看这个案例比较经典,这篇稍微整理一下供后来者少踩坑吧。 二:WinDbg 分析 1. 为什么会卡死 因为是窗体程序,理所当然就是看主线程此时正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ChildEBP RetAddr 00 00aff1…

    C# 2023年4月18日
    00
  • 正则基础之 \b 单词边界

    正则表达式中,\b 表示单词边界,常用于匹配单词或单词的开头和结尾。单词边界指的是一个单词与其他字符之间的分界点,通常是单词的开头或结束位置。 \b 的匹配规则如下: 如果 \b 出现在正则表达式的开头或结尾,则它匹配的是单词边界位置。 如果 \b 出现在正则表达式中间,则它匹配的是单词边界的位置,即左侧字符和右侧字符一个属于单词字符,一个不属于单词字符。 …

    C# 2023年6月7日
    00
  • 浅谈C#中Md5和Sha1两种加密方式

    浅谈C#中Md5和Sha1两种加密方式 简介 在C#中,常用的加密方式有Md5和Sha1两种。Md5和Sha1都是基于哈希算法实现的加密方式,都可以将任意长度的消息摘要为一定长度的输出,同时具有不可逆性和唯一性。但Md5的输出长度为128比特(16字节),而Sha1的输出长度为160比特(20字节)。 使用场景 Md5和Sha1常用于数据传输的加密或者对数据…

    C# 2023年6月8日
    00
  • C# winForm自定义弹出页面效果

    接下来我将详细讲解C# WinForm自定义弹出页面效果的完整攻略。我们可以通过以下步骤实现: 1. 创建自定义控件 首先,我们需要创建一个继承自Panel的自定义控件,并设置其BorderStyle为None,这样就可以去掉控件的边框。 public class CustomPanel : Panel { public CustomPanel() { th…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部