PowerDesigner表结构设计生成excel报告

1:点击工具(tool)->Excute Commands->Edit/Run  Script

将下方脚本复制到编辑窗口,点击:run开始生成

'******************************************************************************
'* File:     Exported_Excel_page.vbs
'* Purpose:  分目录递归,查找当前PDM下所有表,并导出Excel
'******************************************************************************

Option Explicit
ValidationMode = True
InteractiveMode = im_Batch

'-----------------------------------------------------------------------------
' 主函数
'-----------------------------------------------------------------------------
' 获取当前活动模型
Dim mdl ' 当前的模型
Set mdl = ActiveModel
Dim EXCEL,catalog,sheet,catalogNum,rowsNum,linkNum,mlLinkRow,sheetIndex,sheetPk,idxRowNum,pkRowNum
rowsNum = 1
catalogNum = 1
linkNum = 1
mlLinkRow = 1
idxRowNum = 1 
pkRowNum = 1 
If (mdl Is Nothing) Then
    MsgBox "There is no Active Model"
Else
    SetCatalog
    addSheetPkIdx
    AddSheet  "表字段详情"
    ListObjects(mdl)
End If

'----------------------------------------------------------------------------------------------
' 子过程,用于扫描当前包并从当前包中打印对象的信息,然后对当前包的所有子包再次调用相同的子过程
'----------------------------------------------------------------------------------------------
Private Sub ListObjects(fldr)
    output "Scanning " & fldr.code
    Dim obj ' 运行对象
    For Each obj In fldr.children
        ' 调用子过程来打印对象上的信息
        DescribeObject obj
    Next
    ' 进入子包
    Dim f ' 运行文件夹
    For Each f In fldr.Packages
        '调用子程序扫描子程序包
        ListObjects f
    Next
End Sub

'-----------------------------------------------------------------------------
' 子过程,用于在输出中打印当前对象的信息
'-----------------------------------------------------------------------------
Private Sub DescribeObject(CurrentObject)
    if not CurrentObject.Iskindof(cls_NamedObject) then exit sub
    if CurrentObject.Iskindof(cls_Table) then 
        ExportTable CurrentObject, sheet
        ExportCatalog CurrentObject
        addTabsPkIdx CurrentObject
    else
        output "Found "+CurrentObject.ClassName+" """+CurrentObject.Name+""", Created by "+CurrentObject.Creator+" On "+Cstr(CurrentObject.CreationDate)   
    End if
End Sub

'----------------------------------------------------------------------------------------------
' 设置Excel的sheet页
'----------------------------------------------------------------------------------------------
Sub SetExcel()
    Set EXCEL= CreateObject("Excel.Application")

    ' 使Excel通过应用程序对象可见。
    EXCEL.Visible = True
    EXCEL.workbooks.add(-4167)'添加工作表
    EXCEL.workbooks(1).sheets(1).name ="pdm"
    set sheet = EXCEL.workbooks(1).sheets("pdm")

    ' 将一些文本放在工作表的第一行
    sheet.Cells(rowsNum, 1).Value = "表名"
    sheet.Cells(rowsNum, 2).Value = "表中文名"
    sheet.Cells(rowsNum, 3).Value = "表备注"
    sheet.Cells(rowsNum, 4).Value = "字段ID"
    sheet.Cells(rowsNum, 5).Value = "字段名"
    sheet.Cells(rowsNum, 6).Value = "字段中文名"
    sheet.Cells(rowsNum, 7).Value = "字段类型"
    sheet.Cells(rowsNum, 8).Value = "字段备注"
    sheet.cells(rowsNum, 9).Value = "主键"
    sheet.cells(rowsNum, 10).Value = "非空"
    sheet.cells(rowsNum, 11).Value = "默认值"
End Sub

'----------------------------------------------------------------------------------------------
' 导出目录结构
'----------------------------------------------------------------------------------------------
Sub ExportCatalog(tab)
    catalogNum = catalogNum + 1
    catalog.cells(catalogNum, 1).Value = linkNum-1
    catalog.cells(catalogNum, 2).Value = tab.code
    catalog.cells(catalogNum, 3).Value = tab.comment
    catalog.Hyperlinks.Add catalog.cells(catalogNum,2), "","表字段详情"&"!A"&mlLinkRow
End Sub 

'----------------------------------------------------------------------------------------------
' 导出sheet页
'----------------------------------------------------------------------------------------------
Sub ExportTable(tab, sheet)
    Dim col ' 运行列
    Dim colsNum
    colsNum = 0
    linkNum=linkNum+1
    mlLinkRow=rowsNum+1
    for each col in tab.columns
        colsNum = colsNum + 1
        rowsNum = rowsNum + 1
        sheet.Cells(rowsNum, 1).Value = tab.code
        'sheet.Cells(rowsNum, 2).Value = tab.name
        sheet.Cells(rowsNum, 2).Value = tab.comment
        'sheet.Cells(rowsNum, 4).Value = colsNum
        sheet.Cells(rowsNum, 3).Value = col.code
        'sheet.Cells(rowsNum, 4).Value = col.name
        sheet.Cells(rowsNum, 4).Value = col.datatype
        sheet.Cells(rowsNum, 5).Value = col.comment
        
        If col.Primary = true Then
            sheet.cells(rowsNum, 6) = "Y" 
        Else
            sheet.cells(rowsNum, 6) = "" 
        End If
        If col.Mandatory = true Then
            sheet.cells(rowsNum, 7) = "Y" 
        Else
            sheet.cells(rowsNum, 7) = "" 
        End If
        
        sheet.cells(rowsNum, 8).Value = col.defaultvalue
        '设置居中显示
        sheet.cells(rowsNum,6).HorizontalAlignment = 3
        sheet.cells(rowsNum,7).HorizontalAlignment = 3
        '设置超链接
        sheet.Hyperlinks.Add sheet.cells(rowsNum,1), "","目录"&"!B"&linkNum
    next
    output "Exported table: "+ +tab.Code+"("+tab.Name+")"
End Sub 

'----------------------------------------------------------------------------------------------
' 设置Excel目录页
'----------------------------------------------------------------------------------------------
Sub SetCatalog()
    Set EXCEL= CreateObject("Excel.Application")
    
    ' 使Excel通过应用程序对象可见。
    EXCEL.Visible = True
    EXCEL.workbooks.add(-4167)'添加工作表
    EXCEL.workbooks(1).sheets(1).name ="表结构"
    EXCEL.workbooks(1).sheets.add
    EXCEL.workbooks(1).sheets(1).name ="目录"
    set catalog = EXCEL.workbooks(1).sheets("目录")

    catalog.cells(catalogNum, 1) = "序号"
    catalog.cells(catalogNum, 2) = "表名"
    catalog.cells(catalogNum, 3) = "表注释"
    
    ' 设置列宽和自动换行
    catalog.Columns(1).ColumnWidth = 20
    catalog.Columns(2).ColumnWidth = 25
    catalog.Columns(3).ColumnWidth = 55
    
    '设置首行居中显示
    
    catalog.Range(catalog.cells(1,1),catalog.cells(1,3)).HorizontalAlignment = 3
    '设置首行字体加粗
    catalog.Range(catalog.cells(1,1),catalog.cells(1,3)).Font.Bold = True
End Sub 

'----------------------------------------------------------------------------------------------
' 新增sheet页
'----------------------------------------------------------------------------------------------
Sub AddSheet(sheetName)
    EXCEL.workbooks(1).Sheets(2).Select
    EXCEL.workbooks(1).sheets.add
    EXCEL.workbooks(1).sheets(2).name = sheetName
    set sheet = EXCEL.workbooks(1).sheets(sheetName)
    rowsNum = 1
    '将一些文本放在工作表的第一行
    sheet.Cells(rowsNum, 1).Value = "表名"
    'sheet.Cells(rowsNum, 2).Value = "表中文名"
    sheet.Cells(rowsNum, 2).Value = "表备注"
    'sheet.Cells(rowsNum, 4).Value = "字段ID"
    sheet.Cells(rowsNum, 3).Value = "字段名"
    'sheet.Cells(rowsNum, 4).Value = "字段中文名"
    sheet.Cells(rowsNum, 4).Value = "字段类型"
    sheet.Cells(rowsNum, 5).Value = "字段备注"
    sheet.cells(rowsNum, 6).Value = "主键"
    sheet.cells(rowsNum, 7).Value = "非空"
    sheet.cells(rowsNum, 8).Value = "默认值"
    
    '设置列宽
    sheet.Columns(1).ColumnWidth = 20
    sheet.Columns(2).ColumnWidth = 20
    sheet.Columns(3).ColumnWidth = 20
    sheet.Columns(4).ColumnWidth = 20
    sheet.Columns(5).ColumnWidth = 20
    sheet.Columns(6).ColumnWidth = 5
    sheet.Columns(7).ColumnWidth = 5
    sheet.Columns(8).ColumnWidth = 10

    '设置首行居中显示
    sheet.Range(sheet.cells(1,1),sheet.cells(1,8)).HorizontalAlignment = 3
    '设置首行字体加粗
    sheet.Range(sheet.cells(1,1),sheet.cells(1,8)).Font.Bold = True
    
End Sub 

'----------------------------------------------------------------------------------------------
' 设置索引sheet
'----------------------------------------------------------------------------------------------
Sub addSheetPkIdx()
    EXCEL.workbooks(1).sheets.add
    EXCEL.workbooks(1).Sheets(3).Select
    EXCEL.workbooks(1).sheets(3).name = "主键索引列表"
    set sheetIndex = EXCEL.workbooks(1).sheets("主键索引列表")
    idxRowNum = 1
    
    sheetIndex.cells(idxRowNum, 1) = "表名"
    sheetIndex.cells(idxRowNum, 2) = "表中文名称"
    sheetIndex.cells(idxRowNum, 3) = "主键/索引"
    sheetIndex.cells(idxRowNum, 4) = "主键/索引名"
    sheetIndex.cells(idxRowNum, 5) = "主键/索引类型"
    sheetIndex.cells(idxRowNum, 6) = "主键/索引列表"
    sheetIndex.Range(sheetIndex.cells(rowsNum, 6),sheetIndex.cells(rowsNum, 8)).Merge
    sheetIndex.Range(sheetIndex.cells(rowsNum, 1),sheetIndex.cells(rowsNum, 8)).Font.Bold = True
    
    ' 设置列宽和自动换行
    sheetIndex.Columns(1).ColumnWidth = 30
    sheetIndex.Columns(2).ColumnWidth = 40
    sheetIndex.Columns(3).ColumnWidth = 30
    sheetIndex.Columns(4).ColumnWidth = 55
    sheetIndex.Columns(5).ColumnWidth = 30
    sheetIndex.Columns(6).ColumnWidth = 60
    
    '设置首行居中显示
    
    sheetIndex.Range(sheetIndex.cells(1,1),sheetIndex.cells(1,8)).HorizontalAlignment = 3
    '设置首行字体加粗
    sheetIndex.Range(sheetIndex.cells(1,1),sheetIndex.cells(1,8)).Font.Bold = True
End Sub 


Sub addTabsPkIdx( tab)
    
    Dim key
    Dim keyNm
    Dim keystr
    Dim flag
    Dim keycode
    Dim keycol
    Dim index 
    Dim indexstrlst  
    for each key in tab.keys
        keycode = key.code
        if key.Primary = true Then
            flag = 1
            keystr = ""
            for each keycol in key.columns
                keystr = keystr +","+ keycol.code
            next
            keystr = mid(keystr, 2, len(keystr))
        End If
    next
    if flag = 1 Then
        idxRowNum = idxRowNum + 1
        keyNm = 1
        sheetIndex.cells(idxRowNum, 1) = tab.code
        sheetIndex.cells(idxRowNum, 2) = tab.comment
        sheetIndex.cells(idxRowNum, 3) = "主键"
        sheetIndex.cells(idxRowNum, 4) = "PK_"+tab.code
        sheetIndex.cells(idxRowNum, 5) = "UNIQUE"
        sheetIndex.Range(sheetIndex.cells(idxRowNum, 6),sheetIndex.cells(idxRowNum, 8)).Merge
        sheetIndex.cells(idxRowNum, 6) = keystr
    End If
    
    for each index in tab.indexes
        idxRowNum = idxRowNum + 1
        sheetIndex.cells(idxRowNum, 1) = tab.code
        sheetIndex.cells(idxRowNum, 2) = tab.comment
        sheetIndex.cells(idxRowNum, 3) = "索引"
        sheetIndex.cells(idxRowNum, 4) = index.code
        if index.unique = "1" Then
            sheetIndex.cells(idxRowNum, 5) = "UNIQUE"
        Else
            sheetIndex.cells(idxRowNum, 5) = "NORM"
        End If

        Dim indexcol
        keystr = ""
        for each indexcol in index.IndexColumns
            keystr = keystr +","+ indexcol.code
        next
        keystr = mid(keystr, 2, len(keystr))
        sheetIndex.cells(idxRowNum, 6) = keystr
        sheetIndex.Range(sheetIndex.cells(idxRowNum, 6),sheetIndex.cells(idxRowNum, 8)).Merge
      next
End Sub 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值