ASP.Net 将列表导出为 CSV
ASP.Net Export List to CSV
我有一个非常古老的 asp.net 应用程序,它使用 C# .Net 和 JQuery Mobile,我需要添加 1 个功能:将数据列表导出到 csv file. 到目前为止,我已经整理好了 UI 的东西。我有一个 jquery 按钮,它在请求查询字符串中传递一个参数,以指示在页面加载时我们需要将数据导出到 Excel。我在页面加载事件中也有以下 C#。不幸的是,当我使用 Chrome(或任何浏览器)在 Visual Studio 中 运行 这段代码时,我没有收到保存 csv 文件的提示。当我用 IE 运行 时,出现以下错误:
“第 2371 行未处理的异常,第 4 列 http://localhost:53748/js/libs/jquery-mobile/jquery.mobile-1.0a4.1.js
0x800a138f - Javascript 运行时间 error:Unable 获取 属性 未定义或空引用的“_trigger”。
我不确定我是否正确处理了响应对象的所有内容。
if (Request.QueryString["isExportToExcelRequired"] == "true")
{
StringWriter sw = new StringWriter();
sw.WriteLine("\"ItemID\",\"Description\",\"Price\"");
if (MasterList.Count > 0)
{
for (int i = 0; i < MasterList.Count; i++)
{
sw.WriteLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
MasterList[i].item.ItemID,
MasterList[i].item.ItemDesc,
MasterList[i].P0
));
}
string fileName = string.Format("{0}_{1}", SubClassID, DateTime.UtcNow.ToString("dd-MM-yyyy"));
// Write response.
Response.ClearContent();
Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ".csv");
Response.ContentType = "text/csv";
Response.Write(sw.ToString());
Response.End();
}
}
我会使用 csvHelper。这是一个方便的图书馆。它自 2009 年以来一直存在,所以我想您的应用程序不会太旧而无法从该库中受益。下面是从 List 到 CSV 的基本示例。
你得到的错误是因为不应该为 NULL 的东西确实是 NULL。
运行 它在 visual studio 中并让它抛出异常。通过调试器找到 NULL,然后通过逻辑找出为什么它没有被设置为一个值。
void Export()
{
using (var stream = new MemoryStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
using (var csv = new CsvWriter(writer))
{
foreach (var item in MasterList)
{
foreach (var field in item)
{
csv.WriteField(field);
}
csv.NextRecord();
}
writer.Flush();
stream.Position = 0;
reader.ReadToEnd().Dump();
}
}
按照您的方式编写值的问题是,如果其中一个值包含逗号,会发生什么情况?我为此使用的 NuGet 包是 SoftCircuits.CsvParser。我发现它平均比 CsvHelper 快四倍。
它甚至支持跨越多行的列值并具有其他一些高级功能。
我能够通过使用 Javascript 函数处理 aspx 页面中的 csv 导出来实现此功能。解决方案如下所示:
在onclick事件中调用"download_csv"函数的按钮控件:
<button onclick="download_csv('<%= HttpUtility.JavaScriptStringEncode(csvExport)%>')">Download CSV</button>
注意:csvExport 是来自代码背后的公开声明的 C# 变量,在页面加载时用逗号分隔的数据填充 - 使用 C# 处理数据的格式设置等。
而这个Javascript函数实例化一个隐藏元素并绑定href类型、目标和文件名,然后触发点击事件,从而启动export/download。
function download_csv(priceExport) {
console.log(priceExport);
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(priceExport);
hiddenElement.target = '_blank';
hiddenElement.download = 'pricing.csv';
hiddenElement.click();
}
经过 Chrome 测试,效果非常好。不适用于 IE,但我现在不太担心。
我有一个非常古老的 asp.net 应用程序,它使用 C# .Net 和 JQuery Mobile,我需要添加 1 个功能:将数据列表导出到 csv file. 到目前为止,我已经整理好了 UI 的东西。我有一个 jquery 按钮,它在请求查询字符串中传递一个参数,以指示在页面加载时我们需要将数据导出到 Excel。我在页面加载事件中也有以下 C#。不幸的是,当我使用 Chrome(或任何浏览器)在 Visual Studio 中 运行 这段代码时,我没有收到保存 csv 文件的提示。当我用 IE 运行 时,出现以下错误:
“第 2371 行未处理的异常,第 4 列 http://localhost:53748/js/libs/jquery-mobile/jquery.mobile-1.0a4.1.js
0x800a138f - Javascript 运行时间 error:Unable 获取 属性 未定义或空引用的“_trigger”。
我不确定我是否正确处理了响应对象的所有内容。
if (Request.QueryString["isExportToExcelRequired"] == "true")
{
StringWriter sw = new StringWriter();
sw.WriteLine("\"ItemID\",\"Description\",\"Price\"");
if (MasterList.Count > 0)
{
for (int i = 0; i < MasterList.Count; i++)
{
sw.WriteLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
MasterList[i].item.ItemID,
MasterList[i].item.ItemDesc,
MasterList[i].P0
));
}
string fileName = string.Format("{0}_{1}", SubClassID, DateTime.UtcNow.ToString("dd-MM-yyyy"));
// Write response.
Response.ClearContent();
Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ".csv");
Response.ContentType = "text/csv";
Response.Write(sw.ToString());
Response.End();
}
}
我会使用 csvHelper。这是一个方便的图书馆。它自 2009 年以来一直存在,所以我想您的应用程序不会太旧而无法从该库中受益。下面是从 List 到 CSV 的基本示例。
你得到的错误是因为不应该为 NULL 的东西确实是 NULL。 运行 它在 visual studio 中并让它抛出异常。通过调试器找到 NULL,然后通过逻辑找出为什么它没有被设置为一个值。
void Export()
{
using (var stream = new MemoryStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
using (var csv = new CsvWriter(writer))
{
foreach (var item in MasterList)
{
foreach (var field in item)
{
csv.WriteField(field);
}
csv.NextRecord();
}
writer.Flush();
stream.Position = 0;
reader.ReadToEnd().Dump();
}
}
按照您的方式编写值的问题是,如果其中一个值包含逗号,会发生什么情况?我为此使用的 NuGet 包是 SoftCircuits.CsvParser。我发现它平均比 CsvHelper 快四倍。
它甚至支持跨越多行的列值并具有其他一些高级功能。
我能够通过使用 Javascript 函数处理 aspx 页面中的 csv 导出来实现此功能。解决方案如下所示:
在onclick事件中调用"download_csv"函数的按钮控件:
<button onclick="download_csv('<%= HttpUtility.JavaScriptStringEncode(csvExport)%>')">Download CSV</button>
注意:csvExport 是来自代码背后的公开声明的 C# 变量,在页面加载时用逗号分隔的数据填充 - 使用 C# 处理数据的格式设置等。
而这个Javascript函数实例化一个隐藏元素并绑定href类型、目标和文件名,然后触发点击事件,从而启动export/download。
function download_csv(priceExport) {
console.log(priceExport);
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(priceExport);
hiddenElement.target = '_blank';
hiddenElement.download = 'pricing.csv';
hiddenElement.click();
}
经过 Chrome 测试,效果非常好。不适用于 IE,但我现在不太担心。