Files
6098/Cowain.Bake.Common/Core/CSVHelper.cs

274 lines
9.2 KiB
C#

using CsvHelper;
using CsvHelper.Configuration;
using Microsoft.Win32;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.IO;
namespace Cowain.Bake.Common.Core
{
public class CSVHelper
{
public static void WriteDataTableToCsv<T>(IEnumerable<T> list)
{
string filePath = GetFilePath();
if (string.IsNullOrEmpty(filePath))
{
return;
}
using (var writer = new StreamWriter(filePath))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(list);
}
}
//列头是中文,所有字段都写入
public static void WriteDataTableToCsv<T>(IEnumerable<T> list, List<string> nameCols)
{
string filePath = GetFilePath();
if (string.IsNullOrEmpty(filePath))
{
return;
}
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
// 设置列头编码为UTF8以支持中文
Encoding = System.Text.Encoding.UTF8,
// 设置不写入列头
HasHeaderRecord = false
};
using (var writer = new StreamWriter(filePath, false, System.Text.Encoding.UTF8))
using (var csv = new CsvWriter(writer, config))
{
// 写入列头,使用中文列名
foreach(var col in nameCols)
{
csv.WriteField(col);
}
csv.NextRecord();
// 写入数据行
csv.WriteRecords(list);
}
}
// 将List的特定列写入CSV文件的方法
public static void WriteDataTableToCsv<T>(IEnumerable<T> list, IEnumerable<string> columnsToSave)
{
string filePath = GetFilePath();
if (string.IsNullOrEmpty(filePath))
{
return;
}
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
// 设置列头编码为UTF8以支持中文
Encoding = System.Text.Encoding.UTF8,
// 设置不写入列头
HasHeaderRecord = false
};
using (var writer = new StreamWriter(filePath, false, System.Text.Encoding.UTF8))
using (var csv = new CsvWriter(writer, config))
{
// 写入列头
foreach (var columnName in columnsToSave)
{
csv.WriteField(columnName);
}
csv.NextRecord();
// 写入特定列数据
foreach (var person in list)
{
foreach (var columnName in columnsToSave)
{
var property = typeof(T).GetProperty(columnName);
if (property != null)
{
csv.WriteField(property.GetValue(person));
}
}
csv.NextRecord();
}
}
}
static string GetFilePath()
{
string filePath = "";
//创建一个保存文件式的对话框
SaveFileDialog saveFileDialog = new SaveFileDialog();
//设置保存的文件的类型,注意过滤器的语法
saveFileDialog.Filter = "CSV|*.csv";
if (saveFileDialog.ShowDialog() == true)
{
filePath = saveFileDialog.FileName;
}
return filePath;
}
public static void WriteMap<T, TMap>(IEnumerable<T> list, string filePath) where TMap : ClassMap
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
// 设置列头编码为UTF8以支持中文
Delimiter = ",",
HasHeaderRecord = true,
Encoding = System.Text.Encoding.UTF8
};
if (File.Exists(filePath))
{
config.HasHeaderRecord = false; // 获取字段描述作为列头
}
using (var writer = new StreamWriter(filePath, true, System.Text.Encoding.UTF8))
using (var csv = new CsvWriter(writer, config))
{
// 注册自定义映射
//csv.Context.RegisterClassMap<BatteryInfoMap>();
csv.Context.RegisterClassMap<TMap>();
// 写入记录
csv.WriteRecords(list);
}
}
public static void WriteMap<T, TMap>(IEnumerable<T> list ) where TMap : ClassMap //where TMap : ClassMap<T> // 约束:必须是 ClassMap<T> 或其子类
{
string filePath = GetFilePath();
if (string.IsNullOrEmpty(filePath))
{
return;
}
WriteMap<T, TMap>(list, filePath);
}
// 将List的特定列写入CSV文件的方法
public static void WriteDataTableToCsv<T>(IEnumerable<T> list, IEnumerable<string> columnsToSave, IEnumerable<string> columnsToShow)
{
string filePath = GetFilePath();
if (string.IsNullOrEmpty(filePath))
{
return;
}
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
// 设置列头编码为UTF8以支持中文
Encoding = System.Text.Encoding.UTF8,
HasHeaderRecord = false
};
using (var writer = new StreamWriter(filePath, false, System.Text.Encoding.UTF8))
using (var csv = new CsvWriter(writer, config))
{
// 写入列头
foreach (var columnName in columnsToShow)
{
csv.WriteField(columnName);
}
csv.NextRecord();
// 写入特定列数据
foreach (var person in list)
{
foreach (var columnName in columnsToSave)
{
var property = typeof(T).GetProperty(columnName);
if (property != null)
{
csv.WriteField(property.GetValue(person));
}
}
csv.NextRecord();
}
}
}
// 将List的特定列写入CSV文件的方法
public static void WriteDataTableToCsv<T>(IEnumerable<T> list, IEnumerable<string> columnsToSave, IEnumerable<string> columnsToShow, string filePath)
{
bool isFileExists = false;
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
// 设置列头编码为UTF8以支持中文
Encoding = System.Text.Encoding.UTF8,
HasHeaderRecord = false
};
if (File.Exists(filePath))
{
// 获取字段描述作为列头
isFileExists = true;
}
using (var writer = new StreamWriter(filePath, true, System.Text.Encoding.UTF8))
using (var csv = new CsvWriter(writer, config))
{
// 写入列头
if (!isFileExists)
{
foreach (var columnHeader in columnsToShow)
{
csv.WriteField(columnHeader);
}
csv.NextRecord();
}
// 写入特定列数据
foreach (var person in list)
{
foreach (var columnName in columnsToSave)
{
var property = typeof(T).GetProperty(columnName);
if (property != null)
{
csv.WriteField(property.GetValue(person));
}
}
csv.NextRecord();
}
}
}
// 将DataTable写入CSV文件的方法
public static void WriteDataTableToCsv(DataTable dataTable)
{
string filePath = GetFilePath();
if (string.IsNullOrEmpty(filePath))
{
return;
}
using (var writer = new StreamWriter(filePath))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
// 写入表头
foreach (DataColumn column in dataTable.Columns)
{
csv.WriteField(column.ColumnName);
}
csv.NextRecord();
// 写入数据行
foreach (DataRow row in dataTable.Rows)
{
for (var i = 0; i < dataTable.Columns.Count; i++)
{
csv.WriteField(row[i]);
}
csv.NextRecord();
}
}
}
}
}