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

uyto3xhc  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(180)

I need to create an SSIS package for importing data from multiple Excel files into an SQL database. I plan on using nested Foreach Loop containers to achieve this. One Foreach File Enumerator and nested within that, a Foreach ADO.net Schema Rowset Enumerator
需要考虑的问题:Excel文件之间的工作表名称不同,但结构保持不变。
我创建了Excel连接管理器,但架构行集枚举器不接受枚举器配置中的连接管理器。
经过研究,我发现您可以使用Jet Ole数据库提供程序连接到Excel文件。但是,我只能指定Microsoft Access数据库文件作为数据源。尝试插入Excel文件作为数据源失败
经过进一步的研究,我发现您可以通过连接字符串而不是DSN来使用Odbc数据提供程序。插入指定Excel文件的连接字符串后,此操作也失败了
我被告知不要使用脚本任务来完成此任务,即使在尝试了最后一搏从工作表中提取数据,通过索引访问工作表后,我发现不同excel文件中工作表的索引是不同的
任何帮助都将不胜感激

mnemlml8

mnemlml81#

这里有一个可能的方法来做到这一点的基础上的假设,将不会有任何空白表的Excel文件,而且所有的工作表遵循完全相同的结构。此外,在假设的文件扩展名只有.xlsx
以下示例是使用 SSIS 2008 R2Excel 2007 创建的。此示例的工作文件夹为F:\Temp\
在文件夹路径F:\Temp\中,创建一个名为States_1.xlsx的Excel 2007电子表格文件,其中包含两个工作表。

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

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

在文件夹路径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将包含循环文件的扩展名,此示例仅适用于.xlsxFilePath将由Foreach循环容器赋值,但我们需要在设计时以有效路径开始,并且当前使用第一个Excel文件的路径F:\Temp\States_1.xlsx填充。SheetName将包含实际的工作表名称,但我们需要使用初始值Sheet1$填充,以避免设计时错误。

在包的连接管理器中,使用以下配置创建ADO.NET连接,并将其命名为ExcelSchema
在OleDb的.Net提供程序下选择提供程序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循环容器一个放在另一个中。名为Loop files的第一个Foreach Loop container将循环遍历文件。第二个Foreach Loop container将遍历容器中的工作表。在内部For each循环容器中,放置一个将读取Excel文件并将数据加载到SQL中的数据流任务

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

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

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

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

配置派生列以创建文件名和工作表名的新列。这只是为了演示此示例,没有任何意义。

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

下面的屏幕截图显示了包的成功执行。
小行星

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

s3fp2yjn

s3fp2yjn2#

我遇到了一篇文章,它说明了一种方法,可以将同一Excel工作表中的数据导入到选定的表中,直到Excel中没有修改数据类型为止。
如果插入数据或用新数据覆盖数据,则导入过程将成功完成,数据将添加到SQL数据库的表中。
该文章可在此处找到:http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/
希望有帮助。

ajsxfq5m

ajsxfq5m3#

我也遇到过类似的问题,发现尽快删除Excel文件要简单得多。作为我的软件包的第一步,我使用Powershell将Excel文件中的数据提取到CSV文件中。我自己的Excel文件很简单,但在这里
Extract and convert all Excel worksheets into CSV files using PowerShell
是Tim Smith撰写的一篇优秀文章,介绍了如何从多个Excel文件和/或多个工作表中提取数据。
Excel文件转换为CSV后,数据导入的复杂性大大降低。

相关问题