你的位置:首页 > 数据库

[数据库]PowerDesigner 16.5 使用VBScript脚本从Excel导入物理数据模型


本文使用的数据库类型是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 512100    If EXCEL_APP.WorksheetFunction.CountA(rows(index)) <= 0 Then101     Exit For102    End If103  104    Set col = table.Columns.CreateNew105    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  Next111 End Sub112 113 114 '============================================================115 '检查表是否已经存在116 '============================================================117 Function TableExists(tableName)118 Dim tbl119 For Each tbl in TABLES120  If StrComp(tbl.Name, tableName) = 0 Then121    TableExists = True122    Exit Function123  End If124 Next125  TableExists = False126 End Function

View Code

下面是测试脚本使用的Excel文件格式:

前三行的第一个单元格中的值分别是:表名称,数据库表名称,表的说明信息。

第4行到低7行都是列信息。

A到H列依次为:列名,字段名称,数据类型,单位,是否主键,是否外键,是否非空,列注释信息。

 

以下是Excel导入的步骤:

1,在PowerDesigner中先打开一个物理数据模型,然后按Ctrl + Shift + X执行脚本。

   执行完成之后的界面如下:

 

总结:

这个脚本虽然实现了导入功能,但是还不够完善。第二步要手动完成,因为我没有找到相应的API =_=!。

此外,脚本中没有设置相应的主键,外键和非空约束等。

如果哪位知道如何使用脚本实现第二步,请告诉我!谢谢!