易语言开发从入门到精通:补充篇·办公+桌面自动化深度实战·Word/Excel/PDF联合处理·模拟键鼠·消息推送·定时任务调度


易语言开发从入门到精通:补充篇·办公+桌面自动化深度实战·Word/Excel/PDF联合处理·模拟键鼠·消息推送·定时任务调度 ⏰⌨️📄

1.35.1 学习目标 🎯

作为《易语言开发从入门到精通》的办公+桌面自动化补充篇·企业级办公效率提升实战·高频需求场景全覆盖 ,本章将帮你构建完整的办公+桌面自动化思维体系,完成3个职场/个人生活高频需求的联合项目,大幅节省重复性工作时间,达成以下5重可落地的明确目标:

  1. 构建办公+桌面自动化的五层思维框架:掌握"工具准备→办公自动化操作→桌面自动化操作→联合实战应用→部署维护"的五层标准化开发模式;
  2. 精通常用办公文件格式的操作:学会Word文档的创建/编辑/转PDF、Excel文件的数据读取/写入/清洗/报表生成、PDF文件的合并/分割/提取文本/加水印;
  3. 掌握企业软件与桌面行为的交互:学会模拟键盘鼠标操作、窗口/进程控制、控件识别与操作、钉钉/企微群消息推送、邮件发送;
  4. 开发3个高实用价值的联合项目 :完成自动生成销售日报表并发送钉钉群消息Word文档自动转PDF并添加公司水印模拟游戏每日签到脚本
  5. 掌握自动化脚本的性能与稳定性优化:学习脚本执行效率提升、异常处理、进程守护、定时任务调度、资源释放的方法;

1.35.2 办公+桌面自动化的核心思维框架------五层标准化开发模式 🧠

办公+桌面自动化的本质是通过程序模拟用户的日常办公和桌面操作行为,完成重复性的工作,五层标准化开发模式可以帮助你快速解决90%以上的自动化需求。

1.35.2.1 第一层:工具准备层
  • 功能:准备自动化开发所需的支持库、模块、工具;
  • 常用工具
    • 支持库:eWord、eExcel、ePDF、Accessibility、shell、spec;
    • 模块:精易模块(集成了大量常用的自动化操作函数)、精易PDF模块(处理复杂PDF文件);
    • 辅助工具:按键精灵(辅助录制键盘鼠标操作轨迹)、Windows Spy++(辅助识别窗口和控件)、Snagit(辅助截图获取像素坐标);
  • 注意事项:要使用官方发布的支持库和模块,避免使用非官方的版本,防止安全问题;
1.35.2.2 第二层:办公自动化操作层
  • 功能:负责对Word、Excel、PDF等办公文件进行操作;
  • 常用方法:使用eWord/eExcel/ePDF支持库的函数,使用精易模块的"Word_""Excel_""PDF_"等系列函数;
  • 注意事项:要处理文件正在被占用的情况,要使用try-catch异常处理机制,要及时释放文件资源;
1.35.2.3 第三层:桌面自动化操作层
  • 功能:负责模拟用户的桌面行为,如键盘输入、鼠标点击、窗口操作、进程操作;
  • 常用方法:使用精易模块的"键盘_""鼠标_""窗口_""进程_"等系列函数,使用Windows API函数;
  • 注意事项:要处理操作失败的情况,要使用坐标定位时要考虑不同分辨率的屏幕,要使用控件识别代替坐标定位,提高脚本的兼容性;
1.35.2.4 第四层:联合实战应用层
  • 功能:负责将办公自动化操作和桌面自动化操作结合起来,完成复杂的自动化任务;
  • 常用方法:使用时钟组件实现定时任务调度,使用Accessibility支持库识别和操作企业软件(如ERP、OA、CRM)的控件,使用HTTP API发送钉钉/企微群消息;
  • 注意事项:要处理任务执行过程中的中断,要使用日志文件记录任务执行过程,要使用进程守护机制确保脚本的持续运行;
1.35.2.5 第五层:部署维护层
  • 功能:负责脚本的部署和维护;
  • 常用方法:将脚本编译成可执行文件,使用Windows的任务计划程序设置定时任务,使用进程守护软件(如NSSM)确保脚本的持续运行,定期检查脚本的执行日志;
  • 注意事项:要将脚本的依赖库和模块打包进去,要设置合理的任务执行频率,要定期更新脚本的依赖库和模块;

1.35.3 办公自动化核心操作详解------常用文件格式与企业软件交互 📊

1.35.3.1 Word文件操作(eWord支持库/精易模块)

核心操作

创建Word文档 :使用eWord支持库的"Word文档_创建"函数,或者使用精易模块的"Word_新建"函数;

打开Word文档 :使用eWord支持库的"Word文档_打开"函数,或者使用精易模块的"Word_打开"函数;

编辑Word文档 :使用eWord支持库的"Word段落_添加""Word表格_创建""Word图片_插入"等函数,或者使用精易模块的"Word_写入文本""Word_写入表格""Word_插入图片"等函数;

转PDF格式 :使用eWord支持库的"Word文档_转PDF"函数,或者使用精易模块的"Word_另存为PDF"函数;

关闭Word文档:使用eWord支持库的"Word文档_关闭"函数,或者使用精易模块的"Word_关闭"函数;

代码示例(eWord支持库)

e 复制代码
.版本 2
.支持库 eWord
.支持库 spec

.子程序 操作Word文件
    ' 创建Word文档
    .局部变量 Word文档对象, 对象
    Word文档对象.创建 ("Word.Application")
    
    ' 新建文档
    .局部变量 Word文档, 对象
    Word文档 = Word文档对象.读属性 ("Documents").数值方法 ("Add", )
    
    ' 添加标题
    .局部变量 标题段落, 对象
    标题段落 = Word文档.读属性 ("Content").数值方法 ("Paragraphs").数值方法 ("Add", )
    标题段落.读属性 ("Range").写属性 ("Text", "销售日报表")
    标题段落.读属性 ("Range").读属性 ("Font").写属性 ("Name", "Microsoft YaHei UI")
    标题段落.读属性 ("Range").读属性 ("Font").写属性 ("Size", 24)
    标题段落.读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    
    ' 添加空行
    Word文档.读属性 ("Content").数值方法 ("Paragraphs").数值方法 ("Add", )
    
    ' 添加表格
    .局部变量 销售数据表格, 对象
    销售数据表格 = Word文档.读属性 ("Tables").数值方法 ("Add", Word文档.读属性 ("Content").数值方法 ("Paragraphs").数值方法 ("Last").读属性 ("Range"), 4, 5)
    销售数据表格.写属性 ("Borders").读属性 ("InsideLineStyle").写属性 ("LineStyle", 1)
    销售数据表格.写属性 ("Borders").读属性 ("OutsideLineStyle").写属性 ("LineStyle", 1)
    
    ' 写入表格标题
    .局部变量 i, 整数型
    .局部变量 j, 整数型
    
    .局部变量 表格标题数组, 文本型, , "0"
    表格标题数组 = { "日期", "产品名称", "销售数量", "单价", "销售金额" }
    
    .计次循环首 (取数组成员数 (表格标题数组), i)
        销售数据表格.读属性 ("Cell", 1, i).读属性 ("Range").写属性 ("Text", 表格标题数组 [i])
        销售数据表格.读属性 ("Cell", 1, i).读属性 ("Range").读属性 ("Font").写属性 ("Bold", 真)
        销售数据表格.读属性 ("Cell", 1, i).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    .计次循环尾 ()
    
    ' 写入表格数据
    .局部变量 销售数据数组, 文本型, , "0"
    销售数据数组 = { "2024-05-01|产品A|100|10|1000", "2024-05-01|产品B|200|20|4000", "2024-05-01|产品C|300|30|9000" }
    
    .计次循环首 (取数组成员数 (销售数据数组), i)
        .局部变量 销售数据, 文本型, , "0"
        销售数据 = 分割文本 (销售数据数组 [i], "|", )
        
        .计次循环首 (取数组成员数 (销售数据), j)
            销售数据表格.读属性 ("Cell", i + 1, j + 1).读属性 ("Range").写属性 ("Text", 销售数据 [j])
            销售数据表格.读属性 ("Cell", i + 1, j + 1).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
        .计次循环尾 ()
    .计次循环尾 ()
    
    ' 计算销售总金额
    .局部变量 销售总金额, 整数型
    销售总金额 = 0
    
    .计次循环首 (取数组成员数 (销售数据数组), i)
        .局部变量 销售数据, 文本型, , "0"
        销售数据 = 分割文本 (销售数据数组 [i], "|", )
        
        销售总金额 = 销售总金额 + 到整数 (销售数据 [4])
    .计次循环尾 ()
    
    ' 添加销售总金额行
    .局部变量 销售总金额行, 对象
    销售总金额行 = 销售数据表格.读属性 ("Rows").数值方法 ("Add", )
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 1).读属性 ("Range").写属性 ("Text", "总计")
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 1).读属性 ("Range").读属性 ("Font").写属性 ("Bold", 真)
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 1).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 5).读属性 ("Range").写属性 ("Text", 到文本 (销售总金额))
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 5).读属性 ("Range").读属性 ("Font").写属性 ("Bold", 真)
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 5).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    
    ' 合并销售总金额行的前四列
    销售数据表格.读属性 ("Cell", 4, 2).读属性 ("Merge", 销售数据表格.读属性 ("Cell", 4, 4))
    
    ' 保存文档
    Word文档.数值方法 ("SaveAs2", 取运行目录 () + "/销售日报表.docx")
    
    ' 转PDF格式
    Word文档.数值方法 ("ExportAsFixedFormat", 取运行目录 () + "/销售日报表.pdf", 17)
    
    ' 关闭文档
    Word文档.数值方法 ("Close", )
    
    ' 退出Word应用程序
    Word文档对象.数值方法 ("Quit", )
    
    ' 释放对象
    Word文档.释放 ()
    Word文档对象.释放 ()

1.35.3.2 Excel文件操作(eExcel支持库/精易模块)

核心操作

创建Excel文件 :使用eExcel支持库的"Excel工作簿_创建"函数,或者使用精易模块的"Excel_新建"函数;

打开Excel文件 :使用eExcel支持库的"Excel工作簿_打开"函数,或者使用精易模块的"Excel_打开"函数;

读取Excel数据 :使用eExcel支持库的"Excel单元格_读文本""Excel单元格_读数值"等函数,或者使用精易模块的"Excel_读单元格"函数;

写入Excel数据 :使用eExcel支持库的"Excel单元格_写文本""Excel单元格_写数值"等函数,或者使用精易模块的"Excel_写单元格"函数;

数据清洗 :使用eExcel支持库的"Excel单元格_删除空行""Excel单元格_删除重复行"等函数,或者使用精易模块的"Excel_删除空行""Excel_删除重复行"函数;

报表生成 :使用eExcel支持库的"Excel图表_创建""Excel单元格_合并"等函数,或者使用精易模块的"Excel_创建图表""Excel_合并单元格"函数;

关闭Excel文件:使用eExcel支持库的"Excel工作簿_关闭"函数,或者使用精易模块的"Excel_关闭"函数;

代码示例(精易模块)

e 复制代码
.版本 2
.支持库 spec
.支持库 iext

.子程序 操作Excel文件
    ' 初始化Excel模块
    Excel.初始化 ()
    
    ' 打开Excel文件
    .局部变量 Excel工作簿对象, 整数型
    Excel工作簿对象 = Excel.打开 (取运行目录 () + "/销售数据.xlsx")
    
    ' 读取销售数据
    .局部变量 销售数据数组, 文本型, , "0"
    
    .局部变量 i, 整数型
    .计次循环首 (Excel.取行数 (Excel工作簿对象, 1), i)
        .如果真 (i = 1)
            继续循环 ()  ' 跳过标题行
        .如果真结束
        
        .局部变量 销售数据, 文本型, , "0"
        
        .局部变量 j, 整数型
        .计次循环首 (Excel.取列数 (Excel工作簿对象, 1), j)
            加入成员 (销售数据, Excel.读单元格 (Excel工作簿对象, 1, i, j))
        .计次循环尾 ()
        
        加入成员 (销售数据数组, 到文本 (销售数据))
    .计次循环尾 ()
    
    ' 清洗销售数据(删除空行)
    Excel.删除空行 (Excel工作簿对象, 1)
    
    ' 清洗销售数据(删除重复行)
    Excel.删除重复行 (Excel工作簿对象, 1)
    
    ' 计算销售总金额
    .局部变量 销售总金额, 整数型
    销售总金额 = 0
    
    .计次循环首 (Excel.取行数 (Excel工作簿对象, 1), i)
        .如果真 (i = 1)
            继续循环 ()  ' 跳过标题行
        .如果真结束
        
        销售总金额 = 销售总金额 + 到整数 (Excel.读单元格 (Excel工作簿对象, 1, i, 5))
    .计次循环尾 ()
    
    ' 写入销售总金额
    Excel.写单元格 (Excel工作簿对象, 1, Excel.取行数 (Excel工作簿对象, 1) + 1, 1, "总计")
    Excel.写单元格 (Excel工作簿对象, 1, Excel.取行数 (Excel工作簿对象, 1), 5, 到文本 (销售总金额))
    
    ' 合并销售总金额行的前四列
    Excel.合并单元格 (Excel工作簿对象, 1, Excel.取行数 (Excel工作簿对象, 1), 1, Excel.取行数 (Excel工作簿对象, 1), 4)
    
    ' 创建销售数据图表
    .局部变量 Excel图表对象, 整数型
    Excel图表对象 = Excel.创建图表 (Excel工作簿对象, 1, #图表类型_柱状图, 1, 2, Excel.取行数 (Excel工作簿对象, 1), 5)
    
    ' 设置图表标题
    Excel.设置图表标题 (Excel图表对象, "产品销售数据柱状图")
    
    ' 设置图表位置
    Excel.设置图表位置 (Excel图表对象, 20, 20, 400, 300)
    
    ' 保存Excel文件
    Excel.保存 (Excel工作簿对象)
    
    ' 关闭Excel文件
    Excel.关闭 (Excel工作簿对象)
    
    ' 销毁Excel模块
    Excel.销毁 ()

1.35.3.3 PDF文件操作(精易PDF模块/ePDF支持库)

核心操作

合并PDF文件 :使用精易PDF模块的"PDF_合并"函数;

分割PDF文件 :使用精易PDF模块的"PDF_分割"函数;

提取PDF文本 :使用精易PDF模块的"PDF_提取文本"函数;

提取PDF图片 :使用精易PDF模块的"PDF_提取图片"函数;

添加PDF水印 :使用精易PDF模块的"PDF_添加水印"函数;

加密PDF文件 :使用精易PDF模块的"PDF_加密"函数;

解密PDF文件:使用精易PDF模块的"PDF_解密"函数;

代码示例(精易PDF模块)

e 复制代码
.版本 2
.支持库 spec
.支持库 iext

.子程序 操作PDF文件
    ' 合并PDF文件
    .局部变量 合并PDF文件数组, 文本型, , "0"
    合并PDF文件数组 = { 取运行目录 () + "/文件1.pdf", 取运行目录 () + "/文件2.pdf", 取运行目录 () + "/文件3.pdf" }
    
    PDF.合并 (合并PDF文件数组, 取运行目录 () + "/合并后的文件.pdf")
    
    ' 分割PDF文件
    PDF.分割 (取运行目录 () + "/合并后的文件.pdf", 取运行目录 () + "/分割后的文件_", 1, 1)
    
    ' 提取PDF文本
    .局部变量 PDF文本, 文本型
    PDF文本 = PDF.提取文本 (取运行目录 () + "/合并后的文件.pdf", 1, -1)
    
    ' 提取PDF图片
    PDF.提取图片 (取运行目录 () + "/合并后的文件.pdf", 取运行目录 () + "/提取的图片_")
    
    ' 添加PDF水印
    .局部变量 水印参数, 精易PDF.水印参数类型
    水印参数.文本 = "公司内部文件,禁止外传"
    水印参数.字体名称 = "Microsoft YaHei UI"
    水印参数.字体大小 = 30
    水印参数.字体颜色 = 精易模块.取颜色值 (128, 128, 128)
    水印参数.旋转角度 = 45
    水印参数.横向间距 = 100
    水印参数.纵向间距 = 100
    水印参数.透明度 = 50
    
    PDF.添加水印 (取运行目录 () + "/合并后的文件.pdf", 取运行目录 () + "/添加水印后的文件.pdf", 水印参数)
    
    ' 加密PDF文件
    PDF.加密 (取运行目录 () + "/添加水印后的文件.pdf", 取运行目录 () + "/加密后的文件.pdf", "123456", "654321")
    
    ' 解密PDF文件
    PDF.解密 (取运行目录 () + "/加密后的文件.pdf", 取运行目录 () + "/解密后的文件.pdf", "123456")

1.35.3.4 钉钉/企微消息推送操作(HTTP API/精易模块)

核心操作

获取钉钉群机器人WebHook地址 :在钉钉群中添加群机器人,获取WebHook地址;

发送钉钉群机器人消息 :使用精易模块的"HTTP_访问"函数,发送HTTP POST请求到钉钉群机器人WebHook地址;

获取企微群机器人WebHook地址 :在企微群中添加群机器人,获取WebHook地址;

发送企微群机器人消息:使用精易模块的"HTTP_访问"函数,发送HTTP POST请求到企微群机器人WebHook地址;

代码示例(发送钉钉群机器人文本消息)

e 复制代码
.版本 2
.支持库 spec
.支持库 iext
.支持库 json

.子程序 发送钉钉群机器人消息
    ' 构造钉钉群机器人WebHook地址
    .局部变量 钉钉群机器人WebHook地址, 文本型
    钉钉群机器人WebHook地址 = "https://oapi.dingtalk.com/robot/send?access_token=你的钉钉群机器人access_token"
    
    ' 构造钉钉群机器人消息内容(文本消息)
    .局部变量 钉钉群机器人消息内容, JSON对象
    钉钉群机器人消息内容.解析 ("{""msgtype"":""text"", ""text"":{""content"":""销售日报表已生成,请查收!文件路径:" + 取运行目录 () + "/销售日报表.pdf""}}")
    
    ' 发送HTTP POST请求
    .局部变量 响应数据, 文本型
    响应数据 = 精易模块.HTTP_访问 (钉钉群机器人WebHook地址, #POST, 钉钉群机器人消息内容.到JSON文本 (), "Content-Type: application/json", )
    
    ' 检查响应数据是否成功
    .局部变量 响应数据对象, JSON对象
    响应数据对象.解析 (响应数据)
    
    .如果真 (响应数据对象.取成员文本 ("errcode") ≠ "0")
        信息框 ("发送钉钉群机器人消息失败:" + 响应数据对象.取成员文本 ("errmsg"), #错误图标, "办公自动化工具")
    .如果真结束

1.35.3.5 邮件发送操作(精易模块)

核心操作

发送文本邮件 :使用精易模块的"邮件_发送邮件"函数;

发送带附件的邮件 :使用精易模块的"邮件_发送邮件"函数,设置附件路径;

发送HTML邮件:使用精易模块的"邮件_发送邮件"函数,设置邮件内容类型为HTML;

代码示例(发送带附件的邮件)

e 复制代码
.版本 2
.支持库 spec
.支持库 iext

.子程序 发送邮件
    ' 发送带附件的邮件
    .局部变量 发送邮件结果, 逻辑型
    发送邮件结果 = 精易模块.邮件_发送邮件 ("smtp.qq.com", "你的QQ邮箱", "你的QQ邮箱授权码", "你的收件人邮箱", "销售日报表已生成", "销售日报表已生成,请查收!", 取运行目录 () + "/销售日报表.pdf", )
    
    ' 检查发送邮件结果是否成功
    .如果真 (发送邮件结果 = 假)
        信息框 ("发送邮件失败:" + 精易模块.取错误信息 (), #错误图标, "办公自动化工具")
    .如果真结束

1.35.4 桌面自动化核心操作详解------模拟用户行为 🖱️

1.35.4.1 模拟键盘操作(精易模块/API函数)

核心操作

模拟键盘按下 :使用精易模块的"键盘_按下"函数,或者使用Windows API函数"keybd_event";

模拟键盘释放 :使用精易模块的"键盘_释放"函数,或者使用Windows API函数"keybd_event";

模拟键盘输入文本 :使用精易模块的"键盘_输入文本"函数,或者使用Windows API函数"SendMessage";

模拟键盘输入快捷键:使用精易模块的"键盘_输入快捷键"函数,或者使用Windows API函数"keybd_event";

代码示例(精易模块)

e 复制代码
.版本 2
.支持库 spec
.支持库 iext

.子程序 模拟键盘操作
    ' 模拟键盘输入文本
    精易模块.键盘_输入文本 ("Hello, World!", )
    
    ' 模拟键盘输入快捷键(Ctrl+C)
    精易模块.键盘_输入快捷键 ({ #Ctrl键 }, #C键, )
    
    ' 模拟键盘输入快捷键(Ctrl+V)
    精易模块.键盘_输入快捷键 ({ #Ctrl键 }, #V键, )

1.35.4.2 模拟鼠标操作(精易模块/API函数)

核心操作

模拟鼠标移动 :使用精易模块的"鼠标_移动"函数,或者使用Windows API函数"SetCursorPos";

模拟鼠标左键点击 :使用精易模块的"鼠标_左键点击"函数,或者使用Windows API函数"mouse_event";

模拟鼠标右键点击 :使用精易模块的"鼠标_右键点击"函数,或者使用Windows API函数"mouse_event";

模拟鼠标滚轮滚动:使用精易模块的"鼠标_滚轮滚动"函数,或者使用Windows API函数"mouse_event";

代码示例(精易模块)

e 复制代码
.版本 2
.支持库 spec
.支持库 iext

.子程序 模拟鼠标操作
    ' 模拟鼠标移动到坐标(500, 300)
    精易模块.鼠标_移动 (500, 300, )
    
    ' 模拟鼠标左键点击
    精易模块.鼠标_左键点击 (, , )
    
    ' 模拟鼠标右键点击
    精易模块.鼠标_右键点击 (, , )
    
    ' 模拟鼠标滚轮向上滚动100次
    精易模块.鼠标_滚轮滚动 (100, )
    
    ' 模拟鼠标滚轮向下滚动100次
    精易模块.鼠标_滚轮滚动 (-100, )

1.35.4.3 窗口操作(精易模块/API函数)

核心操作

查找窗口 :使用精易模块的"窗口_查找"函数,或者使用Windows API函数"FindWindow";

激活窗口 :使用精易模块的"窗口_激活"函数,或者使用Windows API函数"SetForegroundWindow";

隐藏窗口 :使用精易模块的"窗口_隐藏"函数,或者使用Windows API函数"ShowWindow";

显示窗口 :使用精易模块的"窗口_显示"函数,或者使用Windows API函数"ShowWindow";

调整窗口大小 :使用精易模块的"窗口_调整大小"函数,或者使用Windows API函数"SetWindowPos";

调整窗口位置:使用精易模块的"窗口_调整位置"函数,或者使用Windows API函数"SetWindowPos";

代码示例(精易模块)

e 复制代码
.版本 2
.支持库 spec
.支持库 iext

.子程序 窗口操作
    ' 查找计算器窗口
    .局部变量 计算器窗口句柄, 整数型
    计算器窗口句柄 = 精易模块.窗口_查找 ("计算器", )
    
    ' 检查计算器窗口是否找到
    .如果真 (计算器窗口句柄 = 0)
        信息框 ("未找到计算器窗口!", #错误图标, "桌面自动化工具")
        返回 ()
    .如果真结束
    
    ' 激活计算器窗口
    精易模块.窗口_激活 (计算器窗口句柄, )
    
    ' 调整计算器窗口大小为宽度400px,高度300px
    精易模块.窗口_调整大小 (计算器窗口句柄, 400, 300, )
    
    ' 调整计算器窗口位置到屏幕中央
    精易模块.窗口_调整位置 (计算器窗口句柄, (精易模块.取屏幕宽度 () - 400) ÷ 2, (精易模块.取屏幕高度 () - 300) ÷ 2, )

1.35.5 办公+桌面自动化深度实战------3个高频需求的联合项目 📱

1.35.5.1 项目1:自动生成销售日报表并发送钉钉群消息

项目需求分析

功能需求

  • 基础功能:每天上午9点自动从"销售数据.xlsx"文件中读取前一天的销售数据,生成销售日报表(Word格式和PDF格式),并发送到钉钉群中;
  • 辅助功能 :支持手动触发生成销售日报表,支持查看任务执行日志,支持设置任务执行频率;
    非功能需求
  • 界面设计:符合现代审美(扁平化风格、蓝色主题),功能分区明确(任务设置区、任务执行区、日志显示区);
  • 用户体验:任务执行进度有实时显示,添加任务执行失败的提示信息;
  • 响应时间:程序响应时间不超过1秒,生成销售日报表的时间不超过10秒;

界面设计 (组件箱拖拽+属性表配置):

新建Windows窗口程序 :打开易语言官方IDE,点击"文件→新建→Windows窗口程序→确定";

添加容器组件 :从组件箱中拖拽3个分组框组件到"_启动窗口"上,属性名分别为"_分组框_任务设置区""_分组框_任务执行区""_分组框_日志显示区",标题分别为"任务设置区""任务执行区""日志显示区",位置分别为(10,10)、(10,150)、(10,260),宽度分别为500px、500px、500px,高度分别为130px、100px、230px;

添加任务设置区组件

  • 1个标签组件:属性名分别为"_标签_任务执行频率",标题为"任务执行频率:",位置为(20,20);
  • 1个编辑框组件:属性名分别为"_编辑框_任务执行频率",位置为(120,20),宽度为100px,高度为25px,内容为"每天";
  • 1个标签组件:属性名分别为"_标签_任务执行时间",标题为"任务执行时间:",位置为(230,20);
  • 1个编辑框组件:属性名分别为"_编辑框_任务执行时间",位置为(330,20),宽度为150px,高度为25px,内容为"09:00:00";
  • 1个标签组件:属性名分别为"_标签_销售数据文件路径",标题为"销售数据文件路径:",位置为(20,60);
  • 1个编辑框组件:属性名分别为"_编辑框_销售数据文件路径",位置为(120,60),宽度为360px,高度为25px;
  • 1个按钮组件 :属性名分别为"_按钮_选择销售数据文件",标题为"选择文件",位置为(490,60),宽度为80px,高度为25px;
    添加任务执行区组件
  • 2个按钮组件:属性名分别为"_按钮_手动触发任务""_按钮_停止任务",标题分别为"手动触发任务""停止任务",位置分别为(20,20)、(130,20),宽度分别为100px、100px,高度统一为25px;
  • 1个编辑框组件 :属性名分别为"_编辑框_任务执行进度",位置为(20,60),宽度为460px,高度为25px,可用为假;
    添加日志显示区组件
  • 1个编辑框组件 :属性名分别为"_编辑框_任务执行日志",位置为(20,15),宽度为460px,高度为200px,多行显示为真,可用为假;
    添加支持库和模块
  • 添加eWord、eExcel、json、shell、spec支持库;
  • 添加精易模块;
    添加其他组件
  • 1个时钟组件:属性名分别为"_时钟_任务调度",时钟周期为60000,可见为假;
  • 1个通用对话框组件 :属性名分别为"_通用对话框_选择销售数据文件",类型为"打开文件",过滤器为"Excel文件 (.xlsx)| .xlsx|所有文件 (. )|.",初始目录为程序的运行目录;

代码实现(分模块详细代码+注释):

模块1:启动窗口事件驱动代码
e 复制代码
.版本 2
.支持库 spec
.支持库 iext
.支持库 eWord
.支持库 eExcel
.支持库 json
.支持库 shell

.程序集 窗口程序集_启动窗口
.程序集变量 任务调度状态, 逻辑型    ' 任务调度状态:真为运行中,假为停止
.程序集变量 任务执行日志文件, 文本型  ' 任务执行日志文件路径

.子程序 _启动窗口_创建完毕
    ' 设置任务执行日志文件路径
    任务执行日志文件 = 取运行目录 () + "/任务执行日志.txt"
    
    ' 初始化组件属性
    _编辑框_任务执行频率.内容 = "每天"
    _编辑框_任务执行时间.内容 = "09:00:00"
    _编辑框_销售数据文件路径.内容 = 取运行目录 () + "/销售数据.xlsx"
    
    ' 加载任务执行日志
    加载任务执行日志 ()
    
    ' 启动任务调度时钟
    任务调度状态 = 真
    _时钟_任务调度.时钟周期 = 60000

.子程序 _启动窗口_将被销毁
    ' 停止任务调度时钟
    任务调度状态 = 假
    _时钟_任务调度.时钟周期 = 0

.子程序 _按钮_选择销售数据文件_被单击
    ' 打开选择销售数据文件对话框
    .如果真 (_通用对话框_选择销售数据文件.打开 () = 假)
        返回 ()
    .如果真结束
    
    ' 设置销售数据文件路径
    _编辑框_销售数据文件路径.内容 = _通用对话框_选择销售数据文件.文件名

.子程序 _按钮_手动触发任务_被单击
    ' 手动触发任务
    触发任务 ()

.子程序 _按钮_停止任务_被单击
    ' 停止任务调度
    任务调度状态 = 假
    _时钟_任务调度.时钟周期 = 0

.子程序 _时钟_任务调度_周期事件
    ' 任务调度
    .如果真 (任务调度状态 = 假)
        返回 ()
    .如果真结束
    
    ' 检查当前时间是否等于任务执行时间
    .局部变量 当前时间, 文本型
    当前时间 = 取现行时间 ().格式化 ("HH:MM:SS")
    
    .如果真 (当前时间 ≠ _编辑框_任务执行时间.内容)
        返回 ()
    .如果真结束
    
    ' 检查任务执行频率是否为每天
    .如果真 (_编辑框_任务执行频率.内容 ≠ "每天")
        ' 这里可以添加其他任务执行频率的逻辑,如每周、每月
        返回 ()
    .如果真结束
    
    ' 触发任务
    触发任务 ()

.子程序 触发任务, , , 触发任务
    ' 更新任务执行进度
    _编辑框_任务执行进度.内容 = "正在执行任务..."
    
    ' 添加任务执行日志
    添加任务执行日志 ("任务开始执行,时间:" + 取现行时间 ().格式化 ("YYYY-MM-DD HH:MM:SS"))
    
    ' 生成销售日报表
    .局部变量 生成销售日报表结果, 逻辑型
    生成销售日报表结果 = 生成销售日报表 ()
    
    ' 检查生成销售日报表结果是否成功
    .如果真 (生成销售日报表结果 = 假)
        添加任务执行日志 ("生成销售日报表失败,时间:" + 取现行时间 ().格式化 ("YYYY-MM-DD HH:MM:SS"))
        _编辑框_任务执行进度.内容 = "任务执行失败!"
        信息框 ("生成销售日报表失败!", #错误图标, "办公自动化工具")
        返回 ()
    .如果真结束
    
    ' 发送钉钉群机器人消息
    .局部变量 发送钉钉群机器人消息结果, 逻辑型
    发送钉钉群机器人消息结果 = 发送钉钉群机器人消息 ()
    
    ' 检查发送钉钉群机器人消息结果是否成功
    .如果真 (发送钉钉群机器人消息结果 = 假)
        添加任务执行日志 ("发送钉钉群机器人消息失败,时间:" + 取现行时间 ().格式化 ("YYYY-MM-DD HH:MM:SS"))
        _编辑框_任务执行进度.内容 = "任务执行失败!"
        信息框 ("发送钉钉群机器人消息失败!", #错误图标, "办公自动化工具")
        返回 ()
    .如果真结束
    
    ' 更新任务执行进度
    _编辑框_任务执行进度.内容 = "任务执行成功!"
    
    ' 添加任务执行日志
    添加任务执行日志 ("任务执行成功,时间:" + 取现行时间 ().格式化 ("YYYY-MM-DD HH:MM:SS"))

.子程序 生成销售日报表, 逻辑型    ' 参数:无,返回:生成销售日报表结果
    ' 初始化Excel模块
    Excel.初始化 ()
    
    ' 打开销售数据文件
    .局部变量 Excel工作簿对象, 整数型
    Excel工作簿对象 = Excel.打开 (_编辑框_销售数据文件路径.内容)
    
    ' 检查Excel工作簿对象是否打开成功
    .如果真 (Excel工作簿对象 = 0)
        Excel.销毁 ()
        返回 (假)
    .如果真结束
    
    ' 读取前一天的销售数据
    .局部变量 前一天日期, 文本型
    前一天日期 = 取现行时间 ().到时间戳 () - 86400  ' 减去一天的秒数
    前一天日期 = 时间到文本 (前一天日期, #日期格式_标准)
    
    .局部变量 前一天销售数据数组, 文本型, , "0"
    
    .局部变量 i, 整数型
    .计次循环首 (Excel.取行数 (Excel工作簿对象, 1), i)
        .如果真 (i = 1)
            继续循环 ()  ' 跳过标题行
        .如果真结束
        
        .局部变量 日期单元格, 文本型
        日期单元格 = Excel.读单元格 (Excel工作簿对象, 1, i, 1)
        
        .如果真 (日期单元格 ≠ 前一天日期)
            继续循环 ()
        .如果真结束
        
        .局部变量 前一天销售数据, 文本型, , "0"
        
        .局部变量 j, 整数型
        .计次循环首 (Excel.取列数 (Excel工作簿对象, 1), j)
            加入成员 (前一天销售数据, Excel.读单元格 (Excel工作簿对象, 1, i, j))
        .计次循环尾 ()
        
        加入成员 (前一天销售数据数组, 到文本 (前一天销售数据))
    .计次循环尾 ()
    
    ' 关闭Excel文件
    Excel.关闭 (Excel工作簿对象)
    
    ' 销毁Excel模块
    Excel.销毁 ()
    
    ' 创建Word文档
    .局部变量 Word文档对象, 对象
    Word文档对象.创建 ("Word.Application")
    
    ' 新建文档
    .局部变量 Word文档, 对象
    Word文档 = Word文档对象.读属性 ("Documents").数值方法 ("Add", )
    
    ' 添加标题
    .局部变量 标题段落, 对象
    标题段落 = Word文档.读属性 ("Content").数值方法 ("Paragraphs").数值方法 ("Add", )
    标题段落.读属性 ("Range").写属性 ("Text", "销售日报表(" + 前一天日期 + ")")
    标题段落.读属性 ("Range").读属性 ("Font").写属性 ("Name", "Microsoft YaHei UI")
    标题段落.读属性 ("Range").读属性 ("Font").写属性 ("Size", 24)
    标题段落.读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    
    ' 添加空行
    Word文档.读属性 ("Content").数值方法 ("Paragraphs").数值方法 ("Add", )
    
    ' 添加表格
    .局部变量 销售数据表格, 对象
    销售数据表格 = Word文档.读属性 ("Tables").数值方法 ("Add", Word文档.读属性 ("Content").数值方法 ("Paragraphs").数值方法 ("Last").读属性 ("Range"), 取数组成员数 (前一天销售数据数组) + 1, 5)
    销售数据表格.写属性 ("Borders").读属性 ("InsideLineStyle").写属性 ("LineStyle", 1)
    销售数据表格.写属性 ("Borders").读属性 ("OutsideLineStyle").写属性 ("LineStyle", 1)
    
    ' 写入表格标题
    .局部变量 表格标题数组, 文本型, , "0"
    表格标题数组 = { "日期", "产品名称", "销售数量", "单价", "销售金额" }
    
    .计次循环首 (取数组成员数 (表格标题数组), i)
        销售数据表格.读属性 ("Cell", 1, i).读属性 ("Range").写属性 ("Text", 表格标题数组 [i])
        销售数据表格.读属性 ("Cell", 1, i).读属性 ("Range").读属性 ("Font").写属性 ("Bold", 真)
        销售数据表格.读属性 ("Cell", 1, i).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    .计次循环尾 ()
    
    ' 写入表格数据
    .计次循环首 (取数组成员数 (前一天销售数据数组), i)
        .局部变量 销售数据, 文本型, , "0"
        销售数据 = 分割文本 (前一天销售数据数组 [i], "|", )
        
        .计次循环首 (取数组成员数 (销售数据), j)
            销售数据表格.读属性 ("Cell", i + 1, j + 1).读属性 ("Range").写属性 ("Text", 销售数据 [j])
            销售数据表格.读属性 ("Cell", i + 1, j + 1).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
        .计次循环尾 ()
    .计次循环尾 ()
    
    ' 计算销售总金额
    .局部变量 销售总金额, 整数型
    销售总金额 = 0
    
    .计次循环首 (取数组成员数 (前一天销售数据数组), i)
        .局部变量 销售数据, 文本型, , "0"
        销售数据 = 分割文本 (前一天销售数据数组 [i], "|", )
        
        销售总金额 = 销售总金额 + 到整数 (销售数据 [4])
    .计次循环尾 ()
    
    ' 添加销售总金额行
    .局部变量 销售总金额行, 对象
    销售总金额行 = 销售数据表格.读属性 ("Rows").数值方法 ("Add", )
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 1).读属性 ("Range").写属性 ("Text", "总计")
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 1).读属性 ("Range").读属性 ("Font").写属性 ("Bold", 真)
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 1).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 5).读属性 ("Range").写属性 ("Text", 到文本 (销售总金额))
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 5).读属性 ("Range").读属性 ("Font").写属性 ("Bold", 真)
    销售总金额行.读属性 ("Cells").数值方法 ("Item", 5).读属性 ("Range").读属性 ("ParagraphFormat").写属性 ("Alignment", 1)
    
    ' 合并销售总金额行的前四列
    销售数据表格.读属性 ("Cell", 取数组成员数 (前一天销售数据数组) + 1, 2).读属性 ("Merge", 销售数据表格.读属性 ("Cell", 取数组成员数 (前一天销售数据数组) + 1, 4))
    
    ' 保存文档
    Word文档.数值方法 ("SaveAs2", 取运行目录 () + "/销售日报表(" + 前一天日期 + ").docx")
    
    ' 转PDF格式
    Word文档.数值方法 ("ExportAsFixedFormat", 取运行目录 () + "/销售日报表(" + 前一天日期 + ").pdf", 17)
    
    ' 关闭文档
    Word文档.数值方法 ("Close", )
    
    ' 退出Word应用程序
    Word文档对象.数值方法 ("Quit", )
    
    ' 释放对象
    Word文档.释放 ()
    Word文档对象.释放 ()
    
    返回 (真)

.子程序 发送钉钉群机器人消息, 逻辑型    ' 参数:无,返回:发送钉钉群机器人消息结果
    ' 构造钉钉群机器人WebHook地址
    .局部变量 钉钉群机器人WebHook地址, 文本型
    钉钉群机器人WebHook地址 = "https://oapi.dingtalk.com/robot/send?access_token=你的钉钉群机器人access_token"
    
    ' 构造钉钉群机器人消息内容(文本消息)
    .局部变量 前一天日期, 文本型
    前一天日期 = 取现行时间 ().到时间戳 () - 86400  ' 减去一天的秒数
    前一天日期 = 时间到文本 (前一天日期, #日期格式_标准)
    
    .局部变量 钉钉群机器人消息内容, JSON对象
    钉钉群机器人消息内容.解析 ("{""msgtype"":""text"", ""text"":{""content"":""销售日报表(" + 前一天日期 + ")已生成,请查收!文件路径:" + 取运行目录 () + "/销售日报表(" + 前一天日期 + ").pdf""}}")
    
    ' 发送HTTP POST请求
    .局部变量 响应数据, 文本型
    响应数据 = 精易模块.HTTP_访问 (钉钉群机器人WebHook地址, #POST, 钉钉群机器人消息内容.到JSON文本 (), "Content-Type: application/json", )
    
    ' 检查响应数据是否成功
    .局部变量 响应数据对象, JSON对象
    响应数据对象.解析 (响应数据)
    
    .如果真 (响应数据对象.取成员文本 ("errcode") ≠ "0")
        返回 (假)
    .如果真结束
    
    返回 (真)

.子程序 加载任务执行日志
    ' 检查任务执行日志文件是否存在
    .如果真 (是否存在文件 (任务执行日志文件) = 假)
        返回 ()
    .如果真结束
    
    ' 读取任务执行日志文件内容
    .局部变量 任务执行日志文件内容, 文本型
    任务执行日志文件内容 = 到文本 (读入文件 (任务执行日志文件))
    
    ' 显示任务执行日志文件内容
    _编辑框_任务执行日志.内容 = 任务执行日志文件内容

.子程序 添加任务执行日志, , , 参数:日志内容
    .参数 日志内容, 文本型
    
    ' 打开任务执行日志文件
    .局部变量 任务执行日志文件句柄, 整数型
    任务执行日志文件句柄 = 打开文件 (任务执行日志文件, #读写, #无限制)
    
    ' 检查任务执行日志文件句柄是否打开成功
    .如果真 (任务执行日志文件句柄 = -1)
        返回 ()
    .如果真结束
    
    ' 将文件指针移动到文件末尾
    文件定位 (任务执行日志文件句柄, 取文件长度 (任务执行日志文件))
    
    ' 写出日志内容
    写出文本 (任务执行日志文件句柄, 日志内容 + #换行符)
    
    ' 关闭任务执行日志文件
    关闭文件 (任务执行日志文件句柄)
    
    ' 更新任务执行日志显示
    _编辑框_任务执行日志.内容 = _编辑框_任务执行日志.内容 + 日志内容 + #换行符

测试调试和优化经验

测试调试

  • 测试手动触发任务是否正常;
  • 测试任务调度是否正常;
  • 测试生成销售日报表是否正常;
  • 测试发送钉钉群机器人消息是否正常;
  • 测试任务执行日志是否正常;
    优化经验
  • 优化任务调度的时钟周期,根据任务执行频率调整时钟周期;
  • 优化销售数据的读取,使用分页读取或分块读取,避免内存不足;
  • 优化Word文档的生成,使用模板文件代替手动创建,提高生成效率;
  • 优化任务执行日志的写入,使用异步写入,避免阻塞主线程;

1.35.5.2 项目2:Word文档自动转PDF并添加公司水印

项目需求分析

功能需求

  • 基础功能:遍历指定目录下的所有Word文档,自动转PDF格式并添加公司水印;
  • 辅助功能 :支持手动选择目录,支持查看任务执行进度,支持查看任务执行结果;
    非功能需求
  • 界面设计:符合现代审美(扁平化风格、蓝色主题),功能分区明确(目录选择区、参数设置区、任务执行区、任务结果区);
  • 用户体验:任务执行进度有实时显示,添加任务执行失败的提示信息;
  • 响应时间:程序响应时间不超过1秒,转一个Word文档的时间不超过5秒;

界面设计 (组件箱拖拽+属性表配置):

与项目1类似,只需要修改组件的类型和位置即可。

代码实现(核心公共函数代码):

e 复制代码
.版本 2
.支持库 spec
.支持库 iext
.支持库 eWord
.支持库 eFile
.支持库 gdip

.子程序 Word文档自动转PDF并添加公司水印, , , 参数:目录路径
    .参数 目录路径, 文本型
    
    ' 遍历目录下的所有Word文档
    .局部变量 Word文档数组, 文本型, , "0"
    Word文档数组 = 文件_遍历目录 (目录路径, 真, 假)
    
    ' 筛选Word文档
    .局部变量 筛选后的Word文档数组, 文本型, , "0"
    
    .局部变量 i, 整数型
    .计次循环首 (取数组成员数 (Word文档数组), i)
        .如果真 (取文本右边 (取文件名 (Word文档数组 [i]), 4) = ".docx" 或 取文本右边 (取文件名 (Word文档数组 [i]), 3) = ".doc")
            加入成员 (筛选后的Word文档数组, Word文档数组 [i])
        .如果真结束
    .计次循环尾 ()
    
    ' 检查筛选后的Word文档数组是否为空
    .如果真 (取数组成员数 (筛选后的Word文档数组) = 0)
        信息框 ("未找到Word文档!", #错误图标, "办公自动化工具")
        返回 ()
    .如果真结束
    
    ' 开始转PDF并添加公司水印
    .局部变量 成功处理Word文档数量, 整数型
    成功处理Word文档数量 = 0
    
    .局部变量 失败处理Word文档数量, 整数型
    失败处理Word文档数量 = 0
    
    .计次循环首 (取数组成员数 (筛选后的Word文档数组), i)
        ' 更新任务执行进度
        _编辑框_任务执行进度.内容 = "正在处理第" + 到文本 (i) + "个Word文档,共" + 到文本 (取数组成员数 (筛选后的Word文档数组)) + "个Word文档"
        
        ' 转PDF格式
        .局部变量 转PDF结果, 逻辑型
        转PDF结果 = Word文档转PDF (筛选后的Word文档数组 [i])
        
        ' 检查转PDF结果是否成功
        .如果真 (转PDF结果 = 假)
            失败处理Word文档数量 = 失败处理Word文档数量 + 1
            继续循环 ()
        .如果真结束
        
        ' 添加公司水印
        .局部变量 添加水印结果, 逻辑型
        添加水印结果 = PDF添加公司水印 (取目录名 (筛选后的Word文档数组 [i]) + "/" + 取文本左边 (取文件名 (筛选后的Word文档数组 [i]), 取文本长度 (取文件名 (筛选后的Word文档数组 [i])) - 4) + ".pdf")
        
        ' 检查添加水印结果是否成功
        .如果真 (添加水印结果 = 假)
            失败处理Word文档数量 = 失败处理Word文档数量 + 1
            继续循环 ()
        .如果真结束
        
        ' 统计成功处理Word文档数量
        成功处理Word文档数量 = 成功处理Word文档数量 + 1
    .计次循环尾 ()
    
    ' 显示任务执行结果
    _编辑框_成功处理Word文档数量.内容 = 到文本 (成功处理Word文档数量)
    _编辑框_失败处理Word文档数量.内容 = 到文本 (失败处理Word文档数量)
    
    信息框 ("Word文档自动转PDF并添加公司水印成功!共处理" + 到文本 (成功处理Word文档数量 + 失败处理Word文档数量) + "个Word文档,其中成功" + 到文本 (成功处理Word文档数量) + "个,失败" + 到文本 (失败处理Word文档数量) + "个!", #信息图标, "办公自动化工具")

.子程序 Word文档转PDF, 逻辑型    ' 参数:Word文档路径,返回:转PDF结果
    .参数 Word文档路径, 文本型
    
    ' 初始化Word模块
    .局部变量 Word文档对象, 对象
    Word文档对象.创建 ("Word.Application")
    
    ' 打开Word文档
    .局部变量 Word文档, 对象
    Word文档 = Word文档对象.读属性 ("Documents").数值方法 ("Open", Word文档路径)
    
    ' 检查Word文档是否打开成功
    .如果真 (Word文档 = { })
        Word文档对象.数值方法 ("Quit", )
        Word文档.释放 ()
        Word文档对象.释放 ()
        返回 (假)
    .如果真结束
    
    ' 转PDF格式
    .局部变量 转PDF结果, 逻辑型
    转PDF结果 = Word文档.数值方法 ("ExportAsFixedFormat", 取目录名 (Word文档路径) + "/" + 取文本左边 (取文件名 (Word文档路径), 取文本长度 (取文件名 (Word文档路径)) - 4) + ".pdf", 17)
    
    ' 关闭Word文档
    Word文档.数值方法 ("Close", )
    
    ' 退出Word应用程序
    Word文档对象.数值方法 ("Quit", )
    
    ' 释放对象
    Word文档.释放 ()
    Word文档对象.释放 ()
    
    返回 (真)

.子程序 PDF添加公司水印, 逻辑型    ' 参数:PDF文件路径,返回:添加水印结果
    .参数 PDF文件路径, 文本型
    
    ' 初始化精易PDF模块
    PDF.初始化 ()
    
    ' 构造水印参数
    .局部变量 水印参数, 精易PDF.水印参数类型
    水印参数.文本 = "公司内部文件,禁止外传"
    水印参数.字体名称 = "Microsoft YaHei UI"
    水印参数.字体大小 = 30
    水印参数.字体颜色 = 精易模块.取颜色值 (128, 128, 128)
    水印参数.旋转角度 = 45
    水印参数.横向间距 = 100
    水印参数.纵向间距 = 100
    水印参数.透明度 = 50
    
    ' 添加水印
    .局部变量 添加水印结果, 逻辑型
    添加水印结果 = PDF.添加水印 (PDF文件路径, 取目录名 (PDF文件路径) + "/" + 取文本左边 (取文件名 (PDF文件路径), 取文本长度 (取文件名 (PDF文件路径)) - 4) + "_加水印.pdf", 水印参数)
    
    ' 检查添加水印结果是否成功
    .如果真 (添加水印结果 = 假)
        PDF.销毁 ()
        返回 (假)
    .如果真结束
    
    ' 销毁精易PDF模块
    PDF.销毁 ()
    
    返回 (真)

测试调试和优化经验

测试调试

  • 测试手动选择目录是否正常;
  • 测试遍历目录下的所有Word文档是否正常;
  • 测试转PDF格式是否正常;
  • 测试添加公司水印是否正常;
  • 测试任务执行结果是否正常;
    优化经验
  • 优化Word文档的转PDF,使用多线程技术,同时处理多个Word文档,提高处理效率;
  • 优化PDF文件的添加水印,使用多线程技术,同时处理多个PDF文件,提高处理效率;
  • 优化任务执行进度的显示,使用异步更新,避免阻塞主线程;

1.35.5.3 项目3:模拟游戏每日签到脚本

项目需求分析

功能需求

  • 基础功能:每天上午8点自动打开游戏客户端,模拟用户登录,点击签到按钮,完成每日签到;
  • 辅助功能 :支持手动触发签到,支持查看任务执行进度,支持查看任务执行结果;
    非功能需求
  • 界面设计:符合现代审美(扁平化风格、蓝色主题),功能分区明确(任务设置区、任务执行区、任务结果区);
  • 用户体验:任务执行进度有实时显示,添加任务执行失败的提示信息;
  • 响应时间:程序响应时间不超过1秒,完成每日签到的时间不超过30秒;

界面设计 (组件箱拖拽+属性表配置):

与项目1类似,只需要修改组件的类型和位置即可。

代码实现(核心公共函数代码):

e 复制代码
.版本 2
.支持库 spec
.支持库 iext
.支持库 eFile
.支持库 shell

.子程序 模拟游戏每日签到, , , 参数:游戏客户端路径
    .参数 游戏客户端路径, 文本型
    
    ' 检查游戏客户端路径是否正确
    .如果真 (是否存在文件 (游戏客户端路径) = 假)
        信息框 ("游戏客户端路径不正确!", #错误图标, "桌面自动化工具")
        返回 ()
    .如果真结束
    
    ' 启动游戏客户端
    .局部变量 游戏客户端进程ID, 整数型
    游戏客户端进程ID = 精易模块.进程_创建 (游戏客户端路径, )
    
    ' 检查游戏客户端进程ID是否创建成功
    .如果真 (游戏客户端进程ID = 0)
        信息框 ("启动游戏客户端失败!", #错误图标, "桌面自动化工具")
        返回 ()
    .如果真结束
    
    ' 等待游戏客户端加载完成
    延迟 (10000)
    
    ' 查找游戏登录窗口
    .局部变量 游戏登录窗口句柄, 整数型
    游戏登录窗口句柄 = 精易模块.窗口_查找 ("游戏登录窗口标题", )
    
    ' 检查游戏登录窗口是否找到
    .如果真 (游戏登录窗口句柄 = 0)
        精易模块.进程_结束 (游戏客户端进程ID)
        信息框 ("未找到游戏登录窗口!", #错误图标, "桌面自动化工具")
        返回 ()
    .如果真结束
    
    ' 激活游戏登录窗口
    精易模块.窗口_激活 (游戏登录窗口句柄, )
    
    ' 输入账号和密码
    .局部变量 账号编辑框控件句柄, 整数型
    账号编辑框控件句柄 = 精易模块.控件_查找 (游戏登录窗口句柄, "Edit", 0)
    
    .局部变量 密码编辑框控件句柄, 整数型
    密码编辑框控件句柄 = 精易模块.控件_查找 (游戏登录窗口句柄, "Edit", 1)
    
    .局部变量 登录按钮控件句柄, 整数型
    登录按钮控件句柄 = 精易模块.控件_查找 (游戏登录窗口句柄, "Button", 0)
    
    ' 输入账号
    精易模块.控件_发送文本 (账号编辑框控件句柄, "你的游戏账号", )
    
    ' 输入密码
    精易模块.控件_发送文本 (密码编辑框控件句柄, "你的游戏密码", )
    
    ' 点击登录按钮
    精易模块.控件_鼠标点击 (登录按钮控件句柄, #左键单击, )
    
    ' 等待游戏主界面加载完成
    延迟 (20000)
    
    ' 查找游戏主界面窗口
    .局部变量 游戏主界面窗口句柄, 整数型
    游戏主界面窗口句柄 = 精易模块.窗口_查找 ("游戏主界面窗口标题", )
    
    ' 检查游戏主界面窗口是否找到
    .如果真 (游戏主界面窗口句柄 = 0)
        精易模块.进程_结束 (游戏客户端进程ID)
        信息框 ("未找到游戏主界面窗口!", #错误图标, "桌面自动化工具")
        返回 ()
    .如果真结束
    
    ' 激活游戏主界面窗口
    精易模块.窗口_激活 (游戏主界面窗口句柄, )
    
    ' 点击签到按钮
    .局部变量 签到按钮控件句柄, 整数型
    签到按钮控件句柄 = 精易模块.控件_查找 (游戏主界面窗口句柄, "Button", 1)
    
    ' 检查签到按钮控件句柄是否找到
    .如果真 (签到按钮控件句柄 = 0)
        精易模块.进程_结束 (游戏客户端进程ID)
        信息框 ("未找到签到按钮!", #错误图标, "桌面自动化工具")
        返回 ()
    .如果真结束
    
    ' 点击签到按钮
    精易模块.控件_鼠标点击 (签到按钮控件句柄, #左键单击, )
    
    ' 等待签到完成
    延迟 (5000)
    
    ' 关闭游戏客户端
    精易模块.进程_结束 (游戏客户端进程ID)
    
    ' 显示任务执行结果
    _编辑框_任务执行结果.内容 = "游戏每日签到成功!"
    
    信息框 ("游戏每日签到成功!", #信息图标, "桌面自动化工具")

测试调试和优化经验

测试调试

  • 测试手动触发签到是否正常;
  • 测试任务调度是否正常;
  • 测试启动游戏客户端是否正常;
  • 测试模拟用户登录是否正常;
  • 测试点击签到按钮是否正常;
    优化经验
  • 优化游戏客户端的启动,使用进程守护机制,确保游戏客户端能够正常启动;
  • 优化模拟用户登录,使用控件识别代替坐标定位,提高脚本的兼容性;
  • 优化任务执行进度的显示,使用异步更新,避免阻塞主线程;

1.35.6 办公+桌面自动化的性能与稳定性优化------提升脚本效率与可靠性 🛠️

1.35.6.1 性能优化 🚀

使用多线程技术 :将任务分解为多个子任务,使用多线程同时执行,提高处理效率;

使用缓存机制 :缓存常用的文件属性、窗口句柄、控件句柄,避免重复读取;

使用异步操作 :使用异步操作代替同步操作,提高程序的响应时间;

使用分块处理 :处理大文件时,将文件分为多个小块,逐块处理,避免内存不足;

使用CDN加速:使用CDN加速请求,减少请求时间;

1.35.6.2 稳定性优化 🛡️

使用异常处理机制 :使用try-catch异常处理机制,处理操作失败的情况;

使用进程守护机制 :使用进程守护软件(如NSSM)确保脚本的持续运行;

使用日志文件记录任务执行过程 :使用日志文件记录任务执行过程,方便后期的查看和分析;

使用定时检查机制 :使用定时检查机制,检查任务执行是否正常;

使用资源释放机制:及时释放文件资源、窗口资源、控件资源,避免资源泄漏;


1.35.7 办公+桌面自动化常见问题排查手册 🚨

1.35.7.1 Word/Excel/PDF文件操作问题(3个)
问题1:Word/Excel/PDF文件正在被占用

问题现象 :操作Word/Excel/PDF文件时,提示文件正在被占用。
原因分析

  • 文件正在被其他程序占用;
  • 上一次操作文件时,程序没有正确释放文件资源;
    解决方案
  • 检查文件是否正在被其他程序占用;
  • 优化文件操作的代码,确保程序能够正确释放文件资源;
问题2:Word/Excel/PDF文件格式错误

问题现象 :操作Word/Excel/PDF文件时,提示文件格式错误。
原因分析

  • 文件格式不正确;
  • 文件内容被损坏;
    解决方案
  • 检查文件格式是否正确;
  • 尝试修复文件内容;
问题3:Word/Excel/PDF文件操作超时

问题现象 :操作Word/Excel/PDF文件时,提示操作超时。
原因分析

  • 文件过大;
  • 电脑配置过低;
  • 操作文件时,程序被其他程序阻塞;
    解决方案
  • 优化文件操作的代码,使用分块处理;
  • 升级电脑配置;
  • 关闭其他不必要的程序;

1.35.8 补充篇总结与办公+桌面自动化未来发展方向 📜

1.35.8.1 本章核心收获
  • 构建办公+桌面自动化的五层思维框架:掌握"工具准备→办公自动化操作→桌面自动化操作→联合实战应用→部署维护"的五层标准化开发模式;
  • 精通常用办公文件格式的操作:学会Word文档的创建/编辑/转PDF、Excel文件的数据读取/写入/清洗/报表生成、PDF文件的合并/分割/提取文本/加水印;
  • 掌握企业软件与桌面行为的交互:学会模拟键盘鼠标操作、窗口/进程控制、控件识别与操作、钉钉/企微群消息推送、邮件发送;
  • 开发3个高实用价值的联合项目:完成自动生成销售日报表并发送钉钉群消息、Word文档自动转PDF并添加公司水印、模拟游戏每日签到脚本;
  • 掌握自动化脚本的性能与稳定性优化:学习脚本执行效率提升、异常处理、进程守护、定时任务调度、资源释放的方法;
1.35.8.2 办公+桌面自动化未来发展方向

办公+桌面自动化的未来发展方向主要有以下5个:

💡 AI辅助自动化开发 :进一步优化AI辅助自动化开发工具,根据用户的需求自动生成自动化脚本;

💡 低代码/无代码自动化开发 :进一步完善低代码/无代码自动化开发平台,让用户通过拖拽和配置的方式开发自动化脚本;

💡 跨平台自动化开发 :进一步完善跨平台自动化开发工具,让自动化脚本可以在Windows、macOS、Linux等平台上运行;

💡 AI辅助控件识别与操作 :使用AI技术识别和操作复杂的控件;

💡 云端自动化部署:提供云端自动化部署服务,用户可以将自动化脚本部署到云端,定时执行脚本;


🎉 易语言开发从入门到精通的办公+桌面自动化补充篇·企业级办公效率提升实战·高频需求场景全覆盖,至此结束!愿你在易语言的世界里,不断学习,不断进步,开发出更多"高效、稳定、实用"的办公+桌面自动化脚本,大幅节省重复性工作时间!

相关推荐
天天进步20151 小时前
Motia性能进阶与未来:从现有源码推测 Rust 重构之路
开发语言·重构·rust
兩尛1 小时前
2. 两数相加 c++
开发语言·c++
Z9fish1 小时前
sse哈工大C语言编程练习22
c语言·开发语言·算法
小二·1 小时前
Go 语言系统编程与云原生开发实战(第12篇)云原生部署实战:Helm Chart × GitOps × 多环境管理(生产级落地)
开发语言·云原生·golang
小二·1 小时前
Go 语言系统编程与云原生开发实战(第13篇)工程效能实战:Monorepo × 依赖治理 × 构建加速(10万行代码实测)
开发语言·云原生·golang
暴躁小师兄数据学院1 小时前
【WEB3.0零基础转行笔记】Golang编程篇-第4讲:Go语言中的流程控制
开发语言·后端·golang·web3·区块链
j445566111 小时前
C++中的备忘录模式
开发语言·c++·算法
代码无bug抓狂人2 小时前
C语言之产值调整(蓝桥杯省B)
c语言·开发语言·蓝桥杯
云和数据.ChenGuang2 小时前
python 面向对象基础入门
开发语言·前端·python·django·flask