28
2021
01

使用脚本从PowerDesigner导出表结构到Excel文档

最近因为项目转运维,需要把表结构搞成Excel文档交给运维同事。

表又非常多也不能一张一张查数据库结构导出来,只能想办法批量导出来,于是就网上搜索脚本,再自己改了改从PD文件里面导出来,就很方便了。

操作如下:

1、用power designer打开PD物理设计文档

2、按快捷键ctrl + shift + x 调出脚本执行窗口

3、把脚本复制进去,点击RUN,然后在对应的路径下找到Excel文档就行了

脚本如下(里面有”保存到文件“的文件路径,记得修改):

'用PowerDesigner打开PD文件,按快捷键ctrl + shift + x 调出脚本执行窗口
Option Explicit

   Dim rowsNum
   rowsNum = 0

'-----------------------------------------------------------------------------
' Main function
'-----------------------------------------------------------------------------
' Get the current active model
Dim Model
Set Model = ActiveModel

If (Model Is Nothing) Or (Not Model.IsKindOf(PdPDM.cls_Model)) Then
  MsgBox "The current model is not an PDM model."
Else
 output "PD模型名称:"+Model.name
 ' Get the tables collection
 '创建EXCEL APP
 dim beginrow
 DIM EXCEL,LISTSHEET,SHEET
 set EXCEL = CREATEOBJECT("Excel.Application")

 EXCEL.workbooks.add(-4167) '添加工作表
 EXCEL.workbooks(1).sheets.add '添加第二张表

 EXCEL.workbooks(1).sheets(1).name ="表清单"
 EXCEL.workbooks(1).sheets(2).name ="表结构"
 set LISTSHEET = EXCEL.workbooks(1).sheets("表清单")
 set SHEET = EXCEL.workbooks(1).sheets("表结构")
 ListOfTables Model, LISTSHEET '生成表清单
 ShowProperties Model, SHEET '生成表结构
 EXCEL.visible = true

 '设置列宽和自动换行
 LISTSHEET.Columns(1).ColumnWidth = 20 
 LISTSHEET.Columns(2).ColumnWidth = 40 
 LISTSHEET.Columns(3).ColumnWidth = 30
 LISTSHEET.Columns(1).WrapText =true
 LISTSHEET.Columns(2).WrapText =true
 LISTSHEET.Columns(4).WrapText =true
 
 SHEET.Columns(1).ColumnWidth = 20 
 SHEET.Columns(2).ColumnWidth = 30 
 SHEET.Columns(3).ColumnWidth = 20
 SHEET.Columns(4).ColumnWidth = 30
 SHEET.Columns(7).ColumnWidth = 30
 SHEET.Columns(1).WrapText =true
 SHEET.Columns(2).WrapText =true
 'SHEET.Columns(3).WrapText =true
 SHEET.Columns(4).WrapText =true
 SHEET.Columns(7).WrapText =true
 
 '保存到文件
 EXCEL.workbooks(1).SaveAs "D:\BF\Desktop\智慧DMS数据字典\物理设计说明书\"+Model.name+"-物理设计说明书.xlsx"
 EXCEL.workbooks(1).close() '关闭Excel程序
End If

'-----------------------------------------------------------------------------
' Show properties of tables
'-----------------------------------------------------------------------------

Sub ShowProperties(mdl, sheet)
   ' Show tables of the current model/package
   rowsNum=0
   beginrow = rowsNum+1
   ' For each table
   output "begin table struct"
   Dim tab
   For Each tab In mdl.tables
      ShowTable tab,sheet
   Next
   if mdl.tables.count > 0 then
        sheet.Range("A" & beginrow + 1 & ":A" & rowsNum).Rows.Group
   end if
   output "end table struct"
End Sub

'-----------------------------------------------------------------------------
' Show table properties
'-----------------------------------------------------------------------------
Sub ShowTable(tab, sheet)
   If IsObject(tab) Then
     Dim rangFlag
     rowsNum = rowsNum + 1
      ' Show properties
      Output "================================"
      sheet.cells(rowsNum, 1) = "表名"
      sheet.cells(rowsNum, 2) =tab.name
      sheet.cells(rowsNum, 3) =tab.code
      ' sheet.Range(sheet.cells(rowsNum, 2),sheet.cells(rowsNum, 3)).Merge
	  sheet.Range(sheet.cells(rowsNum, 1),sheet.cells(rowsNum, 3)).Font.Bold = True
      rowsNum = rowsNum + 1
      sheet.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.Range(sheet.cells(rowsNum-1, 1),sheet.cells(rowsNum, 7)).Borders.LineStyle = "1"
		Dim col ' running column
		Dim colsNum
		colsNum = 0
      for each col in tab.columns
        rowsNum = rowsNum + 1
        colsNum = colsNum + 1
		sheet.cells(rowsNum, 1) = col.code
		sheet.cells(rowsNum, 2) = col.name  'col.comment
		sheet.cells(rowsNum, 3) = col.datatype
        sheet.cells(rowsNum, 4) = col.comment
        If col.Primary = true Then
         sheet.cells(rowsNum, 5) = "Y" 
        Else
         sheet.cells(rowsNum, 5) = " " 
        End If
        If col.Mandatory = true Then
         sheet.cells(rowsNum, 6) = "Y" 
        Else
         sheet.cells(rowsNum, 6) = "N" 
        End If
        sheet.cells(rowsNum, 7) =  col.defaultvalue
      next

      sheet.Range(sheet.cells(rowsNum-colsNum+1,1),sheet.cells(rowsNum,7)).Borders.LineStyle = "1" 
      rowsNum = rowsNum + 1
      Output "FullDescription: "       + tab.Name
   End If
End Sub

'-----------------------------------------------------------------------------
' List of tables  表清单
'-----------------------------------------------------------------------------
Sub ListOfTables(mdl, sheet)
   rowsNum=0
   beginrow = rowsNum+1
   rowsNum = rowsNum + 1
   sheet.cells(rowsNum, 1) = "对象类型"
   sheet.cells(rowsNum, 2) ="对象名称"
   sheet.cells(rowsNum, 3) ="对象编码"
   sheet.Range(sheet.cells(rowsNum,1),sheet.cells(rowsNum,3)).Borders.LineStyle = "1" 
   output "begin list of tables"
   Dim tab
   ' For each table
   For Each tab In mdl.tables
	   If IsObject(tab) Then
		 Dim rangFlag
		 rowsNum = rowsNum + 1
		  ' Show properties
		  Output "================================"
		  sheet.cells(rowsNum, 1) = "表"
		  sheet.cells(rowsNum, 2) =tab.name
		  sheet.cells(rowsNum, 3) =tab.code
		  ' sheet.Range(sheet.cells(rowsNum, 2),sheet.cells(rowsNum, 3)).Merge
		  '设置边框
		  sheet.Range(sheet.cells(rowsNum,1),sheet.cells(rowsNum,3)).Borders.LineStyle = "1" 
		  ' rowsNum = rowsNum + 1
		  Output "FullDescription: "       + tab.Name
	   End If	
   Next

   if mdl.tables.count > 0 then
        sheet.Range("A" & beginrow + 1 & ":A" & rowsNum).Rows.Group
   end if
   output "end list of tables"
End Sub


pd内容如下:


导出Excel效果如下:

表清单sheet

表结构sheet



版权声明:
作者:真爱无限 出处:http://www.pukuimin.top 本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.
« 上一篇

相关文章:

评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。