zoukankan      html  css  js  c++  java
  • Excel VBA: 自动生成巡检报表并通过邮件定时发送

    目录

    环境说明
    逻辑结构
    效果说明及截图
    ①. 安装SecureCRT
    ②. 自动巡检脚本
    ③. 数据检索并FTP传送
    ④. 安装Excel 2013
    ⑤. 安装Serv-U
    ⑥. 自动生成图表并邮件发送

    环境说明

    系统: Windows Server 2003, Windows Server 2008

    Windows Server 2003上目录结构: 

    Windows Server 2008 上的目录结构:

    系统说明: 可在一台机器上进行[Windows Server 2008支持Excel 2013], 本文在Windows server2003上做数据采集, Windows server2008 上做报表

    软件: SecureCRT, Excel 2013, Serv-U

    逻辑结构

    效果说明及截图

    ①. 安装SecureCRT

      安装方法请参考官方文档, 安装后能够实现通过命令行调出SecureCRT窗口

      

    ②. 自动巡检脚本

    1. 建立巡检列表device_list.txt

    建立一个名为device_list.txt的文本, 其中数据组织格式为 IP地址 用户名 密码 enable密码 例如 192.168.100.1 root pass enpass

    2. 建立SecureCRT可调用的脚本checking_router.vbs

    脚本内容如下

     1 Sub Main
     2      '打开保存设备管理地址以及密码的文件
     3      Const ForReading = 1, ForWriting = 2, ForAppending = 8
     4      Dim fso,dvices,line,command,params
     5      Set fso = CreateObject("Scripting.FileSystemObject")
     6      Set dvices = fso.OpenTextFile("device_list",Forreading, False)        
     7      crt.Screen.Synchronous = True
     8      DO While dvices.AtEndOfStream <> True
     9         '读出每行
    10         line = dvices.ReadLine
    11         '分离每行的参数 IP地址 用户名 密码 En密码
    12         params = Split (line)
    13         '在日志文件里添加时间戳
    14         dim directory
    15         directory = "datadir/" & "R_"&params(0)&"_"&Year(Date)&Right("0"&Month(Date),2)&Right("0"&Day(Date),2)& ".txt"
    16         set fso1=createobject("scripting.filesystemobject") 
    17         set file=fso1.opentextfile(directory,8,true)
    18         dim timestamp
    19         timestamp = "flow: "&Year(now)&"-"&Month(now)&"-"&Day(now)&" "&Hour(now)&":"&Minute(now) 
    20         file.writeline timestamp
    21         file.close 
    22         '下面执行命令, 并将命令执行结果记入日志
    23         crt.session.LogFileName = "datadir/" & "R_"&params(0)&"_"&Year(Date)&Right("0"&Month(Date),2)&Right("0"&Day(Date),2)& ".txt"
    24         '表示让日志追加写入
    25         crt.session.Log true, true
    26         'SSH2到这个设备上
    27         crt.session.Connect "/SSH2 /PASSWORD "&params(2)&" "&params(1)&"@" & params(0)
    28         '输入telnet密码
    29         'crt.Screen.WaitForString "Password:"
    30         'crt.Screen.Send params(1) & chr(13)
    31         '进特权模式
    32         crt.Screen.Send "enable" & chr(13)
    33         crt.Screen.WaitForString "Password:"
    34         crt.Screen.Send params(3) & chr(13)
    35         crt.Screen.waitForString "#"
    36         '执行数据收集命令
    37         command = "show ip fpm statistics"
    38         crt.Screen.Send command & vbcr
    39         crt.Screen.waitForString "#" 
    40         '执行完命令, 断开连接
    41         crt.Session.Disconnect         
    42         loop
    43     '在后台运行
    44     crt.Screen.Synchronous = False
    45     '执行完关闭程序
    46     Close_Process("securecrt.exe")      
    47 End Sub
    48     sub Close_Process(ProcessName)  
    49     On Error Resume Next  
    50          for each ps in getobject("winmgmts:\.
    ootcimv2:win32_process").instances_ '循环进程  
    51                if Ucase(ps.name)=Ucase(ProcessName) then  
    52                      ps.terminate  
    53                end if  
    54          next  
    55     end sub  
    checking_router.bat

    3. 建立Inspection_router.bat

    • 脚本内容如下
      @echo off
      securecrt /SCRIPT checking_router.vbs

    4. 设定自动任务计划

        设定Inspection_router.bat任务计划, 该计划任务设定的巡检周期为30分钟, 从0:10开始, 执行24个小时, 每天每台网络设备会产生48条数据

        

        设定search_transfer.bat计划任务

        

    5. 执行结果

        

    ③. 数据检索并FTP传送

    • 1. 创建数据检索脚本search_transfer.bat

     1 @echo off
     2 
     3 ::获取和vb一致的时间格式
     4 set /a tm1=%time:~0,2%*1
     5 if %tm1% LSS 10 set tm1=0%tm1%
     6 echo %date:~0,4%%date:~5,2%%date:~8,2%
     7 set i=%date:~0,4%%date:~5,2%%date:~8,2%
     8 
     9 
    10 ::筛选原始巡检数据
    11 mkdir temp
    12 for %%I in (datadir/R_*_%i%.txt) do (echo %%I
    13 findstr "flows" datadir\%%I>temp\%%I)
    14 
    15 ::向日志里添加分割线
    16 echo ======================================================== >> log.txt
    17 ::向日志里添加日期时间
    18 echo %date% %time%>> log.txt
    19 
    20 
    21 ::执行cmd.txt里的传输信息, 日志输出到log.txt
    22 ftp -s:ftpinfo.txt >> log.txt
    23 
    24 ::清除temp临时文件夹
    25 rd /S /Q temp
    26 
    27 ::删除临时文件lldp的筛选结果
    28 for /r %%a in (*_Report_%i%*) do (del %%a)
    search_transter.bat
    • 2. 创建ftp信息文本ftpinfo.txt

      open 192.168.100.103
      user
      password
      
      lcd temp
      mkdir temp
      cd /temp/
      
      binary
      prompt off
      mput *.txt
      
      quit

    ④. 安装Excel 2013

    安装方法参考官方文档

    ⑤. 安装Serv-U

    安装方法参考官方文档

    ⑥. 自动生成图表并邮件发送

    1. 建立巡检设备列表文件NBR_G.txt

    文件内容格式为 IP地址 设备名称 设备型号; 每个型号统计结束, 使用 IP END 型号 结束标志

    例如

    192.168.10.1 Waiwang 1500G
    IP END 1500G
    192.168.20.1 MSTP 2000G
    192.168.30.1 IPsec 2000G
    IP END 2000G

    2. 建立报表绘图文件NBR_G.xlsm(支持宏的Excel)

    建立时间表

      编写宏代码 

      1 'Attribute VB_Name = "模块1"
      2 Sub 制图表_NBR_G()
      3 'Attribute 制图表_NBR_G.VB_ProcData.VB_Invoke_Func = " 
    14"
      4 '获取当前文件目录
      5     Dim CurPath
      6     CurPath = ActiveWorkbook.Path
      7 ' 制图表_NBR_G 宏
      8     Application.DisplayAlerts = False
      9 ' 获取今天的时间
     10     Dim DateOfToday As String
     11     DateOfToday = Format$(Date, "yyyymmdd")
     12     'DateOfToday = 20161105
     13 '打开文本取数据
     14     Const ForReading = 1, ForWriting = 2, ForAppending = 8
     15 '格式:路由器IP 店铺编号 型号
     16     Dim fso, file1, line, params, ip, number, mode
     17     Set fso = CreateObject("Scripting.FileSystemObject")
     18     Set file1 = fso.OpenTextFile(CurPath & "NBR_G.txt", ForReading, False)
     19 '循环写每一列数据
     20 Do While file1.AtEndOfStream <> True
     21 '读取一行数据
     22     line = file1.ReadLine
     23 '格式:路由器IP 店铺编号 型号
     24     params = Split(line)
     25 '获取IP地址
     26     ip = params(0)
     27 '店铺编号
     28     number = params(1)
     29 '获取设备型号
     30     mode = params(2)
     31     
     32 '判断同一型号设备添加数据结束,制图标
     33     If number = "END" Then
     34     '删除掉多余字符串
     35     Cells.Replace What:="Number of active flows:", Replacement:="", LookAt:= _
     36         xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
     37         ReplaceFormat:=False
     38     Cells.Replace What:="Active flows num:", Replacement:="", LookAt:= _
     39         xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
     40         ReplaceFormat:=False
     41         
     42     If mode = "1300G" Then
     43 '调整数据格式
     44     Range("B2:AI49").Select
     45     Selection.NumberFormatLocal = "0"
     46 '选择区域生成图表
     47     Range("A1:AI49").Select
     48     ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmoothNoMarkers).Select
     49     ActiveChart.SetSourceData Source:=Range("data!$A$1:$AI$49")
     50     End If
     51     
     52     If mode = "1000G" Then
     53 '调整数据格式
     54     Range("B2:I49").Select
     55     Selection.NumberFormatLocal = "0"
     56 '选择区域生成图表
     57     Range("A1:I49").Select
     58     ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmoothNoMarkers).Select
     59     ActiveChart.SetSourceData Source:=Range("data!$A$1:$I$49")
     60     End If
     61     
     62     If mode = "1500G" Then
     63     '调整数据格式
     64     Range("B2:B49").Select
     65     Selection.NumberFormatLocal = "0"
     66 '选择区域生成图表
     67     Range("A1:B49").Select
     68     ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmoothNoMarkers).Select
     69     ActiveChart.SetSourceData Source:=Range("data!$A$1:$B$49")
     70     End If
     71     
     72     If mode = "2000G" Then
     73     '调整数据格式
     74     Range("B2:D49").Select
     75     Selection.NumberFormatLocal = "0"
     76 '选择区域生成图表
     77     Range("A1:D49").Select
     78     ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmoothNoMarkers).Select
     79     ActiveChart.SetSourceData Source:=Range("data!$A$1:$D$49")
     80     End If
     81         
     82     ActiveChart.Axes(xlCategory).Select
     83 '调整图表横坐标度量值
     84     ActiveChart.Axes(xlCategory).MaximumScale = 1
     85     ActiveChart.Axes(xlCategory).MajorUnit = 0.05
     86 '调整图表纵坐标起始值
     87     ActiveChart.Axes(xlValue).MinimumScale = 0
     88     ActiveChart.ClearToMatchStyle
     89     ActiveChart.ChartStyle = 245
     90 '修改图表title
     91     ActiveChart.ChartTitle.Select
     92     Selection.Format.TextFrame2.TextRange.Characters.Text = mode & "-" & DateOfToday & "-Report"
     93     ActiveChart.ChartArea.Select
     94 '移动到新的chart里
     95     ActiveChart.Location Where:=xlLocationAsNewSheet
     96     End If
     97     
     98     
     99     If ip <> "IP" Then
    100 '激活data sheet
    101     Worksheets("data").Activate
    102 '从文本读取数据写到B2
    103     
    104     With ActiveSheet.QueryTables.Add(Connection:= _
    105         "TEXT;" & CurPath & "	empR_" & ip & "_" & DateOfToday & ".txt", Destination:= _
    106         Range("$B$2"))
    107         .Name = "R_" & ip & "_" & DateOfToday & ""
    108         .FieldNames = True
    109         .RowNumbers = False
    110         .FillAdjacentFormulas = False
    111         .PreserveFormatting = True
    112         .RefreshOnFileOpen = False
    113         .RefreshStyle = xlInsertDeleteCells
    114         .SavePassword = False
    115         .SaveData = True
    116         .AdjustColumnWidth = False
    117         .RefreshPeriod = 0
    118         .TextFilePromptOnRefresh = False
    119         .TextFilePlatform = 936
    120         .TextFileStartRow = 1
    121         .TextFileParseType = xlDelimited
    122         .TextFileTextQualifier = xlTextQualifierDoubleQuote
    123         .TextFileConsecutiveDelimiter = False
    124         .TextFileTabDelimiter = True
    125         .TextFileSemicolonDelimiter = False
    126         .TextFileCommaDelimiter = False
    127         .TextFileSpaceDelimiter = False
    128         .TextFileColumnDataTypes = Array(1, 1, 1, 1)
    129         .TextFileTrailingMinusNumbers = True
    130         .Refresh BackgroundQuery:=False
    131     End With
    132 '将店铺编号写到B1
    133     Range("B1").Select
    134     ActiveCell.FormulaR1C1 = number
    135     End If
    136 
    137 Loop
    138 '将生成图标另存为本目录下的excel
    139     ChDir CurPath
    140     ActiveWorkbook.SaveAs Filename:=CurPath & "NBR_G_Report_" & DateOfToday & ".xlsx", _
    141         FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    142 
    143 End Sub
    制报表_NBR_G

    3. 建立可调用NBR_G.xlsm执行的脚本NBR_G.vbs

     1 '获取当前目录
     2 Dim CurrentDirectory
     3 CurrentDirectory =Left(WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName)))
     4 Set objExcel = CreateObject("Excel.Application")
     5 '打开指定的含有宏的excel
     6 Set objWorkbook = objExcel.Workbooks.Open(CurrentDirectory & "NBR_G.xlsm")
     7 '设置excel运行是否可视
     8 objExcel.Application.Visible = false
     9 'objExcel.Workbooks.Add
    10 'objExcel.Cells(1, 1).Value = "Test value"
    11 '运行Execl中的宏
    12 objExcel.Application.Run "制报表_NBR_G"
    13 '关闭活动的表格
    14 objExcel.ActiveWorkbook.Close
    15 '关闭Execl程序
    16 objExcel.Application.Quit
    17 'WScript.Echo "Finished."
    18 '退出vbs
    19 WScript.Quit
    NBR_G.vbs

    4. 建立自动发送邮件脚本SendEmail.vbs

     1 '以下是利用上面的函数发送带附件的邮件例子 
     2 If Send_Mail("senduser@163.com","sendpass","reciver mail1;receiver mail2","","巡检报告详情请查看附件!")=True Then 
     3 'Wscript.Echo "发送成功" 
     4 Else 
     5 'Wscript.Echo "发送失败" 
     6 End If 
     7 
     8 function Send_mail(You_Account,You_Password,Send_Email,Send_Email2,Send_Body)  
     9 'code by NetPatch 
    10 'VBS发送邮件参数说明 
    11 'You_Account:你的邮件帐号 
    12 'You_Password:你的邮件密码 
    13 'Send_Email: 主要邮件地址 
    14 'Send_Email2: 备用邮件地址 
    15 'Send_Topic: 邮件主题 
    16 'Send_Body:   邮件内容 
    17 'Send_Attachment:邮件附件 
    18 
    19 You_ID=Split(You_Account, "@", -1, vbTextCompare)  
    20 '帐号和服务器分离 
    21 MS_Space = "http://schemas.microsoft.com/cdo/configuration/" 
    22 '这个是必须要的,不过可以放心的事,不会通过微软发送邮件 
    23 Set Email = CreateObject("CDO.Message") 
    24 Email.From = You_Account 
    25 '这个一定要和发送邮件的帐号一样 
    26 Email.To = Send_Email         '主要邮件地址 
    27 
    28 If Send_Email2 <> "" Then 
    29 Email.CC = Send_Email2        '备用邮件地址 
    30 End If 
    31 
    32 Email.Subject = "巡检报告_"&Year(now)&"-"&Month(now)&"-"&Day(now)&" "&Hour(now)&":"&Minute(now)         '邮件主题 
    33 Email.Textbody = Send_Body        '邮件内容 
    34 
    35 'If IsArray(Send_Attachment) Then
    36 'Dim attachment
    37 'For Each attachment In Send_Attachment
    38 'Email.AddAttachment attachment     '邮件附件 
    39 'Next
    40 'End If
    41 
    42 '从dir_temp.txt读取含有指定日期的巡检文件,添加成附件
    43 Const ForReading = 1, ForWriting = 2, ForAppending = 8
    44 Dim fso,file1,attachment
    45 Set fso = CreateObject("Scripting.FileSystemObject")
    46 Set file1 = fso.OpenTextFile("dir_temp.txt",Forreading, False)        
    47 DO While file1.AtEndOfStream <> True
    48 '读出每行
    49 attachment = file1.ReadLine
    50 Email.AddAttachment attachment    
    51 loop
    52 
    53 'If Send_Attachment <> "" Then 
    54 'Email.AddAttachment Send_Attachment     '邮件附件 
    55 'End If 
    56 
    57 With Email.Configuration.Fields 
    58 .Item(MS_Space&"sendusing") = 2       '发信端口 
    59 .Item(MS_Space&"smtpserver") = "smtp."&You_ID(1) 'SMTP服务器地址 
    60 .Item(MS_Space&"smtpserverport") = 25     'SMTP服务器端口 
    61 .Item(MS_Space&"smtpauthenticate") = 1     'cdobasec 
    62 .Item(MS_Space&"sendusername") = You_ID(0)    '你的邮件帐号 
    63 .Item(MS_Space&"sendpassword") = You_Password   '你的邮件密码 
    64 .Update 
    65 End With 
    66 Email.Send 
    67 '发送邮件 
    68 Set Email=Nothing 
    69 '关闭组件 
    70 
    71 Send_Mail=True  
    72 '如果没有任何错误信息,则表示发送成功,否则发送失败  
    73 If Err Then  
    74 Err.Clear  
    75 Send_Mail=False  
    76 End If  
    77 End Function 
    SendEmail.vbs

    5. 建立可调用NBR_G.xlsm和SendEmail.vbs的脚本NBR_G.bat

     1 @echo off
     2 
     3 ::调用生成图表
     4 wscript NBR_G.vbs
     5 
     6 ::删除临时文件及文件夹,静默, 不需要确认
     7 rd /S /Q temp
     8 
     9 ::查找相关文件目录存放到dir_temp.txt
    10 for /r %%a in (*_Report_%i%*) do (echo %%a>>dir_temp.txt)
    11 
    12 ::邮件发送
    13 wscript SendEmail.vbs
    14 
    15 ::删除邮件已发送的附件存根
    16 for /r %%a in (*_Report_%i%*) do (del %%a)
    17 del dir_temp.txt
    NBR_G.bat

    6. 设定自动任务计划

    设定自动任务计划的对象是NBR_G.bat

      

  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/William-Guozi/p/VBA_Excel.html
Copyright © 2011-2022 走看看