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
脚本内容如下
Sub Main
'打开保存设备管理地址以及密码的文件
Const ForReading = , ForWriting = , ForAppending =
Dim fso,dvices,line,command,params
Set fso = CreateObject("Scripting.FileSystemObject")
Set dvices = fso.OpenTextFile("device_list",Forreading, False)
crt.Screen.Synchronous = True
DO While dvices.AtEndOfStream <> True
'读出每行
line = dvices.ReadLine
'分离每行的参数 IP地址 用户名 密码 En密码
params = Split (line)
'在日志文件里添加时间戳
dim directory
directory = "datadir/" & "R_"¶ms()&"_"&Year(Date)&Right(""&Month(Date),)&Right(""&Day(Date),)& ".txt"
set fso1=createobject("scripting.filesystemobject")
set file=fso1.opentextfile(directory,,true)
dim timestamp
timestamp = "flow: "&Year(now)&"-"&Month(now)&"-"&Day(now)&" "&Hour(now)&":"&Minute(now)
file.writeline timestamp
file.close
'下面执行命令, 并将命令执行结果记入日志
crt.session.LogFileName = "datadir/" & "R_"¶ms()&"_"&Year(Date)&Right(""&Month(Date),)&Right(""&Day(Date),)& ".txt"
'表示让日志追加写入
crt.session.Log true, true
'SSH2到这个设备上
crt.session.Connect "/SSH2 /PASSWORD "¶ms()&" "¶ms()&"@" & params()
'输入telnet密码
'crt.Screen.WaitForString "Password:"
'crt.Screen.Send params(1) & chr(13)
'进特权模式
crt.Screen.Send "enable" & chr()
crt.Screen.WaitForString "Password:"
crt.Screen.Send params() & chr()
crt.Screen.waitForString "#"
'执行数据收集命令
command = "show ip fpm statistics"
crt.Screen.Send command & vbcr
crt.Screen.waitForString "#"
'执行完命令, 断开连接
crt.Session.Disconnect
loop
'在后台运行
crt.Screen.Synchronous = False
'执行完关闭程序
Close_Process("securecrt.exe")
End Sub
sub Close_Process(ProcessName)
On Error Resume Next
for each ps in getobject("winmgmts:\\.\root\cimv2:win32_process").instances_ '循环进程
if Ucase(ps.name)=Ucase(ProcessName) then
ps.terminate
end if
next
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
@echo off ::获取和vb一致的时间格式
set /a tm1=%time:~0,2%*1
if %tm1% LSS 10 set tm1=0%tm1%
echo %date:~0,4%%date:~5,2%%date:~8,2%
set i=%date:~0,4%%date:~5,2%%date:~8,2% ::筛选原始巡检数据
mkdir temp
for %%I in (datadir/R_*_%i%.txt) do (echo %%I
findstr "flows" datadir\%%I>temp\%%I) ::向日志里添加分割线
echo ======================================================== >> log.txt
::向日志里添加日期时间
echo %date% %time%>> log.txt ::执行cmd.txt里的传输信息, 日志输出到log.txt
ftp -s:ftpinfo.txt >> log.txt ::清除temp临时文件夹
rd /S /Q temp ::删除临时文件lldp的筛选结果
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)
建立时间表
编写宏代码
'Attribute VB_Name = "模块1"
Sub 制图表_NBR_G()
'Attribute 制图表_NBR_G.VB_ProcData.VB_Invoke_Func = " \n14"
'获取当前文件目录
Dim CurPath
CurPath = ActiveWorkbook.Path
' 制图表_NBR_G 宏
Application.DisplayAlerts = False
' 获取今天的时间
Dim DateOfToday As String
DateOfToday = Format$(Date, "yyyymmdd")
'DateOfToday = 20161105
'打开文本取数据
Const ForReading = , ForWriting = , ForAppending =
'格式:路由器IP 店铺编号 型号
Dim fso, file1, line, params, ip, number, mode
Set fso = CreateObject("Scripting.FileSystemObject")
Set file1 = fso.OpenTextFile(CurPath & "\NBR_G.txt", ForReading, False)
'循环写每一列数据
Do While file1.AtEndOfStream <> True
'读取一行数据
line = file1.ReadLine
'格式:路由器IP 店铺编号 型号
params = Split(line)
'获取IP地址
ip = params()
'店铺编号
number = params()
'获取设备型号
mode = params() '判断同一型号设备添加数据结束,制图标
If number = "END" Then
'删除掉多余字符串
Cells.Replace What:="Number of active flows:", Replacement:="", LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Replace What:="Active flows num:", Replacement:="", LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False If mode = "1300G" Then
'调整数据格式
Range("B2:AI49").Select
Selection.NumberFormatLocal = ""
'选择区域生成图表
Range("A1:AI49").Select
ActiveSheet.Shapes.AddChart2(, xlXYScatterSmoothNoMarkers).Select
ActiveChart.SetSourceData Source:=Range("data!$A$1:$AI$49")
End If If mode = "1000G" Then
'调整数据格式
Range("B2:I49").Select
Selection.NumberFormatLocal = ""
'选择区域生成图表
Range("A1:I49").Select
ActiveSheet.Shapes.AddChart2(, xlXYScatterSmoothNoMarkers).Select
ActiveChart.SetSourceData Source:=Range("data!$A$1:$I$49")
End If If mode = "1500G" Then
'调整数据格式
Range("B2:B49").Select
Selection.NumberFormatLocal = ""
'选择区域生成图表
Range("A1:B49").Select
ActiveSheet.Shapes.AddChart2(, xlXYScatterSmoothNoMarkers).Select
ActiveChart.SetSourceData Source:=Range("data!$A$1:$B$49")
End If If mode = "2000G" Then
'调整数据格式
Range("B2:D49").Select
Selection.NumberFormatLocal = ""
'选择区域生成图表
Range("A1:D49").Select
ActiveSheet.Shapes.AddChart2(, xlXYScatterSmoothNoMarkers).Select
ActiveChart.SetSourceData Source:=Range("data!$A$1:$D$49")
End If ActiveChart.Axes(xlCategory).Select
'调整图表横坐标度量值
ActiveChart.Axes(xlCategory).MaximumScale =
ActiveChart.Axes(xlCategory).MajorUnit = 0.05
'调整图表纵坐标起始值
ActiveChart.Axes(xlValue).MinimumScale =
ActiveChart.ClearToMatchStyle
ActiveChart.ChartStyle =
'修改图表title
ActiveChart.ChartTitle.Select
Selection.Format.TextFrame2.TextRange.Characters.Text = mode & "-" & DateOfToday & "-Report"
ActiveChart.ChartArea.Select
'移动到新的chart里
ActiveChart.Location Where:=xlLocationAsNewSheet
End If If ip <> "IP" Then
'激活data sheet
Worksheets("data").Activate
'从文本读取数据写到B2 With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & CurPath & "\temp\R_" & ip & "_" & DateOfToday & ".txt", Destination:= _
Range("$B$2"))
.Name = "R_" & ip & "_" & DateOfToday & ""
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = False
.RefreshPeriod =
.TextFilePromptOnRefresh = False
.TextFilePlatform =
.TextFileStartRow =
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(, , , )
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
'将店铺编号写到B1
Range("B1").Select
ActiveCell.FormulaR1C1 = number
End If Loop
'将生成图标另存为本目录下的excel
ChDir CurPath
ActiveWorkbook.SaveAs Filename:=CurPath & "\NBR_G_Report_" & DateOfToday & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False End Sub
制报表_NBR_G
3. 建立可调用NBR_G.xlsm执行的脚本NBR_G.vbs
'获取当前目录
Dim CurrentDirectory
CurrentDirectory =Left(WScript.ScriptFullName, (Len(WScript.ScriptFullName))-(Len(WScript.ScriptName)))
Set objExcel = CreateObject("Excel.Application")
'打开指定的含有宏的excel
Set objWorkbook = objExcel.Workbooks.Open(CurrentDirectory & "NBR_G.xlsm")
'设置excel运行是否可视
objExcel.Application.Visible = false
'objExcel.Workbooks.Add
'objExcel.Cells(1, 1).Value = "Test value"
'运行Execl中的宏
objExcel.Application.Run "制报表_NBR_G"
'关闭活动的表格
objExcel.ActiveWorkbook.Close
'关闭Execl程序
objExcel.Application.Quit
'WScript.Echo "Finished."
'退出vbs
WScript.Quit
NBR_G.vbs
4. 建立自动发送邮件脚本SendEmail.vbs
'以下是利用上面的函数发送带附件的邮件例子
If Send_Mail("senduser@163.com","sendpass","reciver mail1;receiver mail2","","巡检报告详情请查看附件!")=True Then
'Wscript.Echo "发送成功"
Else
'Wscript.Echo "发送失败"
End If function Send_mail(You_Account,You_Password,Send_Email,Send_Email2,Send_Body)
'code by NetPatch
'VBS发送邮件参数说明
'You_Account:你的邮件帐号
'You_Password:你的邮件密码
'Send_Email: 主要邮件地址
'Send_Email2: 备用邮件地址
'Send_Topic: 邮件主题
'Send_Body: 邮件内容
'Send_Attachment:邮件附件 You_ID=Split(You_Account, "@", -, vbTextCompare)
'帐号和服务器分离
MS_Space = "http://schemas.microsoft.com/cdo/configuration/"
'这个是必须要的,不过可以放心的事,不会通过微软发送邮件
Set Email = CreateObject("CDO.Message")
Email.From = You_Account
'这个一定要和发送邮件的帐号一样
Email.To = Send_Email '主要邮件地址 If Send_Email2 <> "" Then
Email.CC = Send_Email2 '备用邮件地址
End If Email.Subject = "巡检报告_"&Year(now)&"-"&Month(now)&"-"&Day(now)&" "&Hour(now)&":"&Minute(now) '邮件主题
Email.Textbody = Send_Body '邮件内容 'If IsArray(Send_Attachment) Then
'Dim attachment
'For Each attachment In Send_Attachment
'Email.AddAttachment attachment '邮件附件
'Next
'End If '从dir_temp.txt读取含有指定日期的巡检文件,添加成附件
Const ForReading = , ForWriting = , ForAppending =
Dim fso,file1,attachment
Set fso = CreateObject("Scripting.FileSystemObject")
Set file1 = fso.OpenTextFile("dir_temp.txt",Forreading, False)
DO While file1.AtEndOfStream <> True
'读出每行
attachment = file1.ReadLine
Email.AddAttachment attachment
loop 'If Send_Attachment <> "" Then
'Email.AddAttachment Send_Attachment '邮件附件
'End If With Email.Configuration.Fields
.Item(MS_Space&"sendusing") = '发信端口
.Item(MS_Space&"smtpserver") = "smtp."&You_ID() 'SMTP服务器地址
.Item(MS_Space&"smtpserverport") = 'SMTP服务器端口
.Item(MS_Space&"smtpauthenticate") = 'cdobasec
.Item(MS_Space&"sendusername") = You_ID() '你的邮件帐号
.Item(MS_Space&"sendpassword") = You_Password '你的邮件密码
.Update
End With
Email.Send
'发送邮件
Set Email=Nothing
'关闭组件 Send_Mail=True
'如果没有任何错误信息,则表示发送成功,否则发送失败
If Err Then
Err.Clear
Send_Mail=False
End If
End Function
SendEmail.vbs
5. 建立可调用NBR_G.xlsm和SendEmail.vbs的脚本NBR_G.bat
@echo off ::调用生成图表
wscript NBR_G.vbs ::删除临时文件及文件夹,静默, 不需要确认
rd /S /Q temp ::查找相关文件目录存放到dir_temp.txt
for /r %%a in (*_Report_%i%*) do (echo %%a>>dir_temp.txt) ::邮件发送
wscript SendEmail.vbs ::删除邮件已发送的附件存根
for /r %%a in (*_Report_%i%*) do (del %%a)
del dir_temp.txt
NBR_G.bat
6. 设定自动任务计划
设定自动任务计划的对象是NBR_G.bat
Excel VBA: 自动生成巡检报表并通过邮件定时发送的更多相关文章
- Excel VBA自动添加证书(二)
继续上次没有写完的随笔,本来是很想一次性写完的,但是到中午一点了还没有吃东西,其实饿的不行了,还好写博客时会自动保存,中间电脑实然蓝屏,花了二个多小时写的没有点击保存,吓我一下,以为会全没了. 前面讲 ...
- Excel VBA自动添加证书
---恢复内容开始--- 在说这个话题之前,我先解释一下为什么要加数字证书签名,它有什么作用,后面再解释如何添加.首先解释下证书添加的位置,如下图所示: 1.单击左上角的Office 按钮,选择右下角 ...
- 导出 Excel 模板自动生成规则,避免用户来回修改
一句话总结 Excel 导出.导入时,根据注解自动添加单元格验证规则,避免用户因填写错误的枚举字段而反复修改 Excel 需求背景 对于 Java Web 项目,总是不可避免的出现 Excel 导入. ...
- python + excel工资条自动生成
年终绩效分配结果出来了,领导要求每人要清楚地知道自己的情况.要求:总绩效和各分类都要清楚.这就表示我们要给每人六个纸条,一个总的,五个分的.打出来,裁开,分发给每个人!累死人.所以,我就想能否每人生成 ...
- Excel VBA在生成副本的工作表中插入本工作簿中的VBA模块代码
即在工作簿中添加一个工作表,然后移出并存为新的工作簿,在移出前将本工作簿的一个模块的代码拷贝至新的工作簿.下面是关键代码: '===================================== ...
- odoo14开发之脚本自动生成代码
通过解析excel,自动生成odoo代码实现 一.首先做一个字段配置的excel模板 第二步.读取excel里面的模板,并写入到txt文件里 逻辑代码: # -*- coding: utf-8 -*- ...
- 【VBA】EXCEL通过VBA生成SQL,自动生成创建表结构SQL
原文:https://blog.csdn.net/zutsoft/article/details/45441343 编程往往与数据库密不可分,一个项目往往有很多的表,很多时候通过excel来维护表结构 ...
- 懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法
在开发的过程中,我们为了节约时间,往往会将大量重复机械的代码封装,考虑代码的复用性,这样我们可以节约很多时间来做别的事情.最近跳槽到一节webform开发的公司,主要是开发自己公司用的ERP.开始因为 ...
- 懒人小工具:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法
之前写了篇文章,懒人小工具:[自动生成Model,Insert,Select,Delete以及导出Excel的方法](http://www.jianshu.com/p/d5b11589174a),但是 ...
随机推荐
- CF1200E Compress Words | 字符串hash
传送门 Examples input 1 5 I want to order pizza output 1 Iwantorderpizza input 2 5 sample please ease i ...
- ACM北大暑期课培训第八天
今天学了有流量下界的网络最大流,最小费用最大流,计算几何. 有流量下界的网络最大流 如果流网络中每条边e对应两个数字B(e)和C(e), 分别表示该边上的流量至少要是B(e),最多 C(e),那么,在 ...
- BeanUtils 如何拷贝 List?
BeanUtils 如何拷贝 List? 一.背景 我们在DO.Model.VO层数据间可能经常转换数据: Entity对应的是持久层数据结构(一般是数据库表的映射模型); Model 对应的是业务层 ...
- 【移动测试】你的测试用例中,是否包含App前后台切换
App前后台切换是我们平时常用的一个操作,比如:按手机的home键将应用置于后台.直接按手机电源键关闭屏幕或者通过最近打开的应用列表切换应用等,由此,我们可以得出结论:当app置于前台时,它的页面对我 ...
- Java Data类
Date类的概述 java.util,Date 表示日期和时间的类类 Date 表示特定的瞬间,精确到千分之一秒(毫秒) 获取时间原点到当前系统时间经历了多少秒 // 时间原点:1970 年 01 月 ...
- 集合下篇—Map和Set 源码分析
Map Map不同于Collection集合,Map存放的是键值对,且键不能重复 1 .HashMap (底层是哈希表,Java中用链表的数组实现,存取顺序不一致) 这篇博客主要讲集合的,哈希表这样的 ...
- 【DPDK】【ring】从DPDK的ring来看无锁队列的实现
[前言] 队列是众多数据结构中最常见的一种之一.曾经有人和我说过这么一句话,叫做“程序等于数据结构+算法”.因此在设计模块.写代码时,队列常常作为一个很常见的结构出现在模块设计中.DPDK不仅是一个加 ...
- 使用zipwithindex 算子给dataframe增加自增列 row_number函数实现自增,udf函数实现自增
DataFrame df = ...StructType schema = df.schema().add(DataTypes.createStructField("id", Da ...
- 【转】KAFKA分布式消息系统
Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录.浏览.点击.分享.喜欢)以及系统运行日志(CPU ...
- 一次jvm调优过程
jvm调优实战 前端时间把公司的一个分布式定时调度的系统弄上了容器云,部署在kubernetes,在容器运行的动不动就出现问题,特别容易jvm溢出,导致程序不可用,终端无法进入,日志一直在刷错误,ku ...