2010-01-21 66 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"); 
     } 

然后把它写入到文件或字符串: