一、PDM与建表sql互转

1、PDM转建表sql

选中表格,可以多选操作,然后按快捷键ctrl+g,复制Preview内容即可,最后会在桌面生成一个文件,用记事本打开即可。

2、建表sql转PDM



二、 PDM与EXCEL互转

1、PDM转EXCEL

CTRL+SHIFT+X,然后将下面代码粘进去直接run就行。

'******************************************************************************
Option ExplicitDim rowsNum,tablesNumrowsNum = 0tablesNum = 0
'-----------------------------------------------------------------------------
' Main function,excel 表的顺序是按照pdm中建立的前后顺序来生成的
'-----------------------------------------------------------------------------
' Get the current active modelDim ModelSet Model = ActiveModelIf (Model Is Nothing) Or (Not Model.IsKindOf(PdPDM.cls_Model)) ThenMsgBox "The current model is not an PDM model."Else' Get the tables collection'创建EXCEL APPdim beginrowDIM EXCEL,BOOK,SHEETLISTset EXCEL = CREATEOBJECT("Excel.Application")Set BOOK = EXCEL.Workbooks.Add(-4167) '新建工作簿BOOK.sheets(1).name ="目录"set SHEETLIST = BOOK.sheets("目录")ShowTableList Model,SHEETLISTShowProperties Model,BOOK,SHEETLISTMsgBox "导出完成!"End If
'-----------------------------------------------------------------------------
' Show properties of tables
'-----------------------------------------------------------------------------
Sub ShowProperties(mdl,BOOK,SheetList)' Show tables of the current model/packagerowsNum=0beginrow = rowsNum+1Dim rowIndex '设置首页超链接开始行数rowIndex=2' For each tableoutput "begin"Dim tabFor Each tab In mdl.tablestablesNum = tablesNum +1ShowTable tab,BOOK,rowIndex,sheetList,tablesNumrowIndex = rowIndex +1Next'使sheet分等级AB'if mdl.tables.count > 0 then'    BOOK.Sheets(BOOK.Sheets.count).Range("A" & beginrow + 1 & ":A" & rowsNum).Rows.Group'end ifoutput "end"
End Sub
'-----------------------------------------------------------------------------
' Show table properties
'-----------------------------------------------------------------------------
Sub ShowTable(tab, BOOK,rowIndex,sheetList,tablesNum)If IsObject(tab) ThenDim rangFlag,SHEET,sheetName'EXCEL.workbooks.add(-4167)'添加工作表BOOK.Sheets.Add , BOOK.Sheets(BOOK.Sheets.count)'sheet的名字命名sheetName = tab.code+"("+tab.name+")"BOOK.Sheets(BOOK.Sheets.count).Name = sheetNameset SHEET = BOOK.sheets(sheetName)'EXCEL.workbooks(1).sheets.add(-4167)EXCEL.workbooks(1).Sheets(tablesNum).SelectEXCEL.visible = true'设置列宽sheet.Columns(1).ColumnWidth = 5sheet.Columns(2).ColumnWidth = 5sheet.Columns(3).ColumnWidth = 5sheet.Columns(4).ColumnWidth = 25sheet.Columns(5).ColumnWidth = 25sheet.Columns(6).ColumnWidth = 25sheet.Columns(7).ColumnWidth = 5sheet.Columns(8).ColumnWidth = 25'不显示网格线EXCEL.ActiveWindow.DisplayGridlines = truerowsNum = 0rowsNum = rowsNum + 1' Show propertiesOutput "================================"sheet.cells(rowsNum, 1) ="返回目录"sheet.cells(rowsNum, 4) =tab.namesheet.cells(rowsNum, 5) = tab.codesheet.cells(rowsNum, 6) = tab.comment'sheet.cells(rowsNum, 6) = ""'sheet.cells(rowsNum, 7) = "表说明"'sheet.cells(rowsNum, 8).HorizontalAlignment=3'下面代码是合并单元格'sheet.Range(sheet.cells(rowsNum, 4),sheet.cells(rowsNum, 7)).Merge'设置超链接,从目录点击表名去查看表结构    注意:首页的超链接在这里设置的'(rowIndex,2)指的是你要设置超链接的位置,(sheetName&"!A"&rowsNum)指的是你要连接到的位置'注意下面两行相互对应sheetList.Hyperlinks.Add sheetList.cells(rowIndex,2), "","'"&sheetName&"'"&"!A"&rowsNumsheet.Hyperlinks.Add sheet.cells(rowsNum,1), "","目录"&"!B"&rowIndexrowsNum = rowsNum + 1sheet.cells(rowsNum, 1) = "序號"sheet.cells(rowsNum, 2) = "是否主键"sheet.cells(rowsNum, 3) = "是否为索引"sheet.cells(rowsNum, 4) = "字段名"sheet.cells(rowsNum, 5) = "字段描述"sheet.cells(rowsNum, 6) = "數據類型"sheet.cells(rowsNum, 7) = "可空"sheet.cells(rowsNum, 8) = "備註"'为标题列添加颜色sheet.Range(sheet.cells(rowsNum, 1),sheet.cells(rowsNum, 8)).Interior.Color = RGB(254,127,127)Dim col ' running columnDim colsNumcolsNum = 0for each col in tab.columnsrowsNum = rowsNum + 1colsNum = colsNum + 1sheet.cells(rowsNum, 1) = rowsNum-2'序号sheet.cells(rowsNum, 5) = col.name'字段描述sheet.cells(rowsNum, 4) = col.code'字段名sheet.cells(rowsNum, 6) = col.datatype'数据类型sheet.cells(rowsNum, 8) = col.comment'备注If col.Primary = true Then'是否主键sheet.cells(rowsNum, 2) = "Y" Elsesheet.cells(rowsNum, 2) = "" End IfIf col.Mandatory = true Then'是否为空sheet.cells(rowsNum, 7) = "N" Elsesheet.cells(rowsNum, 7) = "" End If'sheet.cells(rowsNum, 7) =  col.defaultvalue'默认值next'1代表实线,3代表虚线'设置边框sheet.Range(sheet.cells(1, 1),sheet.cells(rowsNum, 8)).Borders.LineStyle = "1"'字体为微软雅黑sheet.Range(sheet.cells(1, 1),sheet.cells(rowsNum, 8)).Font.Name="微软雅黑"'字号为12号sheet.Range(sheet.cells(1, 1),sheet.cells(rowsNum, 8)).Font.Size=12'设置居中显示sheet.Range(sheet.cells(1, 1),sheet.cells(rowsNum, 8)).HorizontalAlignment=3'自动换行sheet.Range(sheet.cells(1, 1),sheet.cells(rowsNum, 8)).WrapText=truerowsNum = rowsNum + 2Output "FullDescription: "       + tab.NameEnd IfEnd Sub
'-----------------------------------------------------------------------------
' Show List Of Table首页
'-----------------------------------------------------------------------------
Sub ShowTableList(mdl, SheetList)' Show tables of the current model/packageDim rowsNorowsNo=1' For each tableoutput "begin"SheetList.cells(rowsNo, 1) = "主题"SheetList.cells(rowsNo, 2) = "表中文名"SheetList.cells(rowsNo, 3) = "表英文名"SheetList.cells(rowsNo, 4) = "表说明"'rowsNo = rowsNo + 1'添加pd mode名字'SheetList.cells(rowsNo, 1) = mdl.nameDim tabFor Each tab In mdl.tablesIf IsObject(tab) ThenrowsNo = rowsNo + 1SheetList.cells(rowsNo, 1) = ""SheetList.cells(rowsNo, 2) = tab.nameSheetList.cells(rowsNo, 3) = tab.codeSheetList.cells(rowsNo, 4) = tab.commentEnd IfNextSheetList.Columns(1).ColumnWidth = 20 SheetList.Columns(2).ColumnWidth = 20 SheetList.Columns(3).ColumnWidth = 30 SheetList.Columns(4).ColumnWidth = 60'实线     SheetList.Range(SheetList.cells(1,1),SheetList.cells(rowsNo,4)).Borders.LineStyle = "1"'字体为微软雅黑SheetList.Range(SheetList.cells(1, 1),SheetList.cells(rowsNo, 4)).Font.Name="microsoft jhenghei"'字号为12号SheetList.Range(SheetList.cells(1, 1),SheetList.cells(rowsNo, 4)).Font.Size=12'设置居中显示SheetList.Range(SheetList.cells(1, 1),SheetList.cells(rowsNo, 4)).HorizontalAlignment=3'自动换行SheetList.Range(SheetList.cells(1, 1),SheetList.cells(rowsNo, 4)).WrapText=trueoutput "end"
End Sub

2、EXCEL转PDM

使用的话,需要注意一些问题。
先放一遍代码,然后再放加解释的代码(这个加解释(粗体字)的不能运行,照葫芦画瓢改未加解释的代码)。


'============================================================
'从Excel文件中导入PowerDesigner 物理数据模型
'
'注意:1,Excel表格中不能有合并的单元格
'      2,列之间不能有空行
'============================================================Option Explicit'============================================================
'私有全局变量。
'============================================================
Private CURRENT_MODEL_NAME
Private CURRENT_MODEL
Private TABLES
Private EXCEL_APP
Private FILE_PATH
'这里请输入model名字,默认是Excel注意大小写
CURRENT_MODEL_NAME = "Excel"
Set EXCEL_APP = CreateObject("Excel.Application")
FILE_PATH="C:\Users\admin\Desktop\模板.xlsx"    '文件的绝对路径'检查文件是否存在
If CheckFileExsistence() Then'检查当前是否有已经打开的物理图Call GetModelByName(CURRENT_MODEL)If CURRENT_MODEL Is Nothing ThenMsgBox("请先打开一个名称为“" & CURRENT_MODEL_NAME & "”的物理数据模型(Physical Data Model),然后再进执行导入!")ElseSet TABLES = CURRENT_MODEL.Tables'根据EXCEL表格创建模型ImportModels()End If
ElseMsgBox "文件" + FILE_PATH + "不存在!"
End If'============================================================
'导入模型
'============================================================
Sub ImportModels'打开Excel文件Dim FilenameDim ReadOnlyEXCEL_APP.Workbooks.Open FILE_PATHDim worksheetsDim worksheetCountSet worksheets = EXCEL_APP.WorksheetsworksheetCount = worksheets.CountIf worksheetCount <= 0 ThenExit SubEnd IfDim indexDim currentSheetFor index = 1 to worksheetCountSet currentSheet = worksheets(index)Call CreateTable(currentSheet)Next'关闭Excel文件EXCEL_APP.Workbooks.CloseMsgBox "导入完成!"
End Sub'============================================================
'创建表
'============================================================
Sub CreateTable(ByRef worksheet)Dim cellsSet cells = worksheet.CellsDim table'检查具有相同名称的表是否已经存在Call GetTableByName(table, worksheet.Name)If table Is Nothing ThenSet table = TABLES.CreateNew'Set table = TABLES.CreateNewtable.Name = cells(1, 1).Valuetable.Code = cells(1, 2).Valuetable.Comment = cells(1, 3).Value'table.Name = worksheet.Name'table.Code = worksheet.Name'table.Comment = worksheet.NameEnd IfDim indexDim rowsDim colSet rows = worksheet.RowsFor index = 3 to 512If EXCEL_APP.WorksheetFunction.CountA(rows(index)) <= 0 ThenExit ForEnd IfIf ((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 =trueElseIf cells(index, 5).Value = "N" Then'指定列是否可空 true 为不可空col.Mandatory =trueEnd IfEnd Ifcol.Name = cells(index, 2).Value    '指定列name            col.Comment = cells(index, 2).Value  '指定列说明'count = count + 1End If    Next
End Sub'============================================================
'检查文件是否存在
'============================================================
Function CheckFileExsistenceDim fsoSet fso = CreateObject("Scripting.FileSystemObject")CheckFileExsistence = fso.FileExists(FILE_PATH)
End Function'============================================================
'根据数据类型名称,精度和刻度生成数据类型
'============================================================
Function GenerateDataType(dataTypeName, precision, scale)Select Case Ucase(dataTypeName)Case EmptyGenerateDataType = EmptyCase "NUMBER"GenerateDataType = "NUMBER(" & precision & "," & scale & ")"End Select
End Function'============================================================
'获取指定指定名称的数据模型
'============================================================
Sub GetModelByName(ByRef model)Dim mdFor Each md in ModelsIf StrComp(md.Name, CURRENT_MODEL_NAME) = 0 ThenSet model = mdExit SubEnd IfNextSet model = Nothing
End Sub'============================================================
'根据表名称获取对应的表
'============================================================
Sub GetTableByName(ByRef table, tableName)Dim tbFor Each tb in TABLESIf StrComp(tb.Name, tableName) = 0 ThenSet table = tbExit SubEnd IfNextSet table = Nothing
End Sub'============================================================
'检查字段是否已经存在
'============================================================
Function ColumnExists(ByRef table, columnName)Dim colFor Each col in table.ColumnsIf StrComp(col.Name, columnName) = 0 ThenColumnExists = TrueExit FunctionEnd IfNextColumnExists = False
End Function

'============================================================
'从Excel文件中导入PowerDesigner 物理数据模型
'注意:1,Excel表格中不能有合并的单元格
’ 2,列之间不能有空行
'============================================================

Option Explicit

'============================================================
'私有全局变量。
'============================================================
Private CURRENT_MODEL_NAME
Private CURRENT_MODEL
Private TABLES
Private EXCEL_APP
Private FILE_PATH
'这里请输入model名字,默认是Excel注意大小写
CURRENT_MODEL_NAME = “Excel------------放这个model名字
Set EXCEL_APP = CreateObject(“Excel.Application”)
FILE_PATH=“C:\Users\admin\Desktop\模板.xlsx” -----------------选择你设计好的Excel的路径
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 ------假如你第一个sheet是目录,那么改成For index = 2 to worksheetCount,否则就为1.
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
'Set table = TABLES.CreateNew

table.Name = cells(1, 5).Value
table.Code = cells(1, 4).Value
table.Comment = cells(1, 5).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 ----------------------从第几行开始,比如我的那个截图,数据从第三行才开始,所以写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, 4).Value '---------------字段名,比如我的截图我要写成4
'MsgBox “值3”
col.DataType = cells(index, 6).Value '指定列数据类型**----数据类型我要写成7**
If cells(index, 2).Value = “Y” Then’指定主键 ----主键
col.Primary =true
Else
If cells(index, 7).Value = “N” Then’指定列是否可空 true 为不可空
col.Mandatory =true ----非空判断 7
End If
End If
col.Name = cells(index, 5).Value –字段中文名 5
col.Comment = cells(index, 8).Value '----备注 8
'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

OK剩下的不用改了,操作前记得创建一个空的pdm。

3、EXCEL与sql互转。

通过上两个操作就可以做到EXCEL与sql互转。 当然也可以使用poi读取Excel拼接出建表sql。在這裏就不做介紹了,可以上某li站看poi怎麽使用。
poi會用的話,工作上會有提高很大的效率。

PDM和建表sql,PDM和EXCEL互转操作。相关推荐

  1. 利用python编写exe应用,实现excel文件输出建表sql文件。

    目录 一.excel文件内容如下: 二.生成如下sql: 三. 思路: 1.设计界面 2.界面分模块设计 2.1 模块一(数据库选择) 点击选择按钮会触发command后面的函数,同时会相应的返回va ...

  2. PowerDesigner生成数据库建表sql脚本

    PowerDesigner生成数据库建表sql脚本 一.生成sql server 2000或oracle建表sql脚本 1.新建一个物理模型,通过database菜单下的change current ...

  3. mysql查询建表SQL语句

    前言 mysql 5.7.26 查询建表SQL语句 SHOW CREATE TABLE <表名> 示例1: shell> mysql -uroot -p Enter password ...

  4. 全国省市区建表sql

    全国省市区建表sql 一.建表 DROP TABLE IF EXISTS `area_info`; CREATE TABLE `area_info` (`id` int(11) NOT NULL AU ...

  5. 自动生成小工具(二):根据建表sql自动生成增删改查sql语句文件

    Mybatis自动生成插件虽然功能强大,但是也略显笨重.我自己开发了一个自动生成的小工具,更加简单,更加轻量级. 一共只有几百行代码,想改的话,直接修改即可.根据自己的实际情况,可以进行灵活的二次开发 ...

  6. 超全的数据库建表/SQL/索引规范,适合贴在工位上!

    背景 ​ 因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成下边的文本,规范在整个后端执行也有大半年的时间,对于整个团队在开发阶段就减少不恰当的建 ...

  7. python读取excel生成mysql建表语句_python读取excel文件并自动在mysql中建表导数据

    """ 根据excel在mysql中建表(表名为文件名,字段为csv中的header,默认所有字段为varchar,如需更改,在数据库中更改即可),并插入数据 " ...

  8. sql datetime 排序_超全的数据库建表/SQL/索引规范,建议贴在工位上!

    作者:浮雷来源:juejin.im/post/6871969929365553165 「背景」 因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成 ...

  9. quartz各版本MySQL数据库存储建表SQL语句

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 用quartz管理任务计划很方便,但是当使用数据库作为存储介质的时候,必须要先创建表,不然就会报错. ...

最新文章

  1. 进程间通信 - 动态链接库实现
  2. android 生命周期 Activity/Fragment lifecycle
  3. C语言实现大数据除法
  4. 单电源运算放大器全波整流电路_精密半波、全波整流电路结构原理图解
  5. php with openssl directory,为php打扩展openssl 详细步骤
  6. .NET Framework 3.5 SP1的图表控件——Chart (转)
  7. 9-6 虚拟哈希分布
  8. Vmware 安装 ghost 版 win 7
  9. 【实习】C++开发 - 美国顶尖金融交易公司-Akuna Capital - 金融科技
  10. 2021年金属非金属矿山(地下矿山)安全管理人员最新解析及金属非金属矿山(地下矿山)安全管理人员证考试
  11. 用 DiskGenius 和 HDD Regenerator 修复硬盘逻辑坏道和隐藏物理坏道
  12. 这一年炼就的底层内功修养
  13. VC版计算器(豪华界面)
  14. 我是如何在12周内由零基础成为一名程序员的——谨以此文激励自己!!!
  15. 【DFS练习】水洼数
  16. 批量进行数字变下标的处理
  17. c语言编程工具栏没有了,2009计算机二级C语言:工具栏,可拖动,并在被隐藏的地方显示的实现代码...
  18. 一影碎念,一场风花,浅吟低唱成悲曲:伤感日志
  19. fMRI与MRI区别+名词解释+MRI中T1和T2的含义与区分
  20. 【题目集02丨PTA】PTA基础编程题目集(自己做的)

热门文章

  1. 数据库安装windows
  2. react 的 connect 与 @connect
  3. 数据通信原理——第二章(数据信号的传输)备考自用
  4. python提交事务_事务 - 廖雪峰的官方网站
  5. 正版office2007标准版
  6. nuScenes、Culane数据集、Camera选型及内参标定、TX2外接双目相机ZED
  7. Xshell使用技巧总结
  8. java查询数据库大批量数据_数据库有百万数据量的情况下,分页查询的方法及其优化方式...
  9. 介绍三个开发技术小知识点
  10. 数字图像处理 实验六:方块编码(BTC)