2010-01-21 100 views
6

FileHelpers支持一種名爲「RunTime Records」的功能,當您直到運行時才知道佈局時,它可以讓您將CSV文件讀取到DataTable中。使用FileHelpers動態創建CSV文件

是否可以使用FileHelpers在運行時以相同方式創建CSV文件?

基於某些用戶輸入,必須創建的CSV文件將具有隻能在運行時才知道的不同字段。我可以按照他們的閱讀部分所述爲FileHelper引擎創建所需的類型,但我無法弄清楚我的數據需要寫入什麼格式。

var engine = new FileHelpers.FileHelperEngine(GenerateCsvType()); 

engine.WriteStream(context.Response.Output, dontKnow); 

編輯

另外,任何人都可以提出一個很好的CSV庫,可以創建不知道它的領域,直到運行時的CSV文件?例如,從DataTable創建一個CSV文件。

回答

6

事實上庫只允許現在讀運行記錄,但書寫效果影響不大,你可以使用DataTableToCsv方法是這樣的:

CsvEngine.DataTableToCsv(dt, filename); 

讓,是否可以幫助我知道。

+0

太棒了:)這是一個很好的解決方案,但有什麼方法可以寫入流嗎?這不是一個交易破壞者,但它會節省一些步驟。無論哪種方式,謝謝! –

+0

目前還不是,但發給我一封電子郵件,我們正在積極的在下一個版本的庫中工作,並且會很容易地添加一個超載版本的方法來編寫流:) – MarcosMeli

+0

@Marcos:是要支持的下一個版本通用列表('List ')作爲返回類型(而不是數組)來自FileEngine? :-) –

1

我知道這是一個老問題,但我自己遇到同樣的問題,並花了一些時間尋找解決方案,所以我決定分享我的發現。

如果您使用FileHelpers RunTime Records來創建您的定義,則可以使用反射來填充相同的定義。

例如,如果你創建一個定義

 DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ","); 
     cb.AddField("StringField", "string"); 

     Type t = cb.CreateRecordClass(); 
     FileHelperEngine engine = new FileHelperEngine(t); 

現在你可以使用FileHelpers創建同一類型來填充值如下

 object customClass = Activator.CreateInstance(t); 
     System.Reflection.FieldInfo field = customClass.GetType().GetField("StringField", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); 
     if (field != null) 
     { 
      field.SetValue(customClass, "StringValue"); 
     } 

然後把它寫入到文件或字符串: