使用power designer将模型Table等对象的描述信息导出到Excel中

昨天客户提了个需求,要求导出数据库表结构的信息到指定列的Excel表格,然后发给他。于是在网上搜了一些关于power designer导出到Excel的方法。所有的人几乎都是贴出来一样的代码,没有任何操作步骤。导出的格式内容没有达到我这个需求。所以才想重新改下脚本内容。

 先介绍一下我使用的power designer版本是16.5.0.3982, 如图

 使用power designer将模型Table等对象的描述信息导出到Excel中

步骤一、直接打开Power Designer工具,图中看到是我已经设计好的表(新建数据结构模型的具体操作这里不作描述):

使用power designer将模型Table等对象的描述信息导出到Excel中

可以看到之前设计时具体分为以下几个模块,等会操作的时可以一次导出全部。

使用power designer将模型Table等对象的描述信息导出到Excel中

步骤二、 按快捷键  Ctrl+shift + X  打开命令窗口  (或者使用工具栏的方式打开,总之能打开以下窗口即可) 如图3所示:

 

使用power designer将模型Table等对象的描述信息导出到Excel中

*使用工具栏的方式是如图操作,如果使用快捷键可以打开就不需要用此方法

使用power designer将模型Table等对象的描述信息导出到Excel中

步骤三、 写脚本(代码)。 这里是参考别的网友发的内容进行部分的修改 , 网上看到时有的实际情况并没有导出是否为空的数据,仔细阅读了内容才发现代码是有缺陷的,另外我增加了长度这一列的数据导出。(在此非常感谢各位好心人的分享!给了我很大的帮助)。

如果需要增加或减少导出的列,也可以在这里继续修改再拿去使用

'******************************************************************************

'* 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” 按钮执行。

使用power designer将模型Table等对象的描述信息导出到Excel中

执行后会自动弹出导出的Excel , 如下图所示:

使用power designer将模型Table等对象的描述信息导出到Excel中

注意我这里为了方便,一次导出多个sheet表:

使用power designer将模型Table等对象的描述信息导出到Excel中

我按网上说的尝试了导出单个的,结果打开Excel是空白的,没有任何数据。也不知道是什么原因,只是猜测是我当时没有连数据库。后来试了其他人的还有报错信息,这其中参考了很多人的,具体是谁的忘了。。干脆放弃了这种方式。

失败后我重新检测了下另一种方式,最终发现了使用power designer将数据库表结构信息导出到Excel多个sheet 表的可以执行成功。