it-swarm.cn

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

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

要考虑的问题:工作表名称在Excel文件之间不同,但是结构保持不变。

我已经创建了一个Excel Connection Manager,但是架构行集枚举器不接受Enumerator配置中的连接管理器。

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

经过更多研究,我发现您可以将Odbc数据提供程序与连接字符串一起使用,而不是DSN。插入指定Excel文件的连接字符串后,此操作也失败

有人告诉我不要使用脚本任务来完成此任务,即使尝试了最后的尝试从工作表中提取数据后,仍要通过索引访问工作表,但我发现不同Excel文件中工作表的索引不同

任何帮助将不胜感激

31
Xariex

这是一种可能的方法,它基于以下假设:Excel文件中将没有任何空白表,并且所有表都遵循完全相同的结构。另外,假设文件扩展名仅为.xlsx

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

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

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

States_1_Sheet_1

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

States_1_Sheet_2

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

States_2.xlsxSheet 1包含以下数据

States_2_Sheet_1

States_2.xlsxSheet 2包含以下数据

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

该表当前为空。

Empty table

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

Variables

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

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

ExcelSchema 1

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

ExcelSchema 2

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

Excel

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

Connections

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

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

ExcelSchema ServerName

同样,在连接Excel上,将表达式ServerName配置为使用变量FilePath。单击省略号按钮以配置表达式。

Excel ServerName

在“控制流”上,将两个Foreach循环容器放置在另一个容器中。名为Foreach Loop container的第一个循环文件​​将循环浏览文件。第二个Foreach Loop container将穿过容器内的纸张。在内部,对于每个循环容器,放置一个数据流任务,该任务将读取Excel文件并将数据加载到SQL中

Control Flow

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

Foreach Loop 1 Collection

Foreach Loop 1 Variable Mappings

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

Foreach Loop 2 Collection

Foreach Loop 2 Variable Mappings

在数据流任务内部,放置一个Excel Source,Derived Column和OLE DB Destination,如下所示:

Data Flow Task

配置Excel源以读取适当的Excel文件和当前正在循环通过的工作表。

Excel Source Connection Manager

Excel Source Columns

配置派生的列以为文件名和图纸名称创建新列。这仅是为了演示该示例,但没有任何意义。

Derived column

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

OLE DB Destination Connection Manager

OLE DB Destination Columns

下面的屏幕快照显示了该包的成功执行。

Execution successful

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

SQL table

希望能有所帮助。

89
user756519

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

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

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

希望能帮助到你。

12
McRobert

我遇到了类似的问题,发现尽快删除Excel文件要容易得多。作为我程序包中第一步的一部分,我使用了Powershell将数据从Excel文件中提取到CSV文件中。我自己的Excel文件很简单,但是在这里

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

是Tim Smith撰写的精彩文章,内容涉及从多个Excel文件和/或多个工作表中提取数据。

将Excel文件转换为CSV后,数据导入就不再那么复杂了。

0
DBADon