使用VBScript腳本從Excel文件中導入PowerDesigner的物理模型。 ...
本文使用的資料庫類型是Oracle 11g
最近在工作中遇到一個問題:數據的設計以表格的形式保存在Excel文件中。(由於保密原因,我只能看到資料庫設計文檔,無法訪問資料庫。=_=!)
其中包括Name,Code,DataType,Unit,Length,Precision,Primary,Foreign Key,Mandatory,Comment等欄位。
現在我要使用PowerDesigner重新建立這些表的物理模型,但是面對好幾百個表,如果使用複製粘貼的方式不但費事費力,而且容易出錯。
PowerDesigner提供了很多擴展功能,其中包括從Excel文件導入物理數據模型。
導入的方式有兩種,一種是把表的設計模型整理為PowerDesigner要求的格式,另外一種是編寫VBScript腳本。
由於編寫VBScritp比較靈活,而且把表的設計整理為PowerDesigner需要的格式也比較麻煩,所以通過編寫VBScript腳本導入Excel中的模型數據。
1 '============================================================ 2 '從Excel文件中導入PowerDesigner 物理數據模型 3 ' 4 '註意:1,Excel表格中不能有合併的單元格 5 ' 2,列之間不能有空行 6 '============================================================ 7 8 9 Option Explicit 10 11 '============================================================ 12 '私有全局變數。 13 '============================================================ 14 Private CURRENT_MODEL 15 Private TABLES 16 Private EXCEL_APP 17 Private FILE_PATH 18 19 Set CURRENT_MODEL = ActiveModel 20 Set EXCEL_APP = CreateObject("Excel.Application") 21 FILE_PATH="D:\models.xlsx" '文件的絕對路徑 22 23 24 '檢查文件是否存在 25 If CheckFileExsistence() Then 26 '檢查當前是否有已經打開的物理圖 27 If CURRENT_MODEL is Nothing Then 28 MsgBox("請先打開一個物理數據模型(Physical Data Model),然後再進執行導入!") 29 Else 30 Set TABLES = CURRENT_MODEL.Tables 31 '根據EXCEL表格創建模型 32 ImportModels() 33 End If 34 Else 35 MsgBox "文件" + FILE_PATH + "不存在!" 36 End If 37 38 39 '============================================================ 40 '檢查文件是否存在 41 '============================================================ 42 Function CheckFileExsistence 43 Dim fso 44 Set fso = CreateObject("Scripting.FileSystemObject") 45 CheckFileExsistence = fso.FileExists(FILE_PATH) 46 End Function 47 48 49 '============================================================ 50 '導入模型 51 '============================================================ 52 Sub ImportModels 53 '打開Excel文件 54 EXCEL_APP.Workbooks.Open FILE_PATH 55 56 Dim worksheets 57 Dim worksheetCount 58 Set worksheets = EXCEL_APP.Worksheets 59 worksheetCount = worksheets.Count 60 If worksheetCount <= 0 Then 61 Exit Sub 62 End If 63 64 Dim index 65 Dim currentSheet 66 For index = 1 to worksheetCount 67 Set currentSheet = worksheets(index) 68 CreateTable currentSheet 69 Next 70 71 '關閉Excel文件 72 EXCEL_APP.Workbooks.Close 73 End Sub 74 75 76 '============================================================ 77 '創建表 78 '============================================================ 79 Sub CreateTable(worksheet) 80 Dim cells 81 Set cells = worksheet.Cells 82 '檢查具有相同名稱的表是否已經存在 83 If TableExists(cells(1, 1).Value) Then 84 MsgBox "表“" + cells(1, 1).Value + "”已經存在!" 85 Exit Sub 86 End If 87 88 Dim table 89 Set table = TABLES.CreateNew 90 table.Name = cells(1, 1).Value 91 table.Code = cells(2, 1).Value 92 table.Comment = cells(3, 1).Value 93 94 95 Dim index 96 Dim rows 97 Dim col 98 Set rows = worksheet.Rows 99 For index = 4 to 512 100 If EXCEL_APP.WorksheetFunction.CountA(rows(index)) <= 0 Then 101 Exit For 102 End If 103 104 Set col = table.Columns.CreateNew 105 col.Name = cells(index, 1).Value '欄位的中文含義 106 col.Code = cells(index, 2).Value '欄位名 107 col.Unit = cells(index, 4).Value '欄位的單位 108 col.DataType = cells(index, 3).Value '欄位的數據類型 109 col.Comment = cells(index, 8).Value '欄位的註釋 110 Next 111 End Sub 112 113 114 '============================================================ 115 '檢查表是否已經存在 116 '============================================================ 117 Function TableExists(tableName) 118 Dim tbl 119 For Each tbl in TABLES 120 If StrComp(tbl.Name, tableName) = 0 Then 121 TableExists = True 122 Exit Function 123 End If 124 Next 125 TableExists = False 126 End FunctionView Code
下麵是測試腳本使用的Excel文件格式:
前三行的第一個單元格中的值分別是:表名稱,資料庫表名稱,表的說明信息。
第4行到低7行都是列信息。
A到H列依次為:列名,欄位名稱,數據類型,單位,是否主鍵,是否外鍵,是否非空,列註釋信息。
以下是Excel導入的步驟:
1,在PowerDesigner中先打開一個物理數據模型,然後按Ctrl + Shift + X執行腳本。
執行完成之後的界面如下:
導入完成之後PhysicalDiagram_1中並沒有顯示表的符號。
在PowerDesigner的元數據模型API文檔中沒有找到對應的API所以就這樣將就了;D
2,展開上圖所示的Tables文件夾。左鍵點擊圖標,把表拖到指定的物理圖(Physical Diagram)中。
這樣就實現了從Excel中導入資料庫物理模型。
總結:
這個腳本雖然實現了導入功能,但是還不夠完善。第二步要手動完成,因為我沒有找到相應的API =_=!。
此外,腳本中沒有設置相應的主鍵,外鍵和非空約束等。
如果哪位知道如何使用腳本實現第二步,請告訴我!謝謝!