这是一种可行的方法,它假设 Excel 文件中没有任何空白工作表,并且所有工作表都遵循完全相同的结构。另外,假设文件扩展名只有.xlsx
以下示例是使用 SSIS 2008 R2 和 Excel 2007 创建的。这个例子的工作文件夹是F:\Temp\
在文件夹路径F:\Temp\ 中,创建一个名为States_1.xlsx 的Excel 2007 电子表格文件,其中包含两个工作表。
States_1.xlsx 的
Sheet 1 包含以下数据
Sheet 2 of States_1.xlsx 包含以下数据
在文件夹路径 F:\Temp\ 中,创建另一个名为 States_2.xlsx 的 Excel 2007 电子表格文件,其中包含两个工作表。
States_2.xlsx 的
Sheet 1 包含以下数据
States_2.xlsx 的
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
该表当前为空。
创建一个新的 SSIS 包并在包上创建以下 4 个变量。 FolderPath 将包含存储 Excel 文件的文件夹。 FilePattern 将包含将循环通过的文件的扩展名,此示例仅适用于.xlsx。 FilePath 将由 Foreach 循环容器分配一个值,但我们需要一个有效的路径作为设计时的开始,并且它当前填充了第一个 Excel 文件的路径 F:\Temp\States_1.xlsx。 SheetName 将包含实际的工作表名称,但我们需要填充初始值 Sheet1$ 以避免设计时错误。
在包的连接管理器中,使用以下配置创建一个 ADO.NET 连接,并将其命名为 ExcelSchema。
在 .Net Providers for OleDb 下选择提供程序 Microsoft Office 12.0 Access Database Engine OLE DB Provider。提供文件路径F:\Temp\States_1.xlsx
单击左侧的All 部分并将属性扩展属性设置为Excel 12.0 以表示Excel 的版本。在这种情况下,12.0 表示Excel 2007。点击测试连接,确保连接成功。
创建一个名为 Excel 的 Excel 连接管理器,如下所示。
创建一个名为 SQLServer 的 OLE DB 连接 SQL Server。所以,我们应该在包上有三个连接,如下所示。
我们需要对连接字符串进行如下更改,以便 Excel 文件在文件循环时动态更改。
在连接 ExcelSchema 上,配置表达式 ServerName 以使用变量 FilePath。点击省略号按钮配置表达式。
同样在连接Excel上,配置表达式ServerName使用变量FilePath。单击省略号按钮以配置表达式。
在控制流上,将两个 Foreach 循环容器放在另一个中。第一个Foreach Loop container 命名的循环文件将循环遍历这些文件。第二个Foreach Loop container 将通过容器内的工作表。在每个循环容器的内部,放置一个数据流任务,它将读取 Excel 文件并将数据加载到 SQL 中
配置第一个名为循环文件的Foreach循环容器,如下所示:
配置第一个名为 Loop sheet 的 Foreach 循环容器,如下所示:
在数据流任务中,放置一个 Excel Source、Derived Column 和 OLE DB Destination,如下所示:
配置 Excel 源以读取适当的 Excel 文件和当前正在循环的工作表。
配置派生列以创建文件名和工作表名称的新列。这只是为了演示这个例子,没有任何意义。
配置 OLE DB 目标以将数据插入 SQL 表。
下面的截图显示了包的成功执行。
下面的屏幕截图显示,在此答案开头创建的 2 个 Excel 电子表格中的 4 个工作簿中的数据已正确加载到 SQL 表 dbo.Destination 中。
希望对您有所帮助。