using System.ComponentModel.DataAnnotations;
using System.Reflection;
using System.Text;
namespace IStation.Test
{
public static class CsvHelper
{
///
/// 导出PumpViewModel集合到CSV文件
///
public static void ExportToCsv(IEnumerable data, string filePath, Encoding encoding = null)
{
if (data == null || !data.Any())
throw new ArgumentException("数据不能为空");
encoding ??= Encoding.UTF8;
var csvContent = GenerateCsvContent(data);
File.WriteAllText(filePath, csvContent, encoding);
}
///
/// 生成CSV内容字符串
///
public static string GenerateCsvContent(IEnumerable data)
{
var sb = new StringBuilder();
// 添加标题行
var headers = GetPropertyDisplayNames(typeof(T));
sb.AppendLine(string.Join(",", headers.Select(EscapeCsvField)));
// 添加数据行
foreach (var item in data)
{
var values = GetPropertyValues(item);
sb.AppendLine(string.Join(",", values.Select(EscapeCsvField)));
}
return sb.ToString();
}
private static List GetPropertyDisplayNames(Type type)
{
return type.GetProperties()
.Select(p => p.GetCustomAttribute()?.Name ?? p.Name)
.ToList();
}
private static List GetPropertyValues(T item)
{
return typeof(T).GetProperties()
.Select(p => p.GetValue(item)?.ToString() ?? "")
.ToList();
}
private static string EscapeCsvField(string field)
{
if (string.IsNullOrEmpty(field))
return "";
// 如果字段包含逗号、引号或换行符,则用引号括起来
if (field.Contains(",") || field.Contains("\"") || field.Contains("\r") || field.Contains("\n"))
{
return $"\"{field.Replace("\"", "\"\"")}\"";
}
return field;
}
}
}