如何在C#(.NET Core)中不使用任何包导出CSV文件?
在.NET Core中无第三方包生成规范CSV文件
要实现以类属性为表头、结构规范的CSV导出,我们可以通过反射获取类元数据+CSV格式规则处理来完成,核心是处理字段中的特殊字符(逗号、双引号、换行)避免格式错乱。
实现步骤与代码
1. 核心CSV生成工具类
创建一个通用的静态工具类,负责处理表头生成、数据行转义与拼接:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; public static class CsvGenerator { public static string GenerateCsv<T>(IEnumerable<T> data) { var stringBuilder = new StringBuilder(); var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); // 生成表头:类的属性名 var header = string.Join(",", properties.Select(p => EscapeCsvField(p.Name))); stringBuilder.AppendLine(header); // 生成数据行 foreach (var item in data) { var values = properties.Select(p => EscapeCsvField(p.GetValue(item)?.ToString() ?? string.Empty)); var row = string.Join(",", values); stringBuilder.AppendLine(row); } return stringBuilder.ToString(); } // 处理CSV字段的特殊字符转义 private static string EscapeCsvField(string field) { if (string.IsNullOrEmpty(field)) return string.Empty; // 如果字段包含逗号、双引号或换行符,需要用双引号包裹,且内部双引号替换为两个 if (field.Contains(",") || field.Contains("\"") || field.Contains("\n") || field.Contains("\r")) { return $"\"{field.Replace("\"", "\"\"")}\""; } return field; } // 可选:将CSV内容保存到文件(带UTF-8 BOM,避免Excel乱码) public static void SaveCsvToFile<T>(IEnumerable<T> data, string filePath) { var csvContent = GenerateCsv(data); // 写入带BOM的UTF-8编码,解决Excel打开中文乱码问题 File.WriteAllText(filePath, csvContent, new UTF8Encoding(true)); } }
2. 示例用法
针对你的TestArray类,直接调用工具类即可生成规范CSV:
// 构造测试数据 var testData = new List<TestArray> { new TestArray { LastName = "张", FirstName = "三", Age = "25", MoNumber = "13800138000" }, new TestArray { LastName = "李", FirstName = "四", Age = "30", MoNumber = "13900139000" }, // 测试包含特殊字符的场景 new TestArray { LastName = "王", FirstName = "小五, 别名", Age = "\"28\"", MoNumber = "13700137000" } }; // 生成CSV字符串 var csvString = CsvGenerator.GenerateCsv(testData); Console.WriteLine(csvString); // 保存到文件 CsvGenerator.SaveCsvToFile(testData, @"D:\test.csv");
关键细节说明
- 反射获取属性:通过
typeof(T).GetProperties()获取类的公共实例属性,作为CSV表头。 - 特殊字符转义:严格遵循CSV规范:
- 字段包含逗号、双引号、换行时,必须用双引号包裹
- 字段内的双引号需要替换为两个双引号(CSV转义规则)
- 编码处理:保存文件时使用带BOM的UTF-8编码,避免Excel打开中文内容乱码。
内容的提问来源于stack exchange,提问作者Ashish Prajapati
相关产品推荐
相关产品推荐

