背景
第二篇文章出爐了,還是oracle數據庫的問題,公司需要我們把字段到powerdesigner中。拜託!我數據庫語句都寫了,怎麼可能再逐字逐句錄入進去???
於是我開始搜如何將數據庫建表語句逆向導入到powerdesigner中,方法倒是有,需要連接oracle數據庫。拜託!我就是沒有這個數據庫才被迫用的livesql!
冥思苦想突然發現,原來前人早就有從excel批量導入powerdesigner的方法。
方案
vbs腳本!
什麼?你不會?沒關係,我也懶得去編輯,我在網上找了個腳本,稍微改動了一下,大家可以下載…
what?沒積分了?
沒關係,來我手把手教你複製。
步驟
- 第一步:複製附錄代碼,在桌面建一個txt文件,粘貼代碼。
- 第二步:更改txt名稱,改爲excel.vbs
- 第三步:將你的excel格式改造如下圖所示:
其中位置必須一致,可以縱向拓展,所有字段均嚴格按此圖排列(顏色沒必要)。
其中第一行爲表的信息,第二行爲固定格式,第三行至第N行爲你的字段信息。
如果想建多個表,就繼續加sheet,每個sheet佈局均需嚴格按照圖示。
- 打開powerdesigner,打開新建的項目。記住紅框1的名字。
- 使用腳本。
- 打開桌面腳本。
- 選擇腳本。
- 修改部分代碼:將代碼紅框位置改爲剛剛紅框1的名字。
下面的路徑爲你excel的絕對路徑。RUN即可導入。
附錄
Option Explicit
Private CURRENT_MODEL_NAME
Private CURRENT_MODEL
Private TABLES
Private EXCEL_APP
Private FILE_PATH
CURRENT_MODEL_NAME = "數據庫"
Set EXCEL_APP = CreateObject("Excel.Application")
FILE_PATH="C:\Users\Dell\Desktop\data.xlsx" '文件的絕對路徑
'檢查文件是否存在
If CheckFileExsistence() Then
'檢查當前是否有已經打開的物理圖
Call GetModelByName(CURRENT_MODEL)
If CURRENT_MODEL Is Nothing Then
MsgBox("請先打開一個名稱爲“" & CURRENT_MODEL_NAME & "”的物理數據模型(Physical Data Model),然後再進執行導入!")
Else
Set TABLES = CURRENT_MODEL.Tables
'根據EXCEL表格創建模型
ImportModels()
End If
Else
MsgBox "文件" + FILE_PATH + "不存在!"
End If
'============================================================
'導入模型
'============================================================
Sub ImportModels
'打開Excel文件
Dim Filename
Dim ReadOnly
EXCEL_APP.Workbooks.Open FILE_PATH
Dim worksheets
Dim worksheetCount
Set worksheets = EXCEL_APP.Worksheets
worksheetCount = worksheets.Count
If worksheetCount <= 0 Then
Exit Sub
End If
Dim index
Dim currentSheet
For index = 1 to worksheetCount
Set currentSheet = worksheets(index)
Call CreateTable(currentSheet)
Next
'關閉Excel文件
EXCEL_APP.Workbooks.Close
MsgBox "導入完成!"
End Sub
'============================================================
'創建表
'============================================================
Sub CreateTable(ByRef worksheet)
Dim cells
Set cells = worksheet.Cells
Dim table
'檢查具有相同名稱的表是否已經存在
Call GetTableByName(table, worksheet.Name)
If table Is Nothing Then
Set table = TABLES.CreateNew
table.Name = cells(1, 1).Value
table.Code = cells(1, 2).Value
table.Comment = cells(1, 3).Value
'table.Name = worksheet.Name
'table.Code = worksheet.Name
'table.Comment = worksheet.Name
End If
Dim index
Dim rows
Dim col
Set rows = worksheet.Rows
For index = 3 to 512
If EXCEL_APP.WorksheetFunction.CountA(rows(index)) <= 0 Then
Exit For
End If
If ((cells(index,1).Value = "") or (cells(index,2).Value = "Name" ))Then '第二列爲空的都可以忽略
'MsgBox "值2"
'continue '這裏忽略空行和表名行、表頭行
Else
set col =table.Columns.CreateNew '創建一列/字段
col.Code = cells(index, 1).Value '指定列code
'MsgBox "值3"
col.DataType = cells(index, 3).Value '指定列數據類型
If cells(index, 4).Value = "Y" Then'指定主鍵
col.Primary =true
Else
If cells(index, 5).Value = "否" Then'指定列是否可空 true 爲不可空
col.Mandatory =true
End If
End If
col.Name = cells(index, 2).Value '指定列name
col.Comment = cells(index, 2).Value '指定列說明
'count = count + 1
End If
Next
End Sub
'============================================================
'檢查文件是否存在
'============================================================
Function CheckFileExsistence
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
CheckFileExsistence = fso.FileExists(FILE_PATH)
End Function
'============================================================
'根據數據類型名稱,精度和刻度生成數據類型
'============================================================
Function GenerateDataType(dataTypeName, precision, scale)
Select Case Ucase(dataTypeName)
Case Empty
GenerateDataType = Empty
Case "NUMBER"
GenerateDataType = "NUMBER(" & precision & "," & scale & ")"
End Select
End Function
'============================================================
'獲取指定指定名稱的數據模型
'============================================================
Sub GetModelByName(ByRef model)
Dim md
For Each md in Models
If StrComp(md.Name, CURRENT_MODEL_NAME) = 0 Then
Set model = md
Exit Sub
End If
Next
Set model = Nothing
End Sub
'============================================================
'根據表名稱獲取對應的表
'============================================================
Sub GetTableByName(ByRef table, tableName)
Dim tb
For Each tb in TABLES
If StrComp(tb.Name, tableName) = 0 Then
Set table = tb
Exit Sub
End If
Next
Set table = Nothing
End Sub
'============================================================
'檢查字段是否已經存在
'============================================================
Function ColumnExists(ByRef table, columnName)
Dim col
For Each col in table.Columns
If StrComp(col.Name, columnName) = 0 Then
ColumnExists = True
Exit Function
End If
Next
ColumnExists = False
End Function