274 lines
9.2 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|