我需要创建一个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 R2和Excel 2007创建的.此示例的工作文件夹是F:\Temp\
在文件夹路径中F:\Temp\,创建一个States_1.xlsx以两个工作表命名的Excel 2007电子表格文件.
Sheet 1的States_1.xlsx含有下列数据

Sheet 2的States_1.xlsx含有下列数据

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

Sheet 2的States_2.xlsx含有下列数据

使用以下创建脚本在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

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

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

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

我们需要进行以下连接字符串更改,以便在文件循环时动态更改Excel文件.
在连接ExcelSchema上,配置表达式ServerName以使用该变量FilePath.单击省略号按钮以配置表达式.

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

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

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


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


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

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


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

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


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

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

希望有所帮助.
小智 12
我遇到了一篇文章,该文章说明了一种方法,在该方法中,可以在选定的表中导入来自同一Excel工作表的数据,直到excel中没有对数据类型进行修改.
如果插入或覆盖新数据,将成功完成导入过程,并将数据添加到SQL数据库中的表中.
这篇文章可以在这里找到:http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/
希望能帮助到你.