EXCEL批量导入PowerDesigner

背景

第二篇文章出炉了,还是oracle数据库的问题,公司需要我们把字段到powerdesigner中。拜托!我数据库语句都写了,怎么可能再逐字逐句录入进去???
于是我开始搜如何将数据库建表语句逆向导入到powerdesigner中,方法倒是有,需要连接oracle数据库。拜托!我就是没有这个数据库才被迫用的livesql!
冥思苦想突然发现,原来前人早就有从excel批量导入powerdesigner的方法。

方案

vbs脚本!
什么?你不会?没关系,我也懒得去编辑,我在网上找了个脚本,稍微改动了一下,大家可以下载…
what?没积分了?
没关系,来我手把手教你复制。

步骤

  1. 第一步:复制附录代码,在桌面建一个txt文件,粘贴代码。
  2. 第二步:更改txt名称,改为excel.vbs
  3. 第三步:将你的excel格式改造如下图所示:
    其中位置必须一致,可以纵向拓展,所有字段均严格按此图排列(颜色没必要)。
    其中第一行为表的信息,第二行为固定格式,第三行至第N行为你的字段信息。
    如果想建多个表,就继续加sheet,每个sheet布局均需严格按照图示。
    样例
  4. 打开powerdesigner,打开新建的项目。记住红框1的名字。项目
  5. 使用脚本。在这里插入图片描述
  6. 打开桌面脚本。在这里插入图片描述
  7. 选择脚本。在这里插入图片描述
  8. 修改部分代码:将代码红框位置改为刚刚红框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

原创文章 5 获赞 9 访问量 220

猜你喜欢

转载自blog.csdn.net/weixin_44159662/article/details/105676112
今日推荐