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; } } }