Visio页数统计工具(VB版)

同事小岳有时候需要统计Visio文档的页数,有一次她问我有没有快速统计Visio文档页数的方法。于是就写了一个Visio页数统计小工具,它可以遍历给定目录及其下的所有子目录,把每个Visio文档及其页数显示出来。如下图所示:

68d5da511938fcf667424bf1872e0c07

代码如下:

Public Class CountVsdForm
    ''' 统计Visio页数
    Private Sub CountVsd()

        Dim messageContnet = getFileNames()
        Dim filedir As String = ""

        If (messageContnet <> "") Then
            MsgBox(messageContnet)
            filePath.Text = ""
            filePath.Focus()
            Exit Sub
        End If

        Dim appvisio As Microsoft.Office.Interop.Visio.Application = New Microsoft.Office.Interop.Visio.ApplicationClass()
        DataGridView1.AutoResizeColumns()

        For Each row As DataGridViewRow In DataGridView1.Rows

            Dim Pages As Long = 0
            Dim Sheets As Long = 0
            Dim dms As Microsoft.Office.Interop.Visio.Documents = appvisio.Documents
            filedir = row.Cells("CL_File").Value

            If filedir = DBNull.Value.ToString() Or "".Equals(filedir) Then
                Continue For
            End If
            Dim dm As Microsoft.Office.Interop.Visio.Document = dms.Open(filedir)
            For Each page As Microsoft.Office.Interop.Visio.Page In dm.Pages
                Sheets += 1
                Pages += page.PrintTileCount
            Next

            '关闭打开的文件
            dm.Close()
            row.Cells("CL_Pages").Value = Pages
            row.Cells("CL_Sheets").Value = Sheets
        Next
        '退出Visio应用程序
        appvisio.Quit()

    End Sub

    ''' 统计
    Private Sub count_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles count.Click
        CountVsd()
    End Sub

    ''' 根据给定的文件路径,遍历所有目录,找出所有vsd文件,填充到DataGridView中。
    Private Function getFileNames() As String
        Dim arr() As String
        Dim i As Integer
        Dim j As Integer = 1
        Dim rowvsd As DataGridViewRow
        Dim rowIndex As Integer

        '没有找到vsd文件
        If "".Equals(filePath.Text) Then
            getFileNames = "文件路径不能为空!"
            Exit Function
        End If

        '遍历所有目录,找出所有vsd文件
        treeSearch(filePath.Text, "*.vsd", arr)

        '没有找到vsd文件
        If arr Is Nothing Then
            getFileNames = "Visio文件不存在,请重新输入文件路径!"
            Exit Function
        End If
        '填充DataGridView
        For i = LBound(arr) To UBound(arr)

            If arr(i) = DBNull.Value.ToString Then
                Continue For
            End If

            rowIndex = DataGridView1.Rows.Add()
            rowvsd = DataGridView1.Rows(rowIndex)
            rowvsd.Cells("CL_Num").Value = CStr(j)
            rowvsd.Cells("CL_File").Value = arr(i).Replace("", "")
            j = j + 1
        Next
        getFileNames = ""
    End Function

    ''' 遍历所有目录,找出所有vsd文件
    Private Function treeSearch(ByVal sPath As String, ByVal sFileSpec As String, ByRef sFiles() As String) As Long
        On Error Resume Next
        Static Files As Long '文件数目
        Dim sDir As String
        Dim sSubDirs() As String '存放子目录名称
        Dim Index As Long = 0
        If Mid(sPath, sPath.Length - 1) <> "" Then sPath = sPath & ""
        sDir = Dir(sPath & sFileSpec)
        '获得当前目录下文件名和数目
        Do While Len(sDir)
            Files = Files + 1
            ReDim Preserve sFiles(0 To Files)
            sFiles(Files) = sPath & sDir
            sDir = Dir()
        Loop
        '获得当前目录下的子目录名称
        sDir = Dir(sPath & "*.*", 16)
        Do While Len(sDir)
            If Mid(sDir, 1, 1) <> "." Then 'skip.and..
                '找出子目录名
                If GetAttr(sPath & sDir) And vbDirectory Then
                    Index = Index + 1
                    '保存子目录名
                    ReDim Preserve sSubDirs(0 To Index)
                    sSubDirs(Index) = String.Format("{0}{1}", sPath, sDir)
                End If
            End If
            sDir = Dir()
        Loop
        For Index = 1 To Index
            '查找每一个子目录下文件,这里利用了递归
            Call treeSearch(sSubDirs(Index), sFileSpec, sFiles)
        Next Index
        treeSearch = Files
    End Function

    Private Sub clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles clear.Click
        filePath.Text = ""
        DataGridView1.Rows.Clear()
        filePath.Focus()
    End Sub

End Class

Visio页数统计工具.rar,下载地址:
http://pan.baidu.com/s/1o6Fjpvs
Visio页数统计工具源码工程,下载地址:
http://ishare.iask.sina.com.cn/f/33688674.html