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