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文件中工作表的索引是不同的
任何帮助都将不胜感激
3条答案
按热度按时间mnemlml81#
这里有一个可能的方法来做到这一点的基础上的假设,将不会有任何空白表的Excel文件,而且所有的工作表遵循完全相同的结构。此外,在假设的文件扩展名只有
.xlsx
以下示例是使用 SSIS 2008 R2 和 Excel 2007 创建的。此示例的工作文件夹为
F:\Temp\
在文件夹路径
F:\Temp\
中,创建一个名为States_1.xlsx
的Excel 2007电子表格文件,其中包含两个工作表。Sheet 1
包含以下数据Sheet 2
包含以下数据在文件夹路径
F:\Temp\
中,创建另一个名为States_2.xlsx
且包含两个工作表的Excel 2007电子表格文件。Sheet 1
包含以下数据Sheet 2
包含以下数据使用下面的创建脚本在SQL Server中创建名为dbo.destination的表。Excel工作表数据将插入到此表中。
表当前为空。
创建一个新的SSIS包,并在该包上,创建以下4个变量。FolderPath将包含存储Excel文件的文件夹。FilePattern将包含循环文件的扩展名,此示例仅适用于
.xlsx
。FilePath将由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中。
s3fp2yjn2#
我遇到了一篇文章,它说明了一种方法,可以将同一Excel工作表中的数据导入到选定的表中,直到Excel中没有修改数据类型为止。
如果插入数据或用新数据覆盖数据,则导入过程将成功完成,数据将添加到SQL数据库的表中。
该文章可在此处找到:http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/
希望有帮助。
ajsxfq5m3#
我也遇到过类似的问题,发现尽快删除Excel文件要简单得多。作为我的软件包的第一步,我使用Powershell将Excel文件中的数据提取到CSV文件中。我自己的Excel文件很简单,但在这里
Extract and convert all Excel worksheets into CSV files using PowerShell
是Tim Smith撰写的一篇优秀文章,介绍了如何从多个Excel文件和/或多个工作表中提取数据。
Excel文件转换为CSV后,数据导入的复杂性大大降低。