[ASP.NET Core 3] 使用 Entity Framework Core 下载 CSV 文件

您好,我是系统开发部的永谷。
我目前正在使用 ASP.NET Core,特别是 Entity Framework Core 3 进行开发,并且我已经实现了一个功能,允许用户通过单击按钮将从数据库中检索的数据下载为 CSV 文件。

这次,我将介绍如何实现它。

创建项目

首先,创建一个 ASP.NET Core 3 MVC 项目。

1. 打开 Visual Studio 2019。2
. 选择“创建新项目”。3

. 选择“ASP.NET Core Web 应用程序”。4

. 输入您选择的项目名称并创建它(在本例中使用了“CsvDownload”)。

项目现已创建完成。

启用 ASP.NET Core 3 使用 Entity Framework Core 3

官方文档,请参考该教程来配置 Entity Framework Core 3。
由于本文的目的仅在于演示如何实现 CSV 文件下载,因此我们将省略教程的细节。

准备数据

首先,我们需要准备要下载为 CSV 文件的数据,因此我们将使用 Entity Framework Core 3 创建一个表并插入数据。

■ 准备数据表
这次,我们将创建一个名为 Users 的数据表。
列包括
:Id(主键)、
Name(姓名)、
Age(年龄)、
Height(身高)
、Weight(体重)。

我们开始做吧。

■ 创建用户模型
接下来,为了创建上面提到的表,我们需要准备一个用户模型。
在 Models 文件夹中创建 User.cs 文件。

打开创建的 User.cs 文件,并按照以下代码定义列属性。

namespace CsvDownload.Models { ///<summary> /// 用户表的模型类 ///</summary> public class User { public int Id { get; set; } // ID 主键 public string Name { get; set; } // 姓名 public int Age { get; set; } // 年龄 public float Height { get; set; } // 身高 public float Weight { get; set; } // 体重 } }

■ 创建上下文文件
接下来,我们将准备一个上下文文件来连接数据库和模型。
在本例中,我们在项目目录下创建了 Context.cs 文件。

请在创建的 Context.cs 文件中编写以下代码。

using CsvDownload.Models; using Microsoft.EntityFrameworkCore; namespace CsvDownload { ///<summary> /// 用于连接数据库的上下文类 ///</summary> public class Context : DbContext { public Context(DbContextOptions<Context> options) : base(options) { } // 设置模型 public DbSet<User>用户 { 获取; 设置; } // 属性名将成为表名(在本例中,将创建一个名为 Users 的表) } }

■ 将创建的上下文文件添加到依赖注入容器中,以便将其用作 Entity Framework Core。
接下来,将刚刚创建的上下文添加到 Startup.cs 文件中的 ConfigureServices 方法中。

services.AddDbContext<Context> (options => options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=CsvDownload;Trusted_Connection=True;MultipleActiveResultSets=true"));

*输入任意数据库连接字符串(UseSqlServer 部分)。如果您没有特别的偏好设置,上述说明将在您的本地环境中创建一个 CsvDownload 数据库。

■ 创建迁移文件
现在一切准备就绪,下一步是创建用于创建 Users 表的迁移文件。
只需在控制台运行一个命令即可轻松创建该文件。

从“工具”菜单打开软件包管理器控制台

控制台打开后,运行以下命令:

PM> 添加迁移 CreateTableUsers

*Add-Migration 后面的名称是迁移名称。请根据需要进行设置。

这将创建一个名为“迁移”的文件夹,其中包含迁移文件和迁移快照文件。

■ 执行迁移
与创建迁移文件时一样,在控制台中执行命令。
执行迁移的命令如下:

PM> 更新数据库

如果成功,数据库将被创建,Users 表也将被创建。
*您可以通过转到 [查看] ⇒ [SQL Server 对象资源管理器] 来验证这一点。

■ 插入数据
表创建完成后,您可以根据需要插入数据。
* 您也可以从 [SQL Server 对象资源管理器] 中选择该表,然后单击 [显示数据] 以显示表中的数据,并直接从中插入数据。


实现 CSV 下载功能

抱歉让您久等了……现在我们终于要说到重点了。
我们要实现将刚刚插入的 Users 表中的数据下载为 CSV 文件的功能。


首先安装 CsvHelper 程序包,这是下载 CSV 格式文件所必需的。
依次点击【工具】⇒【NuGet 程序包管理器】⇒【管理解决方案的 NuGet 程序包】。输入

CsvHelper 并选择【CsvHelper】进行安装。

■ 添加 CSV 下载按钮
这次,我们来向默认主屏幕添加一个按钮。
打开 [视图] 文件夹 ⇒ [首页] ⇒ [index.cshtml]

使用如下所示的 a 标签,向“查看文件”添加 CSV 下载按钮。

@{ ViewData["Title"] = "首页"; }<div class="text-center"><h1 class="display-4">欢迎</h1><p>了解如何<a href="https://docs.microsoft.com/aspnet/core">使用 ASP.NET Core 构建 Web 应用程序</a>。</p> @*添加 CSV 下载按钮*@<a asp-action="CsvDownload" class="btn btn-primary">用户 CSV 下载</a></div>

*通过在 a 标签中使用 asp-action 指定 Controller 操作,href 属性将自动填充。

来实现 CSV 下载流程
我们已经添加了一个按钮
由于我们之前已将 Action 设置为 CsvDownload,因此让我们在 HomeController 中添加一个 CsvDownload Action,并在其中实现 CSV 下载流程。

打开 [Controllers] 文件夹 ⇒ [HomeController.cs]
并添加如下所示的 CsvDownload 操作。

using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using CsvDownload.Models; // 添加 using using System.IO; using CsvHelper; using System.Globalization; namespace CsvDownload.C​​ontrollers { public class HomeController : Controller { private readonly ILogger<HomeController> _logger; 私有只读上下文 _context; 公共 HomeController(ILogger<HomeController> public IActionResult Index() { return View(); } public IActionResult Privacy() { return View(); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } ///<summary> /// CSV 下载 ///</summary> ///<returns> CSV 文件</returns>public FileContentResult CsvDownload() { // CSV 文件名 string csvFileName = "UserData.csv"; // 使用内存分配 using (var memory = new MemoryStream()) using (var writer = new StreamWriter(memory)) using (var csv = new CsvWriter(writer, new CultureInfo(0x0411, false))) { // 使用上下文获取 Users 表的数据 List<User> users = _context.Users.ToList(); // 记录检索到的数据 csv.WriteRecords(users); writer.Flush(); // 输出为 CSV 文件 return File(memory.ToArray(), "text/csv", csvFileName); } } } }

■ 功能检查
现在我们已经完成了所有实现,接下来进行功能检查。
构建项目并打开主屏幕。
此时会显示“[下载用户 CSV]”按钮,点击即可下载 CSV 文件。

打开文件后,您可以确认 Users 表中的数据已注册,如下所示。

您现在可以下载 CSV 文件了。
以上是对整个流程的概述。

评论

■ 您可能希望
从 CSV 下载中排除某些列,例如 ID 列。
在这种情况下,您可以将 [ignore] 属性添加到您不想包含在模型类中的列(属性)上(您需要添加 `using CsvHelper.Configuration.Attributes;`)。

using CsvHelper.Configuration.Attributes; namespace CsvDownload.Models { ///<summary> /// 用户表的模型类 ///</summary> public class User { [忽略] public int Id { get; set; } // ID 主键 public string Name { get; set; } // 姓名 public int Age { get; set; } // 年龄 public float Height { get; set; } // 身高 public float Weight { get; set; } // 体重 } }

这样可以防止在下载文件时输出 ID 列。

■ 如何更改标题名称
目前,标题输出是模型属性的名称,但也可以更改。
为此,只需将 [Name] 特性添加到要更改的属性即可。

using CsvHelper.Configuration.Attributes; namespace CsvDownload.Models { ///<summary> /// 用户表的模型类 ///</summary> public class User { [Ignore] public int Id { get; set; } // ID 主键 [Name("Name")] public string Name { get; set; } // 姓名 [Name("Age")] public int Age { get; set; } // 年龄 [Name("Height")] public float Height { get; set; } // 身高 [Name("Weight")] public float Weight { get; set; } // 体重 } }

现在下载文件后,你会发现文件头已经更改。

概括

您觉得怎么样?
正如您所见,CSV 下载功能在管理系统等软件中是一个经常需要的功能,所以我希望这篇文章对您有所帮助。

最后

我已推出“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、构建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

我们的演讲到此结束。
非常感谢!

如果您觉得这篇文章对您有帮助,请点个“赞”!
0
加载中...
0票,平均分:0.00/10
5,986
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

长谷达也

应届毕业生加入 Beyond Co., Ltd.。

我们开发网络系统(开发基于浏览器的服务和系统,例如网络服务、数字内容和业务管理系统)和游戏 API(开发用于与应用程序游戏通信的程序)。

我们也为 Shopify 开发私有/定制应用程序。

最初在大阪办公室工作,2019 年调到横滨办公室。
爱好:棒球、卡拉OK、动漫。