I've been using Microsoft.Jet.OLEDB.4.0 and Microsoft.ACE.OLEDB.12.0 to read in .csv, .xls, and .xlsx files.
I just found out that neither of these technologies are supported in native 64bit mode!
I have 2 questions:
What is the supported way to programatically read .csv, .xls, and .xlsx files in 64 bit mode. I just can't find answers to this anywhere.
If I can't read in all three file types, what is the best way to read in .csv files in a 64 bit environment?
Notes:
- I'm using .NET (3.5p1)
- This is a shrink wrap app; redistribution is a key factor.
Update:
I can use CorFlags to force the application to run in 32bit mode, which works, but is not desirable.
SpreadsheetGear for .NET can read and write .csv / .xls / .xlsx workbooks (and more) and supports 64 bit .NET 2.0+. SpreadsheetGear can be distributed royalty free with your shrink wrap applications.
You did not specify whether your application is WinForms or ASP.NET but SpreadsheetGear works with either. You can see live ASP.NET (C# & VB) samples here, learn about the WinForms samples here and download a free trial here if you want to try it yourself.
Disclaimer: I own SpreadsheetGear LLC
Here is a discussion of what to do about deprecated MDAC. I am afraid the answer is not very satisfying ...
Actually I think Linq is your best solution for this.
Something like....
and your GetObjList method looks something like
The main problem is that the Jet DBMS is a 32bit library that gets loaded into the calling process, so you will never be able to use Jet directly from within your app in 64bit mode. As Tim mentioned you could write your own csv parser, but since this is a shrink-wrap app you want something that will handle a wider range of formats. Luckily, there are a number of ways to talk 32-bit apps, so you can still use Jet with a trick.
I would write a little exe that was marked to run only in 32-bit mode. This exe would take a command line argument of the name of the file to read and the name of a temp file to write to. I would use Jet to load the csv/xls, then put the data into an array of arrays, and use the xml serializer to write the data to the temp file.
Then when I need to load/convert a csv/xls file, I would do the following:
You could try the FileHelpers library for your flat-file parsing. Works amazingly well.
You can use Microsoft Access Database Engine 2010 Redistributable to read and write csv, xls access etc. There is a 32 and 64 bit version of each driver.