使用power designer将模型Table等对象的描述信息导出到Excel中
昨天客户提了个需求,要求导出数据库表结构的信息到指定列的Excel表格,然后发给他。于是在网上搜了一些关于power designer导出到Excel的方法。所有的人几乎都是贴出来一样的代码,没有任何操作步骤。导出的格式内容没有达到我这个需求。所以才想重新改下脚本内容。
先介绍一下我使用的power designer版本是16.5.0.3982, 如图
步骤一、直接打开Power Designer工具,图中看到是我已经设计好的表(新建数据结构模型的具体操作这里不作描述):
可以看到之前设计时具体分为以下几个模块,等会操作的时可以一次导出全部。
步骤二、 按快捷键 Ctrl+shift + X 打开命令窗口 (或者使用工具栏的方式打开,总之能打开以下窗口即可) 如图3所示:
*使用工具栏的方式是如图操作,如果使用快捷键可以打开就不需要用此方法
步骤三、 写脚本(代码)。 这里是参考别的网友发的内容进行部分的修改 , 网上看到时有的实际情况并没有导出是否为空的数据,仔细阅读了内容才发现代码是有缺陷的,另外我增加了长度这一列的数据导出。(在此非常感谢各位好心人的分享!给了我很大的帮助)。
如果需要增加或减少导出的列,也可以在这里继续修改再拿去使用:
'******************************************************************************
'* File: Export_model_to_excel.vbs
'* Purpose: 将模型Table等对象的描述信息导出到Excel中
'* Title:
'* Category: Export
'* Author: tesia_fan
'* Created: 2019年10月24日
'* Modified:
'* Use: 打开PDM,创建新的PDM,运行本脚本(Ctrl+Shift+X)
'* Excel 格式为
'* MODEL Sheet
'* |A |B |C |D |E |F |G |H |I |J |K | L
'* 主题域 |表注释 |表英文名称 |表中文名称 |列名 |列中文名称 |列注释 |数据类型 |主键 |是否为空| 长度 |默认值 |
'* Version: 1.0
'* Comment:
'******************************************************************************
Option Explicit
' Model sheet中的列信息
CONST CELL_A="A" '主题域(Pachage)
CONST CELL_B="B" '表注释
CONST CELL_C="C" '表英文名称
CONST CELL_D="D" '表中文名称
CONST CELL_E="E" '列名
CONST CELL_F="F" '列中文名称
CONST CELL_G="G" '列注释
CONST CELL_H="H" '数据类型
CONST CELL_I="I" '是否主键
CONST CELL_J="J" '是否可空
CONST CELL_K="K" '长度
CONST CELL_L="L" '默认值
CONST str_iskey="Y"
DIM nb
'
' get the current active model
'
DIM mdl ' the current model
SET mdl = ActiveModel
IF (mdl IS NOTHING) THEN
MsgBox "没有选择一个Model"
END IF
DIM fldr
SET Fldr = ActiveDiagram.Parent
DIM isMerage '是否需要合并表名称单元格
DIM isMulite '是否不同的Package不同的sheet
DIM RQ
RQ = MsgBox ("是否不同的Package不同的sheet?", vbYesNo + vbInformation,"确认")
IF RQ= VbYes THEN
isMulite= TRUE
ELSE
isMulite= FALSE
END IF
' 创建新的Excel
DIM x1 '
SET x1 = CreateObject("Excel.Application")
x1.Workbooks.Add
x1.Visible = TRUE
ExportModelToExcel( fldr)
MsgBox "成功将 Models 导出到Excel中!"
'--------------------------------------------------------------------------------
'功能函数:将模型导出到Sheet页【 MODEL 】
'--------------------------------------------------------------------------------
PRIVATE FUNCTION ExportModelToExcel(folder)
'如果是每个package导出到不同的sheet页面,则采用folder的名称作为sheet页名称,否则使用"MODEL"作为sheet页名称
IF isMulite THEN
IF folder.Tables.count>0 THEN
AddExcelSheet(folder.name)
END IF
ELSE
AddExcelSheet("MODEL")
END IF
'写sheet页的第一行表头
WriteExcelModelHead
DIM nStart
DIM nEnd
DIM tabobj '定义数据表对象
nb=2
isMerage=TRUE
'开始循环处理所有的folder
FOR EACH tabobj IN folder.Tables
IF NOT tabobj.isShortcut THEN '快捷方式不处理
'合并表的单元格A、B、C
IF isMerage THEN '合并表的单元格A、B、C
nStart=nb '合并起始行
nEnd=nb+tabobj.Columns.count-1 '合并结束行
IF nStart<>nEnd THEN
'合并单元格
x1.Range(CELL_A+CSTR(nStart)+":"+CELL_A+CSTR(nEnd)).SELECT
x1.Selection.Merge
x1.Range(CELL_B+CSTR(nStart)+":"+CELL_B+CSTR(nEnd)).SELECT
x1.Selection.Merge
END IF
'将主题域、表名称、表注释填写到合并后单元格中
x1.Range(CELL_A+CSTR(nb)).Value = folder.name '主题域
x1.Range(CELL_B+CSTR(nb)).Value = Rtf2Ascii(tabobj.description) '表注释
END IF
'开始循环列兵输出信息
DIM colobj '定义列对象
FOR EACH colobj IN tabobj.Columns
'写表的信息
x1.Range(CELL_C+CSTR(nb)).Value = tabobj.code '表英文名称
x1.Range(CELL_D+CSTR(nb)).Value = tabobj.name '表英文名称
'写列的信息
x1.Range(CELL_E+CSTR(nb)).Value = colobj.code '列名
x1.Range(CELL_F+CSTR(nb)).Value = colobj.name '列中文名称
x1.Range(CELL_G+CSTR(nb)).Value = Rtf2Ascii(colobj.Description) '列注释
x1.Range(CELL_H+CSTR(nb)).Value = colobj.DataType '数据类型
'列是否主键,如果是主键,则输出 Y
IF colobj.primary THEN
x1.Range(CELL_I+CSTR(nb)).Value = "Y"
END IF
IF colobj.Mandatory = true Then
x1.Range(CELL_J+CSTR(nb)).Value = "Y"
END IF
x1.Range(CELL_K+CSTR(nb)).Value = colobj.Length '长度
nb = nb+1 '行号加1
NEXT
END IF
NEXT
'对子包进行递归,如果不使用递归只能取到第一个模型图内的表
DIM subfolder
FOR EACH subfolder IN folder.Packages
ExportModelToExcel(subfolder)
NEXT
END FUNCTION
'--------------------------------------------------------------------------------
'功能函数:添加一个Sheet页
'--------------------------------------------------------------------------------
PRIVATE SUB AddExcelSheet(sheetname)
x1.Sheets.Add
x1.ActiveSheet.Name=sheetname
END SUB
'--------------------------------------------------------------------------------
'功能函数:写Excel的第一行信息
'--------------------------------------------------------------------------------
PRIVATE SUB WriteExcelModelHead()
x1.Range(CELL_A+"1").Value = "主题域"
x1.Range(CELL_B+"1").Value = "表注释"
x1.Range(CELL_C+"1").Value = "表英文名称"
x1.Range(CELL_D+"1").Value = "表中文名称"
x1.Range(CELL_E+"1").Value = "列名"
x1.Range(CELL_F+"1").Value = "列中文名称"
x1.Range(CELL_G+"1").Value = "列注释"
x1.Range(CELL_H+"1").Value = "数据类型"
x1.Range(CELL_I+"1").Value = "主键"
x1.Range(CELL_J+"1").Value = "是否为空"
x1.Range(CELL_K+"1").Value = "长度"
x1.Range(CELL_L+"1").Value = "默认值"
'设置字体
x1.Columns(CELL_A+":"+CELL_L).SELECT
WITH x1.Selection.Font
.Name = "宋体"
.Size = 10
END WITH
'设置首行可过滤,背景颜色为灰色,字体粗体
x1.Range(CELL_A+"1:"+CELL_L+"1").SELECT
x1.Selection.AutoFilter
x1.Selection.Interior.ColorIndex = 15
x1.Selection.Font.Bold = TRUE
'设定首行固定
x1.Range(CELL_A+"2").SELECT
x1.ActiveWindow.FreezePanes = TRUE
END SUB
步骤四、复制写好的脚本内容,贴到刚刚打开的命令窗口。点击“Run” 按钮执行。
执行后会自动弹出导出的Excel , 如下图所示:
注意我这里为了方便,一次导出多个sheet表:
我按网上说的尝试了导出单个的,结果打开Excel是空白的,没有任何数据。也不知道是什么原因,只是猜测是我当时没有连数据库。后来试了其他人的还有报错信息,这其中参考了很多人的,具体是谁的忘了。。干脆放弃了这种方式。
失败后我重新检测了下另一种方式,最终发现了使用power designer将数据库表结构信息导出到Excel多个sheet 表的可以执行成功。