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

我需要创build一个SSIS包,用于将多个Excel文件中的数据导入SQL数据库。 我打算使用嵌套的Foreach循环容器来实现这一点。 一个Foreach文件枚举器,并嵌套在一个Foreach ADO.net架构行集枚举器中

需要考虑的问题:在Excel文件中,图表名称是不同的,但是结构保持不变。

我创build了Excel连接pipe理器,但架构行集枚举器不接受在枚举器configuration中的连接pipe理器。

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

经过更多的研究,我发现你可以使用连接string而不是DSN来使用Odbc数据提供程序。 插入指定Excel文件的连接string后,这也失败了

我被告知不要使用一个脚本任务来完成这一点,甚至在尝试最后的努力从表格中提取数据通过索引访问表我发现不同的excel文件中的工作表索引是不同的

任何帮助将不胜感激

这是基于Excel文件中不会有任何空白工作表的假设,也是所有工作表遵循完全相同的结构的一种可能的方法。 此外,假设文件扩展名只有.xlsx

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

在文件夹pathF:\Temp\ ,使用两个工作表创build一个名为States_1.xlsx的Excel 2007电子表格文件。

States_1.xlsx Sheet 1包含以下数据

States_1_Sheet_1

States_1.xlsx的 Sheet 2包含以下数据

States_1_Sheet_2

在文件夹pathF:\Temp\ ,使用两个工作表创build名为States_2.xlsx另一个Excel 2007电子表格文件。

States_2.xlsx Sheet 1包含以下数据

States_2_Sheet_1

States_2.xlsx工作 Sheet 2包含以下数据

States_2_Sheet_2

使用下面的创build脚本在名为dbo.Destination的SQL Server中创build一个表。 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 

该表目前是空的。

空表

创build一个新的SSIS包,并在包上创build以下4个variables。 FolderPath将包含存储Excel文件的文件夹。 FilePattern将包含将循环的文件的扩展名,本示例仅适用于.xlsxFilePath将由Foreach Loop容器分配一个值,但是我们需要一个有效的path来开始devise时间,并且它当前使用第一个Excel文件的pathF:\Temp\States_1.xlsx进行填充。 SheetName将包含实际的工作表名称,但是我们需要用初始值Sheet1$填充以避免devise时间错误。

变量

在包的连接pipe理器中,使用以下configuration创build一个ADO.NET连接,并将其命名为ExcelSchema

在OleDb的.Net提供Microsoft Office 12.0 Access Database Engine OLE DB Provider下select提供程序Microsoft Office 12.0 Access Database Engine OLE DB Provider程序。 提供文件pathF:\Temp\States_1.xlsx

ExcelSchema 1

单击左侧的“ All部分,并将属性“扩展属性”设置为Excel 12.0以表示Excel的版本。 在这种情况下,12.0表示Excel 2007 。 点击testing连接,确保连接成功。

ExcelSchema 2

创build一个名为Excel的Excel连接pipe理器,如下所示。

高强

创build一个名为SQLServer的OLE DB连接SQL Server。 所以,我们应该在包装上有三个连接,如下所示。

连接

我们需要执行以下连接string更改,以便在文件循环时dynamic更改Excel文件。

在连接ExcelSchema上 ,将expression式ServerNameconfiguration为使用variablesFilePath 。 点击省略号button来configurationexpression式。

ExcelSchema ServerName

同样在连接Excel上 ,将expression式ServerNameconfiguration为使用variablesFilePath 。 点击省略号button来configurationexpression式。

Excel ServerName

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

控制流程

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

Foreach Loop 1集合

Foreach循环1变量映射

configuration名为Loop工作表的第一个Foreach循环容器,如下所示:

Foreach Loop 2集合

Foreach循环2变量映射

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

数据流任务

configurationExcel源以读取相应的Excel文件和当前正在循环的表单。

Excel源连接管理器

Excel来源列

configuration派生列以创build文件名和工作表名称的新列。 这只是为了演示这个例子,但没有意义。

派生列

configurationOLE DB目标以将数据插入到SQL表中。

OLE DB目标连接管理器

OLE DB目标列

以下屏幕截图显示了软件包的成功执行。

执行成功

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

SQL表

希望有所帮助。

我遇到了一篇文章,说明一种方法,可以在同一个Excel表格中的数据导入到所选表格中,直到excel中没有数据types的修改。

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

文章可能在这里find: http : //www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/

希望它有帮助。

我有一个类似的问题,发现尽快摆脱Excel文件要简单得多。 作为我包中的第一步的一部分,我使用Powershell将Excel文件中的数据提取到CSV文件中。 我自己的Excel文件很简单,但在这里

使用PowerShell提取所有Excel工作表并将其转换为CSV文件

是Tim Smith关于从多个Excel文件和/或多个工作表中提取数据的极好的文章。

一旦Excel文件被转换成CSV文件,数据导入就不复杂了。