我一直在使用Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0来读取.csv,.xls和.xlsx文件。
我刚刚发现原生64位模式都不支持这些技术!
我有两个问题:
支持的方式是什么? 以编程方式读取.csv,.xls和 64位模式下的.xlsx文件。我只是 无法在任何地方找到答案。
如果我无法读取所有三个文件 类型,阅读的最佳方式是什么 在.csv文件中的64位 环境?
注意:
更新
我可以使用CorFlags强制应用程序在32位模式下运行,这种方式有效,但是不可取。
答案 0 :(得分:8)
以下是对about deprecated MDAC做什么的讨论。我担心答案不是很令人满意......
这些新的或转换过的Jet 应用程序可以继续使用Jet 打算使用微软 Office 2003和早期文件(.mdb 和.xls)非主要数据 存储。但是,对于这些 应用程序,你应该计划 从Jet迁移到2007 Office 系统驱动程序你可以下载 2007 Office System Driver,其中 允许您读取和写入 Office中预先存在的文件 2003(.mdb和.xls)或Office 2007(* .accdb,* .xlsm,* .xlsx和 * .xlsb)文件格式。重要信息请阅读2007 Office System最终用户 特定用途的许可协议 限制。
注意:SQL Server应用程序也可以 访问2007 Office System,和 较早,来自SQL Server的文件 异构数据连接和 集成服务功能 好吧,通过2007 Office System 驱动程序。另外,64位SQL 服务器应用程序可以访问 32位Jet和2007 Office System 使用32位SQL Server的文件 64位上的Integration Services(SSIS) 视窗。
答案 1 :(得分:4)
主要问题是Jet DBMS是一个32位的库,它被加载到调用进程中,因此您永远无法在64位模式下直接在应用程序中使用Jet。 Tim提到你可以编写自己的csv解析器,但由于这是一个收缩包装应用程序,你需要能够处理更多格式的东西。幸运的是,有很多方法可以讨论32位应用程序,所以你仍然可以使用Jet技巧。
我会写一个标记为仅在32位模式下运行的exe。此exe将获取要读取的文件名的命令行参数以及要写入的临时文件的名称。我会使用Jet加载csv / xls,然后将数据放入数组数组中,并使用xml序列化程序将数据写入临时文件。
然后,当我需要加载/转换csv / xls文件时,我会执行以下操作:
object[][] ConvertFile(string csvOrXlsFile)
{
var output = System.IO.Path.GetTempFileName();
try
{
var startinfo = new System.Diagnostics.ProcessStartInfo("convert.exe",
string.Format("\"{0}\" \"{1}\"", csvOrXlsFile, output));
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = startinfo;
proc.Start();
proc.WaitForExit();
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(object[][]));
using (var reader = System.IO.File.OpenText(output))
return (object[][])serializer.Deserialize(reader);
}
finally
{
if (System.IO.File.Exists(output))
System.IO.File.Delete(output);
}
}
答案 2 :(得分:4)
您可以尝试使用FileHelpers库进行平面文件解析。效果非常好。
答案 3 :(得分:4)
SpreadsheetGear for .NET可以读写.csv / .xls / .xlsx工作簿(和more)并支持64位.NET 2.0+。 SpreadsheetGear可以通过收缩包装应用程序免费分发。
您没有指定您的应用程序是WinForms还是ASP.NET,但SpreadsheetGear也可以使用。您可以查看实时ASP.NET(C#和VB)示例here,了解WinForms示例here并下载免费试用here,如果您想自己试用。
免责声明:我拥有SpreadsheetGear LLC
答案 4 :(得分:3)
您可以使用Microsoft Access Database Engine 2010 Redistributable来读取和写入csv,xls访问等。每个驱动程序都有32位和64位版本。
答案 5 :(得分:3)
对于可能遇到此问题的任何人来说,这都是一个信息性的帖子(对于我自己来说,我将来会遇到同样的问题并且不记得解决方案:-)) 这有点模糊,但却给我带来了几个小时的压力,所以也许它会帮助别人......对不起,如果重复(找不到)或弃用(有些人没有最新和最大的奢侈品) )。
如果您正在尝试使用Jet 4.0访问基于x64的服务器上的MS Excel文档(或其他数据文件),您将发现不支持此组合。
唯一的解决方案是允许IIS在Windows 64上运行32位应用程序并安装受支持的数据库提供程序。
您需要安装驱动程序,用作ODBC的64位OLEDB提供程序(MSDASQL): “用于ODBC的Microsoft OLE DB提供程序(MSDASQL)是一种允许基于OLEDB和ADO(内部使用OLEDB)构建的应用程序通过ODBC驱动程序访问数据源的技术.MSDASQL是连接到ODBC的OLEDB提供程序,而不是数据库.MSDASQL附带Windows操作系统,Windows Server 2008和Windows Vista SP1是第一个包含该技术的64位版本的Windows版本。“ 在此下载:http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en
这一切都很好,但我遇到了两件令我挠头的事情(并且强调): 1)您需要在IIS Web服务扩展中允许32位ASP.Net - 阅读“”http://www.textcontrol.com/blog/permalink/2006082101“”以获取有关启用32位应用程序和IIS Web服务扩展的说明建立。 2)如果您在IIS x64下使用任何注册表项,将在注册表中添加一个新节点 - Wow6432Node - 您需要移动/复制x64下使用的任何相关密钥。 即我们有一个存储在HCLM \ Software \ CustomKey中的数据密钥,当启用32位时,该密钥不再可用。我们在Wow6432Node下重新创建了密钥,一切都很好。
答案 6 :(得分:1)
实际上我认为Linq是你最好的解决方案。
像......那样的东西。
IEnumerable<MyObj> ObjList = GetObjList(yourCSVFileNAme);
var qry = from o in ObjList
where o.MyField == Something
select o;
并且您的GetObjList方法看起来像
Public IEnumerable<MyObj> GetObjList(string filename)
{
// Obvioulsly you would have some actual validation and error handling
foreach(string line in File.ReadAllLines(filename))
{
string[] fields = line.Split(new char[]{','});
MyObj obj = new MyObj();
obj.Field = fields[0];
obj.AnotherField = int32.Parse(fields[1]);
yield return obj;
}
}