PowerDesigner导入excel生成sql语句

不足:唯一键unique key的方式用唯一索引unique index代替了)

  • 一、创建excel表

(可有多个sheet,注意保存格式一致,主要是列数要对好,或者就通过改代码cells(index, 4)中的4可以自己定义列数,该代码是以最后一列为空时结束代码)

  1. excel第一行格式固定如上,1-A是英文表名,1-B是中文表名
  2. 注意保持格式一致

  • 导入步骤

    PowerDesigner中打开File——>New Model——>Model types——>Physical Data Mode

(我选的是pg数据库,你们看自己是什么数据库)

3.按住Ctrl+Shift+X进入脚本运行界面,导入以下脚本并运行:

(1)注意修改表名和Excel文件路径:

        CURRENT_MODEL_NAME = "aaa";

        FILE_PATH="C:\Users\lanji\Desktop\2024.4、5月文档\Mxtracted_Products_Info.xlsx"    '文件的绝对路径。

代码如下
'============================================================
'从Excel文件中导入PowerDesigner 物理数据模型
'
'注意:1,Excel表格中不能有合并的单元格
'      2,列之间不能有空行格
'      3,注意文件是绝对地址,还有填好自己的model名

'============================================================
 
 
Option Explicit
 
'============================================================
'私有全局变量。
'============================================================
Private CURRENT_MODEL_NAME
Private CURRENT_MODEL
Private TABLES
Private EXCEL_APP
Private FILE_PATH
CURRENT_MODEL_NAME = "aaa"
Set EXCEL_APP = CreateObject("Excel.Application")
FILE_PATH="C:\Users\lanji\Desktop\2024.4、5月文档\Mxtracted_Products_Info1.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
    Dim indexSet  ' 用于存储需要索引的列
    Dim uniqueSet ' 新增:用于存储需要设置唯一约束的列
    Set indexSet = CreateObject("Scripting.Dictionary")
    Set uniqueSet = CreateObject("Scripting.Dictionary")  ' 创建一个新的字典对象来存储需要唯一约束的列
    
    ' 检查具有相同名称的表是否已经存在
    Call GetTableByName(table, worksheet.Name)
    If table Is Nothing Then
        Set table = TABLES.CreateNew
        table.Name = cells(1, 2).Value
        table.Code = cells(1, 1).Value
        table.Comment = cells(1, 2).Value
    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 Not ((cells(index, 1).Value = "") Or (cells(index, 2).Value = "Name")) Then
            Set col = table.Columns.CreateNew
            col.Code = cells(index, 1).Value
            col.DataType = cells(index, 3).Value
            If cells(index, 4).Value = "Y" Then
                col.Primary = True
            Else
                If cells(index, 5).Value = "Y" Then
                    col.Mandatory = True
                End If
            End If
            col.Name = cells(index, 2).Value
            col.Comment = cells(index, 6).Value
            
            ' 检查是否需要为此列添加索引
            If cells(index, 7).Value = "Y" Then
              call  indexSet.Add(col.Code, col)
            End If
            
            ' 检查第8列是否标记为"Y",设置唯一键
            If cells(index, 8).Value = "Y" Then
                Call uniqueSet.Add(col.Code, col)
            End If
            
        End If
    Next
    
    ' 为每个标记的列单独创建索引
    Dim colCode, indexColumn, newIndex
    For Each colCode In indexSet.Keys
        Set newIndex = table.Indexes.CreateNew
        newIndex.Name = "ix_" & table.Name & "$" & colCode
        newIndex.Code = "ix_" & table.Name & "$" & colCode
        
        Set indexColumn = newIndex.IndexColumns.CreateNew()
        indexColumn.Column = indexSet.Item(colCode)
        newIndex.IndexColumns.Add(indexColumn)
        
        table.Indexes.Add newIndex
    Next
    
   ' 为标记的列创建唯一约束
    
    For Each colCode In uniqueSet.Keys
        Dim newUnique, uniqueColumn
        Set newUnique = table.Indexes.CreateNew
        newUnique.Name = "uq_" & table.Name & "$" & colCode
        newUnique.Code = "uq_" & table.Name & "$" & colCode
        newUnique.Unique = True  ' 确保是唯一约束
        
        Set uniqueColumn = newUnique.IndexColumns.CreateNew()
        uniqueColumn.Column = uniqueSet.Item(colCode)
        newUnique.IndexColumns.Add(uniqueColumn)
        
        table.Indexes.Add newUnique
    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

  • 三、转成sql语句

1.选中tables或者相关表,选中tables可以将全部表转化成sql

2.进行相关设置(取消中文乱码):

  1. General页面不选中check model
  2. Format中的Encoding选择utp-8,然后确认即可

  • 四、成功

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值