【问题标题】:C# Export ListView to CSVC# 将 ListView 导出为 CSV
【发布时间】:2020-11-10 17:35:49
【问题描述】:

我需要将 ListView 导出到 csv,我从这个答案中找到了解决方案。Here
问题是我将整行写成一列。

我知道了:

我需要这个:

代码如下:

   public static void ListViewToCSV(ListView listView, string filePath, bool includeHidden)
    {
        //make header string
        StringBuilder result = new StringBuilder();
        WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listView.Columns[i].Text);

        //export data rows
        foreach (ListViewItem listItem in listView.Items)
            WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listItem.SubItems[i].Text);

        File.WriteAllText(filePath, result.ToString());
    }

    private static void WriteCSVRow(StringBuilder result, int itemsCount, Func<int, bool> isColumnNeeded, Func<int, string> columnValue)
    {
        bool isFirstTime = true;
        for (int i = 0; i < itemsCount; i++)
        {
            if (!isColumnNeeded(i))
                continue;

            if (!isFirstTime)
                result.Append(",");
            isFirstTime = false;

            result.Append(String.Format("\"{0}\"", columnValue(i)));
        }
        result.AppendLine();
    }

任何想法我必须做什么?

【问题讨论】:

  • ListView 只是一个 UI 控件,用于显示多属性/列数据。这不是数据本身。如果要导出该数据,请使用 CsvHelper 之类的库,甚至使用手写代码来导出 数据,而不是控件。
  • 如果您的数据是数据项的集合,例如List&lt;Customer&gt;,则导出它很容易。您可以将每个值写入文件,也可以使用CsvHelper 和对CsvWriter.WriteRecords(myCustomers) 的一次调用
  • 顺便说一句,您发布的内容并未显示 CSV 存在任何问题。它显示尝试使用错误设置在 Excel 中打开 CSV。您可以使用 Epplus 生成真正的 Excel 文件。同样,生成文件就像调用 sheet.Cells.LoadFromCollection 一样简单
  • @jdweng 在这种情况下,真正的问题是 OP 试图在非美国语言环境中的 Excel 中打开文件。这与 CSV 完全无关
  • @Karoliuakas 这与 CSV 无关,它 100% 与 Excel 和最终用户的区域设置有关。

标签: c# csv split export-to-csv


【解决方案1】:

这与 CSV 无关。第一个屏幕截图显示了一个非常好的 CSV。它还显示了在 Excel 中打开该文件的尝试。

Excel 将使用最终用户的 语言环境来决定要使用的列、小数分隔符和日期格式。当您双击文本文件时,Excel 将使用最终用户的区域设置作为默认值导入该数据。

在大多数欧洲国家/地区,, 是小数分隔符,因此它也不能用作列表分隔符。否则你不会知道100,00,234 是什么意思。是 2 列还是 3 列?

在这种情况下,典型的列表分隔符是;。这是在最终用户的区域设置中指定的。在大多数欧洲国家你会看到100,00;234

如果您希望最终用户能够通过双击在 Excel 中打开生成的文件,您必须使用列表与其区域设置匹配的小数分隔符。

更好的选择是生成真正的 Excel 文件,例如Epplus。它不需要在客户端或服务器上安装 Excel,并生成真正的 Excel (xlsx) 文件。

导出数据就像调用以下代码一样简单:

using (var pck = new ExcelPackage())
{
    var sheet = pck.Workbook.Worksheets.Add("sheet");
    sheet.Cells["C1"].LoadFromCollection(items);
    pck.SaveAs(new FileInfo(@"c:\workbooks\myworkbook.xlsx"));
}

【讨论】:

  • 同意!我不知道为什么有些人还在想:“csv 是一个 Excel 文件”。 +1!
  • @MaciejLos 不要谴责我,我是新手:/
  • @Panagiotis 当我从 , 更改为 ; 时它帮助了我 再次感谢您 :)
  • @Karoliuakas,对不起,这根本不是我的本意。我已经看到了大量关于 csv 与 MS Excel 相关的问题。这就是我发表这种观点的原因。
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2012-08-12
  • 2013-01-08
相关资源
最近更新 更多