2

我找到了许多将类导出到 CSV 的解决方案,但我的问题是:

我要导出的类有一个可观察集合的属性。例如:

public class ShipmentForExport
    {
        public string WaybillNumber { get; set; }
        public DateTime WaybillDate { get; set; }
        public string CustomerName { get; set; }
        public string CustomerCode { get; set; }
        public string CollectingBranchName { get; set; }
        public string CollectingBranchCode { get; set; }
        public string RecipientName { get; set; }
        public string RecipientPhoneNumber { get; set; }
        public string RecipientCellphoneNumber { get; set; }
        public string RecipientCompany { get; set; }
        public string DestinationAddress1 { get; set; }
        public string DestinationAddress2 { get; set; }
        public string DestinationCity { get; set; }
        public string DestinationSuburb { get; set; }
        public string DestinationProvince { get; set; }
        public string DestinationCountry { get; set; }
        public string DestinationPostalCode { get; set; }

        ***public ObservableCollection<InHouseParcel> Parcels { get; set; }***

    }

当我尝试将货物列表导出到 csv 时,它可以工作,但显然包裹并没有按照我想要的方式导出。

我也尝试过使用 Filehelpers Library 和 csvHelper。

任何帮助是极大的赞赏!!

4

2 回答 2

0

使用CsvHelper(我维护的一个库)...

编写时,您必须手动编写,因为不支持编写集合属性。

foreach( var record in records )
{
    csv.WriteField( record.WaybillNumber );
    ...
    foreach( var parcel in record.Parcels )
    {
        csv.WriteField( parcel );
    }
}

阅读更容易一些,因为您可以将其添加到映射中。

Map( m => m.Parcels ).ConvertUsing( row =>
{
    var oc = new ObservableCollection<InHouseParcel>();
    var parcel = row.GetField<InHouseParcel>( 17 );
    oc.Add( parcel );
} );

您需要将字段值转换为InHouseParcel并循环遍历行中的其余字段。我会把这个任务留给你。

于 2014-04-10T21:28:34.420 回答
0

乔希的答案如今已经过时了。您可以使用类型转换器,例如:

CsvHelper.TypeConversion.TypeConverterFactory.AddConverter<ObservableCollection<string>>(new CsvHelper.TypeConversion.StringListConverter());

using (var txt = new StreamReader(filename))
using (var reader = new CsvHelper.CsvReader(txt))
{ .... }



namespace CsvHelper.TypeConversion
{
public sealed class StringListConverter : DefaultTypeConverter
{
    public override object ConvertFromString(TypeConverterOptions options, string text)
    {
        var oc = new ObservableCollection<string>();
        if (text.IndexOf('|') >= 0)
        {
            var list = text.Split('|').ToList<string>();// base.ConvertFromString(options, text);
            oc = new ObservableCollection<string>(list);
        }
        return oc;
    }

    public override string ConvertToString(TypeConverterOptions options, object value)
    {
        var l = value as IEnumerable<string>;
        if ( l == null || l.Count() == 0)
        {
            return "";
        }

        return string.Join("|", l);
    }

    public override bool CanConvertFrom(Type type)
    {
        return type == typeof(string);
    }
}

}

于 2016-01-15T10:05:02.647 回答