export-to-csv - 如何在 asp.net Web 表单中使用 CsvHelper 在下载/流功能中创建 csv 文件
问题描述
我在按钮单击事件中使用以下代码。与 data 一起,网页 html 正在进入 csv 文件。
var data = new[]
{
new Project { CustomerName = "Big Corp", Title = "CRM updates", Deadline = DateTime.Today.AddDays(-2) },
new Project { CustomerName = "Imaginary Corp", Title = "Sales system", Deadline = DateTime.Today.AddDays(1) }
};
Response.ClearContent();
Response.ContentType = "application/csv";
Response.AddHeader("content-disposition", @"attachment;filename=""export.csv""");
var preamble = Encoding.UTF8.GetPreamble();
Response.OutputStream.Write(preamble, 0, preamble.Length);
using (var writer = new StreamWriter(Response.OutputStream))
using (var csvWriter = new CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture))
{
//csvWriter.Configuration.Delimiter = Environment.NewLine;
csvWriter.Configuration.HasHeaderRecord = true;
csvWriter.Configuration.AutoMap<Project>();
//csvWriter.WriteHeader<Project>();
//csvWriter.WriteRecords(data);
csvWriter.Configuration.Delimiter = ",";
csvWriter.WriteField("CustomerName");
csvWriter.WriteField("Title");
csvWriter.WriteField("Deadline");
csvWriter.NextRecord();
foreach (var project in data)
{
csvWriter.WriteField(project.CustomerName);
csvWriter.WriteField(project.Title);
csvWriter.WriteField(project.Deadline);
csvWriter.WriteField(Environment.NewLine);
csvWriter.NextRecord();
}
csvWriter.Flush();
writer.Flush();
}
解决方案
尝试添加Response.End();
using (var writer = new StreamWriter(Response.OutputStream))
using (var csvWriter = new CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture))
{
csvWriter.Configuration.HasHeaderRecord = true; // Only used with WriteRecords(), defaults to true.
csvWriter.Configuration.AutoMap<Project>(); // This is used to create a ClassMap. CsvWriter will use AutoMap if no map is passed to it.
csvWriter.Configuration.Delimiter = ",";
csvWriter.WriteField("CustomerName");
csvWriter.WriteField("Title");
csvWriter.WriteField("Deadline");
csvWriter.NextRecord();
foreach (var project in data)
{
csvWriter.WriteField(project.CustomerName);
csvWriter.WriteField(project.Title);
csvWriter.WriteField(project.Deadline);
csvWriter.WriteField(Environment.NewLine); // Not necessary. NextRecord() adds a newline. This will add a newline as a field in quotes.
csvWriter.NextRecord();
}
csvWriter.Flush(); // You almost never want to use this. Mostly used by the backend code. NextRecord calls Flush() to serialize the row to the TextWriter.
writer.Flush(); // The using statement will do this for you.
}
Response.End();
您可以让自己更轻松,只需使用WriteRecords()
. 唯一需要的配置是csvWriter.Configuration.Delimiter = ",";
如果 CurrentCulture
使用不同的分隔符。否则,您添加的所有其他配置都是默认配置。
using (var writer = new StreamWriter(Response.OutputStream))
using (var csvWriter = new CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture))
{
csvWriter.Configuration.Delimiter = ",";
csvWriter.WriteRecords(data);
}
Response.End();
推荐阅读
- mysql - 角8 | 用户认证
- android - 我是否需要重新编译 TensorFlow 才能更改 android SDK 和 NDK 的版本?
- swift - “类别”(又名“OpaquePointer”)类型的值没有成员“名称”
- java - 凯撒加密。73 中的索引 73 中的数组超出范围
- docker - 可以使用 logstash.yml 文件将 logstash 容器日志配置到特定路径吗?
- firebase - Firebase/Flutter:reload() 不刷新 user.isEmailVerified
- java - 如何在 Gradle 中查看我的依赖包的所有类名?
- gstreamer - 缺少元素:MPEG4-GENERIC 音频 RTP depayloader Gstreamer
- kubernetes - 让 Istio 忽略同一部署中两个容器之间的连接
- java - Java:用流替换 forEach 循环