摘要:[SSIS]在EXCEL中依不同Sheet塞入同一資料表中
user提出想匯入每年每月KPI的資料可以在PPS上給主管看
給的資料是照年份分Sheet的
例:KPI2009、KPI2010
所以會需要跑各Tab再將各Sheet的資料寫入
整個架構如下圖
使用三個參數
第一個資料流程,用指令碼元件去抓Excel上的Sheet名稱再將資料匯入到資料錄目的地
指令碼設定:
1、輸出欄位名稱為colSheet,型態為字串
2、設定連接管理員
3、編輯指令碼,因為檔案中還有其他資料Sheet,所以還要判斷只抓"KPI20"開頭的Sheet,輸出欄位為colSheet
02 Inherits UserComponent
03
04 Dim xlsconn As OleDb.OleDbConnection
05 Dim dt As DataTable
06
07
08 Public Overrides Sub PreExecute()
09 MyBase.PreExecute()
10 '
11 ' Add your code here for preprocessing or remove if not needed
12 '
13 Dim strMyXls As String = Me.Connections.Excel連接MESKPI.ConnectionString
14 xlsconn = New OleDb.OleDbConnection(strMyXls)
15 xlsconn.Open()
16 dt = xlsconn.GetSchema("Tables")
17
18 End Sub
19
20 Public Overrides Sub PostExecute()
21 MyBase.PostExecute()
22 '
23 ' Add your code here for postprocessing or remove if not needed
24 ' You can set read/write variables here, for example:
25 ' Me.Variables.MyIntVar = 100
26 '
27 End Sub
28
29 Public Overrides Sub CreateNewOutputRows()
30 '
31 ' Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer".
32 ' For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput".
33 '
34 With OutputBuffer
35 For Each dr As DataRow In dt.Rows
36 If dr.ItemArray(2).ToString.Length = 8 Then
37 If dr.ItemArray(2).ToString.Substring(0, 5) = "KPI20" Then
38 .AddRow()
39 .colSheet = dr.ItemArray(2).ToString
40 End If
41 End If
42 Next
43 End With
44 End Sub
45
46 Public Overridable Sub ReleaseConnection()
47 xlsconn.Close()
48 End Sub
49
50 End Class
資料錄集合目的地
1、要設定的參數
2、輸入資料為colSheet
ForEach迴圈抓出每個Sheet名稱
把抓出來的SheetName丟給strExcelSheetname
先將每個Sheet名稱的年份抓出來丟給intYear參數
刪除資料庫中已存在同年份的資料。
因為是使用OLEDB,所以參數是用「?」
如果是用ADO.NET就要改成用「@」的
迴圈的資料流程
Excel資料來源,這裡使用的資料存取模式是「資料表名稱或檢視表名稱變數」,
因為要使用傳入的sheetname參數
另外要注意的是,Excel的Sheet名稱不可以含有「-」,不然在預覽跟執行時會發生
「索引和長度必須參考字串中的位置」這個錯誤
另外使用Excel來源似乎要將封裝改為32位元來執行,不然也會發生Driver的問題。
再來就直接轉到資料庫不說明了
雖然看似簡單,但是過程中發生一堆錯誤,尤其是Sheet名稱的錯誤,也是試不少時間才發現錯誤的原因。
-----------------------------------------------------
參考資料:http://ithelp.ithome.com.tw/question/10032561?tab=opinion