如何循环使用Excel文件并使用SSIS包将它们加载到数据库中?

Xar*_*iex 31 excel ssis

我需要创建一个SSIS包,用于将数据从多个Excel文件导入SQL数据库.我计划使用嵌套的Foreach循环容器来实现这一目标.一个Foreach文件枚举器并嵌套在其中,一个Foreach ADO.net模式行集枚举器

需要考虑的问题:Excel文件的工作表名称不同,但结构保持不变.

我创建了一个Excel连接管理器,但Schema Rowset Enumerator不接受Enumerator配置中的连接管理器.

经过研究,我发现您可以使用Jet Ole数据库提供程序连接到excel文件.但是,我只能指定Microsoft Access数据库文件作为数据源.尝试插入Excel文件作为数据源失败

经过更多研究后,我发现您可以使用带有连接字符串而不是DSN的Odbc数据提供程序.插入指定Excel文件的连接字符串后,这也失败了

我已被告知不要使用脚本任务来完成这个,甚至还试图最后的努力来提取数据表通过索引访问表后,我发现,在不同的Excel文件的表的索引是不同的

任何帮助将不胜感激

小智 90

这是一种可行的方法,基于这样的假设:Excel文件中不会有任何空白页,并且所有工作表都遵循完全相同的结构.此外,假设文件扩展名是唯一的.xlsx

以下示例是使用SSIS 2008 R2Excel 2007创建的.此示例的工作文件夹是F:\Temp\

在文件夹路径中F:\Temp\,创建一个States_1.xlsx以两个工作表命名的Excel 2007电子表格文件.

Sheet 1States_1.xlsx含有下列数据

States_1_Sheet_1

Sheet 2States_1.xlsx含有下列数据

States_1_Sheet_2

在文件夹路径中F:\Temp\,创建另一个States_2.xlsx以两个工作表命名的Excel 2007电子表格文件.

Sheet 1States_2.xlsx含有下列数据

States_2_Sheet_1

Sheet 2States_2.xlsx含有下列数据

States_2_Sheet_2

使用以下创建脚本在SQL Server中创建名为dbo.Destination的表.Excel工作表数据将插入此表中.

CREATE TABLE [dbo].[Destination](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [State] [nvarchar](255) NULL,
    [Country] [nvarchar](255) NULL,
    [FilePath] [nvarchar](255) NULL,
    [SheetName] [nvarchar](255) NULL,
CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

该表目前是空的.

空表

创建一个新的SSIS包,并在包上创建以下4个变量.FolderPath将包含存储Excel文件的文件夹.FilePattern将包含将循环的文件的扩展名,此示例仅适用于.xlsx.FilePath将由Foreach循环容器赋值,但我们需要一个有效的路径来开始设计时间,并且当前填充F:\Temp\States_1.xlsx了第一个Excel文件的路径.SheetName将包含实际的工作表名称,但我们需要填充初始值Sheet1$以避免设计时错误.

变量

在包的连接管理器中,使用以下配置创建ADO.NET连接,并将其命名为ExcelSchema.

选择Microsoft Office 12.0 Access Database Engine OLE DB Provider.Net Providers for OleDb下的提供商.提供文件路径F:\Temp\States_1.xlsx

ExcelSchema 1

单击All左侧的部分,将属性扩展属性设置为Excel 12.0以表示Excel的版本.在这种情况下,12.0表示Excel 2007.单击"测试连接"以确保连接成功.

ExcelSchema 2

创建名为Excel的Excel连接管理器,如下所示.

高强

创建名为的OLE DB连接SQL Server SQLServer.因此,我们应该在包上有三个连接,如下所示.

连接

我们需要进行以下连接字符串更改,以便在文件循环时动态更改Excel文件.

在连接ExcelSchema上,配置表达式ServerName以使用该变量FilePath.单击省略号按钮以配置表达式.

ExcelSchema ServerName

类似地,在连接Excel上,配置表达式ServerName以使用该变量FilePath.单击省略号按钮以配置表达式.

Excel ServerName

在控制流程中,将两个Foreach循环容器放在另一个容器中.第一个Foreach Loop container名为Loop的文件将遍历文件.第二个Foreach Loop container将通过容器内的纸张.在内部对于每个循环容器,放置一个数据流任务,它将读取Excel文件并将数据加载到SQL中

控制流

配置名为Loop文件的第一个Foreach循环容器,如下所示:

Foreach Loop 1系列

Foreach循环1变量映射

配置名为Loop sheet的第一个Foreach循环容器,如下所示:

Foreach Loop 2系列

Foreach循环2变量映射

在数据流任务中,放置Excel源,派生列和OLE DB目标,如下所示:

数据流任务

配置Excel源以读取相应的Excel文件和当前正在循环的工作表.

Excel源连接管理器

Excel源列

配置派生列以为文件名和工作表名称创建新列.这只是为了演示这个例子,但没有意义.

派生列

配置OLE DB目标以将数据插入SQL表.

OLE DB目标连接管理器

OLE DB目标列

下面的屏幕截图显示了包的成功执行.

执行成功

下面的屏幕截图显示,在此答案开头创建的2个Excel电子表格中的4个工作簿中的数据被正确加载到SQL表dbo.Destination中.

SQL表

希望有所帮助.

  • 这对我很有用.起初它一直失败,这是因为我必须将调试64位设置为FALSE.要执行此操作,请转到Project - > YourProjectProperties - > Debugging - > Run64BitRuntime = FALSE (2认同)

小智 12

我遇到了一篇文章,该文章说明了一种方法,在该方法中,可以在选定的表中导入来自同一Excel工作表的数据,直到excel中没有对数据类型进行修改.

如果插入或覆盖新数据,将成功完成导入过程,并将数据添加到SQL数据库中的表中.

这篇文章可以在这里找到:http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/

希望能帮助到你.