从 excel 导入数据进行访问时,从外部数据库驱动程序 (1) 收到意外错误
Posted
技术标签:
【中文标题】从 excel 导入数据进行访问时,从外部数据库驱动程序 (1) 收到意外错误【英文标题】:getting an Unexpected error from external database driver (1) when importing data from excel to access 【发布时间】:2012-05-12 09:49:29 【问题描述】:我有一个2010 Excel file
,其表格横跨34864 rows
和1387 columns
。我正在尝试使用导入向导将其导入Access 2010
,但是当我选择该工作表时,Access 没有响应,几秒钟后给了我一个
“来自外部数据库驱动程序的意外错误 (1)”
这是由于工作表的大小还是单元格中的某些东西阻止了它的工作。同一文件中的其他工作表导入没有问题。
【问题讨论】:
建议您尝试以 1/2 大小导入测试,如果成功则向上移动。 当我的文件处于不可编辑模式时,EXCEL 2010 xlsx 文件也出现同样的错误。启用编辑后可以上传。对此有任何解决方案吗? 【参考方案1】:安装安全补丁KB4041681后,您可能会遇到此错误。请参阅此 MSDN 条目。
在我的情况下,用 Microsoft.ACE.OLEDB.12.0
替换 Microsoft.Jet.OLEDB.4.0
提供者会有所帮助。
【讨论】:
【参考方案2】:查看 Access 2010 规范:http://office.microsoft.com/en-us/access-help/access-2010-specifications-HA010341462.aspx。
在您的情况下,它可能是列数,因此请先尝试导入少于 255 的列。此外,它可能是列中数据的大小或数据类型(将文本导入数字等)
【讨论】:
现在减少到 72 列,我删除了大部分元素,所以现在只有 1863 行,如果我将数据从该表复制到另一个新工作表,新工作表将加载(1863 行和 72 列),但如果我复制给我带来困难的工作表,该副本将不会加载 这听起来像是导致问题的“剩余”数据。当您复制 1863 行时,您复制的正是您看到/想要的内容。复制工作表时,会复制所有数据(超过 1863 行)。例如。您可能在#18000 单元格#55 行中有一些白色的数据。 但我突出显示所有这些行并按下“删除”,不应该删除那里的任何内容吗?还是这是某种不同类型的数据? 删除应该可以。确保同时突出显示并删除所有列 (73+)【参考方案3】:我也遇到了这个问题,并找到了一个非常简单的解决方案。我注意到我的电子表格有一个自定义名称,所以我决定看看这是否导致了问题。我将其更改为默认名称“Sheet1”,果然成功了!!
【讨论】:
【参考方案4】:下载并安装 Microsoft Access Database Engine 2010 Redistributable,然后修改 Microsoft Excel 中的数据库连接字符串以使用 ACE 作为提供程序。
更改(示例):
Provider=Microsoft.Jet.OLEDB.4.0
到:
Provider=Microsoft.ACE.OLEDB.12.0.
Microsoft 正在制定解决方案,并将在即将发布的版本中提供更新。
【讨论】:
这里需要注意的一点:您几乎必须使用 2010 版本,无论您的计算机上安装了哪个版本的 Office。我尝试下载/安装 2016 版 Access 数据库引擎 Redistributable,但它无法安装在我的机器上,显然是因为我从 O365 订阅中安装了 Office 桌面应用程序。显然,CTR(即点即用)组件会干扰安装更高版本的可再发行组件。【参考方案5】:使用这个
OleDbConnection conObj = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\a.XLS;Extended Properties=Excel 8.0;")
而不是这个
OleDbConnection conObj = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\a.XLS;Extended Properties=Excel 8.0;")
【讨论】:
【参考方案6】:将您的 Excel 工作表保存为“逗号分隔”的 .CSV 文件,然后将其作为文本文件上传。对我来说,这很好用。
问题在于 .xls(x) 中存在所有类型的布局问题。将其转换为 .CSV 会删除所有与布局相关的标记并转换为“原始”数据。
一切顺利!
【讨论】:
【参考方案7】:按照 RHiggins 的回答:
在我的例子中,Jet OleDb.4.0 抛出此错误 (oledbconnection.open()),因为工作簿 (.xls) 中的工作表名称太长。
【讨论】:
【参考方案8】:在解决此问题时对我有用的一个解决方案是在进行导入和导出时打开正在执行导入/导出的 Excel 文件。
该问题似乎是由阻止数据事务在 CLOSED .xls 文件和其他外部数据库应用程序之间发生的补丁引起的。打开 excel 文件可以解决这个问题。
下面的一些示例代码示例突出了 VBA 的有效和无效:
失败
wbTarget.SaveAs strFilename, xlExcel8
wbTarget.Close
ExportSheetToDB strFilename, strSheetName, "tblTemp"
有效
wbTarget.SaveAs strFilename, xlExcel8
ExportSheetToDB strFilename, strSheetName, "tblTemp"
wbTarget.Close
【讨论】:
【参考方案9】:Excel 和 Access 之间似乎存在错误。在某些情况下,我必须打开 Excel 文件,单击保存,然后关闭文件。然后我可以将其导入 Access 中而不会出错。
我还没有找到解决 VBA 自动化问题的方法。
【讨论】:
【参考方案10】:在我的情况下,电子表格已链接到另一个电子表格。我正在导入原始工作表的子集。我创建了一个新工作表并将数据逐列复制到记事本,然后删除链接到新工作表。 链接中有一些东西导致了问题。 顺便说一句:这是一组数据,因为我已经完成了从这个电子表格到这个数据库的导入序列超过 50 次。将数据减半适用于前半部分(较大的)数据,但不适用于后半部分。
【讨论】:
【参考方案11】:您好,我在导入 .xlsb 文件时也遇到了这个错误。之后,我将内容复制到另一个 xlsx 文件,然后导入此 xlsx 文件。
【讨论】:
【参考方案12】:从 XLSB 文件导入时出现此错误,将文件保存为 XLSX 文件然后导入,应该可以工作
【讨论】:
【参考方案13】:发现的另一个问题是,如果将 excel 文件保存为二进制 excel 工作表,只需将其重新保存为 excel 工作簿即可正常加载。
【讨论】:
【参考方案14】:我遇到了完全相同的错误。 该电子表格是从另一个软件 (SAP) 创建的。由于它不是由 Office 创建的,因此 Excel 无法读取它(!?!)。 我必须在 Excel 中打开它们,保存它,然后在 Access 中加载它,它就可以工作了! 作为最坏的情况,假设您有几十个文件,您可以在导入之前通过 VBA 代码打开和关闭它们。
【讨论】:
【参考方案15】:已针对 Windows 7 解决:
卸载安全更新 KB4041681 和 KB4041678(与 Excel 和 Jet/ACE 提供程序相关)
【讨论】:
【参考方案16】:在我的情况下(我有同样的错误)问题是我的 Access DB 存储在网络驱动器上 空间不足(没有足够的可用空间来完成导入) .我释放了空间并压缩了数据库;错误没有再次出现。
【讨论】:
【参考方案17】:我遇到了同样的问题,在 Windows7 中获得安全更新后出现此错误。我们有太多的 Excel 文件无法执行打开/关闭操作,所以我决定尝试其他方式。
当 Access 工作正常时返回一个还原点:在我的情况下它不起作用。软件配置的唯一变化是安全更新,似乎安全更新仍然会导致问题。
减少行、列等:它对我不起作用;访问尝试访问的第一个文件有 10k 行,将此行减少到 3 行不是解决方案。
试图修改连接字符串:它对我不起作用,也不是很合理;连接已经工作多年,为什么突然停止了?在某些情况下会,但这次不会。
在我的情况下,卸载最新的安全更新是可行的。这是已卸载的安全更新。
祝你好运。
【讨论】:
以上是关于从 excel 导入数据进行访问时,从外部数据库驱动程序 (1) 收到意外错误的主要内容,如果未能解决你的问题,请参考以下文章