2011-09-14 15 views
27

我需要創建一個SSIS包,用於將多個Excel文件中的數據導入SQL數據庫。我打算使用嵌套的Foreach Loop容器來實現這一點。一個Foreach文件枚舉器並嵌套在其中,一個Foreach ADO.net架構行集枚舉器如何循環訪問Excel文件並使用SSIS包將其加載到數據庫中?

需要考慮的問題:工作表名稱在Excel文件之間不同,但結構保持不變。

我創建了一個Excel連接管理器,但Schema Rowset Enumerator不接受Enumerator配置中的連接管理器。

經過研究,我發現您可以使用Jet Ole db提供程序連接到excel文件。但是,我只能將Microsoft Access數據庫文件指定爲數據源。試圖插入Excel文件作爲數據源失敗

經過更多的研究,我發現您可以使用連接字符串而不是DSN使用Odbc數據提供程序。在插入指定Excel文件的連接字符串後,這也失敗了

我被告知不要使用腳本任務來完成此操作,甚至在嘗試最後一次努力從表格中提取數據時,我通過索引訪問表格對於在不同的Excel文件中的表的索引是不同的

任何幫助,將不勝感激

+0

文件名以「.xslx」結尾。 文件枚舉器搜索這些文件:「[通配符] .xls [通配符]」。 Excel連接管理器自動檢測格式爲「Microsoft Excel 2007」。 – Xariex

+0

[鏈接](https://stackoverflow.com/documentation/ssis/9838/load-multiple-csv-files-of-same-format-from-a-folder#t=201705040855490267183)鏈路是用於裝載多個CSV從文件夾到數據庫的格式相同。 – observer

回答

78

這裏是這樣做基於這樣的假設不會有在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

Sheet 2States_2。XLSX包含以下數據

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填充。 工作表名稱將包含實際的工作表名稱,但我們需要填入初始值Sheet1$以避免設計時間錯誤。

​​

在包的連接管理器,創建具有以下配置,並將其命名爲ExcelSchema ADO.NET連接。

在.Net Providers for OleDb下選擇供應商Microsoft Office 12.0 Access Database Engine OLE DB Provider。提供文件路徑F:\Temp\States_1.xlsx

ExcelSchema 1

點擊左側的All部分,將屬性擴展屬性來Excel 12.0表示的Excel版本。在這種情況下,12.0表示Excel 2007。點擊測試連接以確保連接成功。

ExcelSchema 2

創建如下名爲Excel中的Excel連接管理器。

Excel

創建一個名爲SQLServer OLE DB連接的SQL Server。所以,我們應該在包裝上有三個連接,如下所示。

Connections

我們需要這樣,當文件通過環Excel文件是動態變化做下面的連接字符串的變化。

在連接ExcelSchema上,將表達式ServerName配置爲使用變量FilePath。點擊省略號按鈕來配置表達式。

ExcelSchema ServerName

類似地連接的Excel上,配置表達式ServerName使用變量FilePath。點擊省略號按鈕來配置表達式。

Excel ServerName

在控制流,將兩個Foreach循環容器一個在另一個內。名爲Loop文件的第一個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源,派生列和OLE DB目標,如下所示:

Data Flow Task

配置Excel Source以讀取相應的Excel文件和當前正在循環的表單。

Excel Source Connection Manager

Excel Source Columns

配置派生列來創建文件名和表名稱新列。這只是爲了演示這個例子,但沒有意義。

Derived column

配置OLE DB目標將數據插入到SQL表。

OLE DB Destination Connection Manager

OLE DB Destination Columns

下面的屏幕截圖示出了包裝的成功執行。

Execution successful

下面的截圖顯示,從4個工作簿中2個的Excel電子表格中創造了這個答案的開頭數據被正確地加載到SQL表dbo.Destination。

SQL table

希望有所幫助。

+1

謝謝Siva。這是一個有用的答案。然而它一直在我身邊失敗。在一天結束時,我最終編寫了一個Powershell腳本來檢測目標工作表並更改名稱。使所有表單具有相同的名稱以引用它們。謝謝你的回答 – Xariex

+2

這對我很好。起初它保持失敗,這是因爲我必須將調試64位設置爲FALSE。要做到這一點去Project - > YourProjectProperties - >調試 - > Run64BitRuntime = FALSE – Migs

+0

這是非常有用的,但我想使文件名動態,我不想每次自己把文件名。有什麼可能嗎? –

10

我跑進示出一種方法,其中從相同的數據Excel工作表可以在所選擇的表中被導入,直到有在Excel中與數據類型不作任何修改的製品。

如果數據被插入或用新的覆蓋,導入過程將成功完成,並且數據將在SQL數據庫添加到表。

物品可以在這裏找到:http://www.sqlshack.com/using-ssis-packages-import-ms-excel-data-database/

希望它能幫助。

0

我也有類似的問題,並認爲這是更簡單,以得到儘快擺脫Excel文件的。作爲我包中的第一步的一部分,我使用Powershell將Excel文件中的數據提取到CSV文件中。我自己的Excel文件很簡單,但這裏

Extract and convert all Excel worksheets into CSV files using PowerShell

是一個很好的文章由蒂姆·史密斯提取多個Excel文件和/或多個工作表數據。

將Excel文件轉換爲CSV後,數據導入就不復雜了。

相關問題