使用 ACE OLEDB Provider 创建 Excel 文件的数据类型问题

Posted

技术标签:

【中文标题】使用 ACE OLEDB Provider 创建 Excel 文件的数据类型问题【英文标题】:Data type issue creating an Excel file using the ACE OLEDB Provider 【发布时间】:2013-07-18 19:34:10 【问题描述】:

我正在使用 ACE OLE DB 提供程序和执行 SQL 任务来创建 Excel 文件。 我使用的连接字符串是这样的:

Data Source=C:\MyFolder\MyFile.xlsx;Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="EXCEL 12.0 XML;HDR=YES";

SQL 命令是这样的:

CREATE TABLE [Query] (
[ProductAssemblyID] Numeric,
[ComponentID] Numeric,
[ComponentDesc] String,
[TotalQuantity] Numeric,
[StandardCost] Currency,
[ListPrice] Currency,
[BOMLevel] Numeric,
[RecursionLevel] Numeric)

然后我使用 Excel 目标来填充文件。当我打开结果文件时,所有列都是文本列,数字存储为文本。 我哪里做错了?

谢谢。

【问题讨论】:

【参考方案1】:

这是我通常如何处理像你这样的任务:

    创建包含所需列的 Excel 文件 向新文件添加 Excel 数据连接 创建数据流 添加 OLE DB 源SELECT ... FROM ... 添加 Excel 目标并设置为 Excel 连接 根据需要映射列 在Excel Destination高级编辑器中,设置列数据类型

【讨论】:

嗨 Mike,我尝试更改 Excel 目标外部列数据类型,但 Excel 目标显示一条警告,指出元数据不同步,生成的 Excel 文件始终包含文本列...我还检查了 Excel 目标输入列数据类型,它们以正确的方式分配。我想不出解决办法... 一个不太优雅的尝试是有一个“虚拟”行,其中包含您需要的数据(即日期字段中的 7/19/13)。这有点杂乱无章,我只在数据源中使用过,但可以尝试一下。当 SSIS 将列转换为字符串并且我需要它是 int 时,我使用过它。 是的,我知道这个解决方法。唯一的问题是我必须在运行时创建 Excel 文件,所以我不能使用带有隐藏行的模板。我只是尝试使用 Jet 提供程序,一切正常!所以 SSIS 以一种错误的方式管理 ACE !!! :( 我刚刚找到了这个连接项:Excel Data Types from SSIS。 SQL Server 2012 中仍然存在该错误... 这对于仍然存在的错误来说太糟糕了。因为一旦你需要在 64 位机器上运行 SSIS 包,使用 Jet 将是另一个令人头疼的问题。【参考方案2】:

我已经为此苦苦挣扎了好几天。这是我发现的: 使用默认的扩展属性(EXCEL 12.0 XML;HDR=YES),这些提供程序都没有工作(即它们创建文本字段而不是数字、日期等):

Microsoft.ACE.OLEDB.12.0 (Microsoft Excel 2007-2010) Microsoft.ACE.OLEDB.15.0 (Microsoft Excel 2013) Microsoft.ACE.OLEDB.16.0 (Microsoft Excel 2016)

正如@lucazav 所述,选择较旧的 Microsoft.Jet.OLEDB.4.0 提供程序(如果有的话)确实有效。这就是您选择“Excel 97-2003”时使用的内容。但是,如果您需要部署到生产机器或没有旧的 JET 驱动程序,您可能会发现它不再可用,在 64 位机器上无法运行等。

但是,您不需要安装旧的 JET 驱动程序。只需更改扩展属性,我就能使 ACE.OLEDB.12.0 工作。

改变

Excel 12.0 XML;HDR=YES

Excel 8.0;HDR=YES

另外,您需要将文件扩展名设置为 .xls 而不是 .xlsx。否则,当你用 Excel 打开文件时,它会抱怨扩展名与实际文件类型不匹配。

HDR 是可选的,但我需要标题,所以我使用它。我不认为“Excel”的大小写很重要。

Microsoft 下载页面上Microsoft Access Database Engine 2010 Redistributable 的安装说明向我介绍了此解决方案(这是获取 Microsoft.ACE.OLEDB.12.0 提供程序的方式)。

“Excel 8.0”也是使用 JET 时默认的扩展属性。

【讨论】:

以上是关于使用 ACE OLEDB Provider 创建 Excel 文件的数据类型问题的主要内容,如果未能解决你的问题,请参考以下文章

关于异常“The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine”的处理

Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别

Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别(转)

The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.

The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.

ACE oleDb 驱动程序无法处理巨大的 excel 文件