2013-04-05 40 views
2

我发现许多解决方案导出类CSV但我的问题是这样的:出口类

我试图出口类有一个属性是一个ObservableCollection。例如:

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。

任何帮助非常感谢!

回答

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和循环。我会把这个任务交给你。

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

}