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,但我现在不太担心。