PDM与Excel利用VB脚本进行互导

来源:互联网 发布:淘宝网副总裁张勤 编辑:程序博客网 时间:2024/05/17 02:15

1、基础样例表和数据

Excel数据表,样例中有两个sheet。样表及数据如下:

 sheet1=>

主题域表注释表英文名称表中文名称列名列中文名称列注释数据类型主键是否为空默认值协议 order_info订单信息表STATIS_DATE统计时间 varchar2(100)     order_info订单信息表ORDR_GUID订单GUID varchar2(101)Y    order_info订单信息表CO_CD公司代码 varchar2(102)     order_info订单信息表CO_NAME公司名称 varchar2(103)     order_info订单信息表SERV_ORDR_NO服务订单号 varchar2(104)     order_info订单信息表OMS_ORDR_NOOMS行订单号 varchar2(105)     order_info订单信息表ORDR_TYPE订单类型 varchar2(106)     order_info订单信息表SERV_ORG服务组织 varchar2(107)     order_info订单信息表QA_FLG质保标识 varchar2(108)   协议 personnel人员信息表STATIS_DATE统计时间 VARCHAR(14)     personnel人员信息表CLIENT客户端  VARCHAR(9)Y    personnel人员信息表PARTNER业务合作伙伴标识 VARCHAR(30)     personnel人员信息表BEGDA开始日期  VARCHAR(14))     personnel人员信息表ENDDA结束日期 VARCHAR(14))     personnel人员信息表BUKRS公司代码 VARCHAR(12)   

sheet2=>

主题域表注释表英文名称表中文名称列名列中文名称列注释数据类型主键是否为空默认值交易 deal_hurry交易流水表STATIS_DATE统计时间 date    deal_hurry交易流水表ORDR_GUID订单GUID varchar2(101)Y   deal_hurry交易流水表CO_CD公司代码 int Y1000 deal_hurry交易流水表CO_NAME公司名称 varchar2(103)    deal_hurry交易流水表SERV_ORDR_NO服务订单号 varchar2(104)    deal_hurry交易流水表OMS_ORDR_NOOMS行订单号 number(22,3)    deal_hurry交易流水表ORDR_TYPE订单类型 varchar2(106)    deal_hurry交易流水表SERV_ORG服务组织 varchar2(107)    deal_hurry交易流水表QA_FLG质保标识 varchar2(108)   交易 person人员表STATIS_DATE统计时间 date    person人员表CLIENT客户端  VARCHAR(9)Y   person人员表PARTNER业务合作伙伴标识 VARCHAR(30)    person人员表BEGDA开始日期  date Y  person人员表ENDDA结束日期 date Y  person人员表BUKRS公司代码 int   

截图=>

 

2Excel导入到PDM的脚本

Import_PDM_From_Excel.vbs

'******************************************************************************'* Purpose:  从Excel中读取信息创建PDM模型'* Title:'* Category: 创建'* Author:   nisj'* Created:  2015年7月31日'* Modified:'* Use:      打开PDM,创建新的PDM,运行本脚本(Ctrl+Shift+X)'*           Excel 格式要求'*           MODEL Sheet'*           |A     |B          |C          |D          |E      |F          |G          |H        |I    |J        |K      |'*           主题域 |表注释 |表英文名称 |表中文名称 |列名   |列中文名称 |列注释 |数据类型 |主键 |是否为空 |默认值 |'* 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 str_iskey="Y"'表的所属者CONST str_username="srv"CONST isclear_columns = true  '是否先删除表的所有列,如果是false则不会删除excel中没有的列,如果是true,则会重新创建相应表的所有列' get the current active modelDIM mdl ' 定义当前的模型SET mdl = ActiveModel '通过全局参数获得当前的模型IF (mdl IS NOTHING) THEN   MsgBox "没有选择模型,请选择一个模型并打开"ELSEIF NOT mdl.IsKindOf(PdPDM.cls_Model) THEN   MsgBox "当前选择的不是一个物理模型(PDM)."ELSE'选择需要导入的Excel文件' 打开ExcelDIM xlApp   '定义Excel对象SET xlApp  = CreateObject("Excel.Application")xlApp.DisplayAlerts = FALSEDIM xlBook  '定义Excel SheetSET xlBook = xlApp.WorkBooks.Open("F:\model\model_import.xlsx")xlApp.Visible = TRUEoutput "开始从Excel创建模型"Create_From_Excel(xlBook)output "模型创建完成,开始关闭Excel"SET xlBook=NOTHINGxlApp.QuitSET xlApp=NOTHINGEND IFPRIVATE SUB Create_From_Excel(xlBook)  DIM xlsheet  DIM rowcount  dim pkg  FOR EACH xlsheet IN xlBook.WORKSHEETSrowcount = xlsheet.UsedRange.Cells.Rows.Countoutput "本Excel["+xlsheet.name+"]共有行数为:"+CSTR(rowcount)IF rowcount>1 THEN  SET pkg = CreateOrReplacePackageByName( xlsheet.name , mdl)  Create_Model_From_Excel xlsheet,pkg   SET xlsheet=NOTHINGEND IF  NEXTEND SUB'--------------------------------------------------------------------------------'功能函数'--------------------------------------------------------------------------------PRIVATE SUB Create_Model_From_Excel(xlsheet,package)DIM Tab '定义数据表对象DIM colDIM tabcodeDIM tabcode1DIM iDIM col_codeFOR i=2 TO xlsheet.UsedRange.Cells.Rows.Count'判断是否需要创建新表对象tabcode1 = xlsheet.Range(CELL_C+CSTR(i)).ValueIF tabcode1<>"" and tabcode<>tabcode1 THENSET Tab=NOTHING tabcode=tabcode1IF tabcode<>"" THEN    '判断表是否存在,如果不存在则创建,存在则直接返回表对象SET tab = CreateOrReplaceTableByCode(tabcode,package)'将表的所有列删除,如果需要重新创建表的列IF isclear_columns THENDeleteTableColumns(tab)END IF'更新表的属性Tab.code=xlsheet.Range(CELL_C+CSTR(i)).ValueTab.name=xlsheet.Range(CELL_D+CSTR(i)).ValueTab.comment=xlsheet.Range(CELL_D+CSTR(i)).ValueTab.Description=xlsheet.Range(CELL_B+CSTR(i)).Value '注释'Tab.owner=FindUserByName(str_username)output "创建表模型OK:"+Tab.code+"——"+Tab.nameEND IFEND IFIF NOT(Tab IS NOTHING) THEN '创建表的列col_code=xlsheet.Range(CELL_E+CSTR(i)).Value '列代码   '判断是否已经存在列,不存在则创建SET col = CreateOrReplaceColumnByCode(col_code,Tab)'设置列属性col.code=xlsheet.Range(CELL_E+CSTR(i)).Value '列代码col.name=xlsheet.Range(CELL_F+CSTR(i)).Value '列名称col.comment=xlsheet.Range(CELL_F+CSTR(i)).Value '列注释col.Description=xlsheet.Range(CELL_G+CSTR(i)).Value '列注释col.DataType=xlsheet.Range(CELL_H+CSTR(i)).Value '列数据类型'列是否主键,如果是主键,则输出 YIF CSTR(xlsheet.Range(CELL_I+CSTR(i)).Value)=str_iskey THENcol.primary= TRUEEND IFoutput "更新表模型的列OK:"+Tab.code+"——"+col.code+"--"+col.nameEND IFNEXTEND SUB'--------------------------------------------------------------------------------'功能函数'--------------------------------------------------------------------------------PRIVATE FUNCTION CreateOrReplacePackageByName(name,model)DIM pkg 'Table 对象SET pkg = FindPackageByName(name,model)IF pkg IS NOTHING THEN  SET pkg = model.Packages.CreateNew()  pkg.SetNameAndCode name, name  pkg.PhysicalDiagrams.Item(0).SetNameAndCode name, nameEND IFSET CreateOrReplacePackageByName = pkgEND FUNCTIONPRIVATE FUNCTION CreateOrReplaceTableByCode(code,package)DIM tab 'Table 对象SET tab = FindTableByCode(code,package)IF tab IS NOTHING THEN  SET tab = package.Tables.CreateNew()  tab.SetNameAndCode code, codeEND IFSET CreateOrReplaceTableByCode = tabEND FUNCTIONPRIVATE FUNCTION CreateOrReplaceColumnByCode(code,table)DIM col 'Table 对象SET col =FindColumnByCode(code,table) IF col IS NOTHING THEN  SET col =table.Columns.CreateNew  col.SetNameAndCode code , codeEND IFSET CreateOrReplaceColumnByCode = colEND FUNCTIONPRIVATE FUNCTION FindPackageByName(name,model)DIM pkg 'Table 对象SET FindPackageByName = NOTHINGFOR EACH pkg IN model.PackagesIF NOT pkg.isShortcut THENIF pkg.name =name THENSET FindPackageByName=pkgExit FOREND IFEND IFNEXTEND FUNCTIONPRIVATE FUNCTION FindTableByName(name,package)DIM Tab1 'Table 对象SET FindTableByName = NOTHINGFOR EACH Tab1 IN package.TablesIF NOT Tab1.isShortcut THENIF Tab1.name =name THENSET FindTableByName=Tab1Exit FOREND IFEND IFNEXTEND FUNCTIONPRIVATE FUNCTION FindTableByCode(code,package)DIM Tab1 'Table 对象SET FindTableByCode = NOTHINGFOR EACH Tab1 IN package.TablesIF NOT Tab1.isShortcut THEN'OUTPUT "循环表:"+Tab1.nameIF Tab1.code =code THENSET FindTableByCode=Tab1Exit FOREND IFEND IFNEXTEND FUNCTIONPRIVATE FUNCTION FindColumnByCode(code,tabobj)DIM col1 'Column 对象'OUTPUT "code:"+codeSET FindColumnByCode = NOTHINGFOR EACH col1 IN tabobj.Columns'OUTPUT "code2:"+col1.codeIF col1.code =code THENSET FindColumnByCode=col1EXIT FOREND IFNEXTEND FUNCTIONPRIVATE FUNCTION FindColumnByName(name,tabobj)DIM col1 'Column 对象'OUTPUT "codename:"+nameSET FindColumnByName = NOTHINGFOR EACH col1 IN tabobj.ColumnsIF col1.name =name THENSET FindColumnByName=col1EXIT FOREND IFNEXTEND FUNCTIONPRIVATE FUNCTION FindDomainByName(dmname,mdl)DIM dm1 'Domain 对象SET FindDomainByName = NOTHINGFOR EACH dm1 IN mdl.domainsIF NOT dm1.isShortcut THENIF dm1.name =dmname THENSET FindDomainByName =dm1EXIT FOREND IFEND IFNEXTEND FUNCTIONPRIVATE FUNCTION FindUserByName(username)DIM user1SET FindUserByName = NOTHINGFOR EACH user1 IN mdl.usersIF user1.name=username THENSET FindUserByName=user1EXIT FOREND IFNEXTEND FUNCTION' 删除表的所有列PRIVATE SUB DeleteTableColumns(table)  IF NOT table.isShortcut THEN     DIM col   FOR EACH col IN table.columns    'output "Column deleted :"+table.name  col.Delete  SET col = NOTHING   NEXT  END IFEND SUB

 

3PDM导出成EXCEL的脚本

Export_PDM_To_Excel.vbs

'******************************************************************************'* File:     Export_model_to_excel.vbs'* Purpose:  将模型Table等对象的描述信息导出到Excel中'* Title:'* Category: Export'* Author:   nisj'* Created:  2015年7月31日'* Modified:'* Use:      打开PDM,创建新的PDM,运行本脚本(Ctrl+Shift+X)'*           Excel 格式为'*           MODEL Sheet'*           |A     |B          |C          |D          |E      |F          |G          |H        |I    |J        |K      |'*           主题域 |表注释 |表英文名称 |表中文名称 |列名   |列中文名称 |列注释 |数据类型 |主键 |是否为空 |默认值 |'* 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 str_iskey="Y"DIM nb'' get the current active model'DIM mdl ' the current modelSET mdl = ActiveModelIF (mdl IS NOTHING) THEN   MsgBox "没有选择一个Model"END IFDIM fldrSET Fldr = ActiveDiagram.ParentDIM isMerage '是否需要合并表名称单元格DIM isMulite '是否不同的Package不同的sheetDIM RQRQ = MsgBox ("是否不同的Package不同的sheet?", vbYesNo + vbInformation,"确认")IF RQ= VbYes THEN isMulite= TRUEELSE isMulite= FALSEEND IF' 创建新的ExcelDIM x1  'SET x1 = CreateObject("Excel.Application")x1.Workbooks.Addx1.Visible = TRUEExportModelToExcel( 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.MergeEND 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        nb = nb+1  '行号加1      NEXT    END IF  NEXT  '对子包进行递归,如果不使用递归只能取到第一个模型图内的表  DIM subfolder  FOR EACH subfolder IN folder.Packages    ExportModelToExcel(subfolder)   NEXTEND FUNCTION'--------------------------------------------------------------------------------'功能函数:添加一个Sheet页'--------------------------------------------------------------------------------PRIVATE SUB AddExcelSheet(sheetname)  x1.Sheets.Add  x1.ActiveSheet.Name=sheetnameEND 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.Columns(CELL_A+":"+CELL_K).SELECT   WITH x1.Selection.Font        .Name = "宋体"        .Size = 10   END WITH   '设置首行可过滤,背景颜色为灰色,字体粗体   x1.Range(CELL_A+"1:"+CELL_K+"1").SELECT   x1.Selection.AutoFilter   x1.Selection.Interior.ColorIndex = 15   x1.Selection.Font.Bold = TRUE   '设定首行固定   x1.Range(CELL_A+"2").SELECT   x1.ActiveWindow.FreezePanes = TRUEEND SUB

 

4Excel直接生成建库脚本的VB

Excel中,主要通过如下的菜单找到写宏执行宏的地方:

文件-->选项-->自定义功能区-->自定义功能区(主选项卡)-->勾选"开发工具";然后到开发工具主菜单中,开发工具-->-->进行新建和执行。

From_Excel_model_generate_sql.txt

Sub create_all_sheet_sql()Dim xlsheetFor Each xlsheet In ThisWorkbook.Worksheets    Create_SQL xlsheet.Name, "F:\model\"NextEnd SubSub Create_SQL(sheetName, outputPath)Dim strPath As StringDim RowCount As IntegerDim xlsheet_srcDim strSQL As StringDim hasCreat As IntegerDim strTable1 As StringDim strTable As StringDim strTableComm As StringDim strField As StringDim strFieldComm As StringDim strType As StringDim strKey As String' 请根据实际情况修改下面3个值'sheetName = "1-核心表"  '要生成SQL的Sheet页的名称strPath = outputPath + sheetName + ".sql" '"d:\2001.sql"    '生成的SQL文件Set xlsheet_src = ThisWorkbook.Worksheets(sheetName)RowCount = xlsheet_src.UsedRange.Cells.Rows.Count '得到此Sheet的行数hasCreat = 0'生成表的建表语句For i = 2 To RowCount + 1        strTable1 = xlsheet_src.Range("C" + CStr(i)).Value        If strTable <> strTable1 Then        If hasCreat = 1 Then            strSQL = ");"            ret = sWriteFile(strSQL, strPath)            strSQL = ""            hasCreat = 0        End If        strTable = strTable1        If (strTable <> "") Then            strTableComm = xlsheet_src.Range("D" + CStr(i)).Value            strSQL = "DROP TABLE " & strTable & ";" & vbCrLf & "CREATE TABLE " & strTable & "( " & " -- " & strTableComm            ret = sWriteFile("", strPath)            ret = sWriteFile(strSQL, strPath)            intRow = 1            hasCreat = 1        End If    End If    If strTable <> "" Then        strField = xlsheet_src.Range("E" + CStr(i)).Value        strFieldComm = xlsheet_src.Range("F" + CStr(i)).Value        strType = xlsheet_src.Range("H" + CStr(i)).Value        If strField <> "" Then            If intRow = 1 Then                strSQL = "    " & strField & " " & strType & " -- " & strFieldComm            Else                strSQL = "   ," & strField & " " & strType & " -- " & strFieldComm            End If            ret = sWriteFile(strSQL, strPath)            intRow = intRow + 1        End If    End If        Next'生成表的comment语句For i = 2 To RowCount        strTable1 = xlsheet_src.Range("C" + CStr(i)).Value    If strTable1 <> "" Then        If strTable <> strTable1 Then            strTable = strTable1            strTableComm = xlsheet_src.Range("D" + CStr(i)).Value            strSQL = "comment on table " & strTable & " is '" & strTableComm & "';"            ret = sWriteFile("", strPath)            ret = sWriteFile(strSQL, strPath)            intRow = 1            hasCreat = 1        End If    End If    If strTable <> "" Then                strField = xlsheet_src.Range("E" + CStr(i)).Value        strFieldComm = xlsheet_src.Range("F" + CStr(i)).Value        strType = xlsheet_src.Range("H" + CStr(i)).Value        If strField <> "" Then            strSQL = "comment on column " & strTable & "." & strField & " is '" & strFieldComm & "';"            ret = sWriteFile(strSQL, strPath)            intRow = intRow + 1        End If            End If    NextEnd SubFunction sWriteFile(strSQL As String, strFullFileName As String)    Dim intFileNum As String    intFileNum = FreeFile    Open strFullFileName For Append As #intFileNum    Print #intFileNum, strSQL    Close #intFileNumEnd Function

 

0 0
原创粉丝点击