You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:52:41