C# 将 ListView 导出为 CSV

C# Export ListView to CSV

我需要将 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();
    }

知道我必须做什么吗?

这与 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"));
}