如何使用CSVHelper编写非平面类的头文件?

p5fdfcr1  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(124)
public class Class1
{
    [CsvField(Name = "Field1")]
    public int Field1 { get; set; }

    [CsvField(Name = "Field2")]
    public int Field2 { get; set; }

    [CsvField(Ignore = true)]
    public Class2 Class2 { get; set; }

    [CsvField(Ignore = true)]
    public Class3 Class3 { get; set; }
}

public class Class2
{
    [CsvField(Name = "Field3")]
    public int Field3 { get; set; }

    [CsvField(Name = "Field4")]
    public int Field4 { get; set; }
}

public class Class3
{
    [CsvField(Name = "Field5")]
    public int Field5 { get; set; }

    [CsvField(Name = "Field6")]
    public int Field6 { get; set; }
}

我正在使用CSVHelper将数据写入CSV文件。我需要使用如下标题写入Class1:
字段1、字段2、字段3、字段4、字段5、字段6
我怎么能这样呢?

6jygbczu

6jygbczu1#

这是一个老问题,所以你可能已经有了答案。你有几个选择。

**选项1(我知道会起作用)**文档

您只需要手动写出CSV的内容,下面是一些可以帮助您开始的代码,但您需要根据对象内容的存储方式进行修改。

using (var stream = new MemoryStream())
{
    using (var streamWriter = new StreamWriter(stream))
    using (var csv = new CsvWriter(streamWriter))
    {
        // Write out header
        csv.WriteField("Field1");
        csv.WriteField("Field2");
        csv.WriteField("Field3");
        csv.WriteField("Field4");
        csv.WriteField("Field5");
        csv.WriteField("Field6");

        // Write out end line
        csv.NextRecord();

        //Pseudocode
        foreach (var item in Class1Collection)
        {
            csv.WriteField(item.Field1);
            csv.WriteField(item.Field2);
            csv.WriteField(item.Class2.Field3);
            csv.WriteField(item.Class2.Field4);
            csv.WriteField(item.Class3.Field5);
            csv.WriteField(item.Class3.Field6);

            // Write out end line
            csv.NextRecord();
        }
    }
}

**选项2(已使用,但与此不同)**文档

第二个选择是编写一个自定义的CSVMap,告诉CSVWriter如何处理嵌套类。我不确定如何处理名称,所以您可能必须解决这个问题。

public sealed class Class1CSVMap : CsvClassMap<RemittanceFormModel>
{
    public Class1CSVMap()
    {
        Map(m => m.Field1).Name("Field1");
        Map(m => m.Field2).Name("Field2");
        Map(m => m.Class2).Name("Field3,Field4").TypeConverter<Class2Converter>();
        Map(m => m.Class3).Name("Field5,Field6").TypeConverter<Class3Converter>();
    }
}

然后是转换器,一个用于Class2,一个用于Class3

public class Class2Converter : DefaultTypeConverter
{
    public override string ConvertToString(TypeConverterOptions options, object model)
    {
        var result = string.Empty;

        var classObject = model as Class2;

        if (classObject != null)
        {
            result = string.Format("{0},{1}", classObject.Field3, classObject.Field4);
        }

        return result;
    }
}

**选项3(从未使用过)**文档

你可以做一个内联转换器,而不是创建一个单独的类。我从来没有尝试过这个,但它应该工作。

public sealed class Class1CSVMap : CsvClassMap<Class1>
{
    public Class1CSVMap()
    {
            Map(m => m.Field1).Name("Field1");
            Map(m => m.Field2).Name("Field2");
            Map(m => m.Class2).Name("Field3,Field4").ConvertUsing(row =>  string.Format("{0},{1}", row.Field3, row.Field4); );
            Map(m => m.Class3).Name("Field5,Field6").ConvertUsing(row =>  string.Format("{0},{1}", row.Field5, row.Field6); );
    }
}
6xfqseft

6xfqseft2#

你看这个

foreach (var item in Collection)
    {
        csv.WriteField(item.Field1);
        csv.WriteField(item.Field2);
        csv.WriteField(item.Class2.Field3);
        csv.WriteField(item.Class2.Field4);
        csv.WriteField(item.Class3.Field5);
        csv.WriteField(item.Class3.Field6);

        // Write out end line
        csv.NextRecord();
    }
}

}

相关问题