import pandas as pd import requests import json from datetime import datetime import sys def read_today_work(excel_path): """ 从Excel文件读取今天的工作记录 """ try: # 使用openpyxl引擎读取Excel,并指定读取第一个sheet df = pd.read_excel(excel_path, sheet_name=0, engine='openpyxl') # 获取今天的日期 today = datetime.now().strftime('%Y-%m-%d') # 将日期列转换为字符串格式以便比较 # 先确保日期列是datetime类型 if not pd.api.types.is_datetime64_any_dtype(df['日期']): df['日期'] = pd.to_datetime(df['日期'], errors='coerce') # 提取日期部分(去掉时间) df['日期_仅日期'] = df['日期'].dt.strftime('%Y-%m-%d') # 筛选今天的工作记录 today_work = df[df['日期_仅日期'] == today] if today_work.empty: print(f"未找到今天({today})的工作记录") # 显示最近几天的记录 print("\n最近几天的记录:") recent = df.tail(3) for idx, row in recent.iterrows(): date_str = row['日期'].strftime('%Y-%m-%d') if isinstance(row['日期'], pd.Timestamp) else row['日期'] work_summary = str(row['工作'])[:30] + "..." if len(str(row['工作'])) > 30 else str(row['工作']) print(f" {date_str}: {work_summary}") return None # 提取工作记录(取第一条,因为通常每天只有一条) work_record = today_work.iloc[0] print(f"✅ 找到今天({today})的工作记录") return work_record except Exception as e: print(f"读取Excel文件时出错: {e}") import traceback traceback.print_exc() return None def format_work_message(work_record): """ 格式化工作记录为企业微信消息 """ try: # 获取日期 date_str = work_record['日期_仅日期'] if '日期_仅日期' in work_record else work_record['日期'] # 获取工作内容和详情,处理NaN值 work_content = str(work_record['工作']) if not pd.isna(work_record['工作']) else "无" work_detail = str(work_record['详情']) if not pd.isna(work_record['详情']) else "无" # 清理文本中的换行和多余空格 work_content = work_content.strip() work_detail = work_detail.strip() # 处理工作内容中的多行(保持原格式,去掉-符号) # 将换行符替换为两个空格和换行,这样在markdown中会显示为换行 work_content_formatted = work_content.replace('\n', ' \n') # 处理详情中的多行 work_detail_formatted = work_detail.replace('\n', ' \n') # 构建Markdown格式的消息 message = f"""## 📅 今日工作日报 ({date_str}) ### 📋 主要工作 {work_content_formatted} ### 📝 工作详情 {work_detail_formatted} --- ⏰ 发送时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}""" return message except Exception as e: print(f"格式化消息时出错: {e}") import traceback traceback.print_exc() return None def send_to_wechat_work(webhook_url, message): """ 发送消息到企业微信机器人 """ try: # 构建消息数据 data = { "msgtype": "markdown", "markdown": { "content": message } } print("准备发送的消息内容:") print(message) print("-" * 50) # 发送请求 headers = {'Content-Type': 'application/json'} response = requests.post( webhook_url, data=json.dumps(data, ensure_ascii=False).encode('utf-8'), headers=headers, timeout=10 ) if response.status_code == 200: result = response.json() if result.get('errcode') == 0: print("✅ 消息发送成功!") return True else: print(f"❌ 消息发送失败: {result.get('errmsg')}") return False else: print(f"❌ 请求失败,状态码: {response.status_code}") return False except Exception as e: print(f"❌ 发送消息时出错: {e}") import traceback traceback.print_exc() return False def main(): # 配置信息 excel_path = r"C:\Users\29924\Desktop\工作\工作记录.xlsx" webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=1c29b826-3489-4f48-9456-0eb9c73e0201" print("=" * 50) print("开始读取今日工作记录...") print(f"Excel文件路径: {excel_path}") print(f"当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print("=" * 50) # 读取今日工作记录 work_record = read_today_work(excel_path) if work_record is not None: print("\n✅ 找到今日工作记录,正在格式化消息...\n") # 格式化消息 message = format_work_message(work_record) if message: print("🚀 正在发送消息到企业微信...\n") # 发送消息 success = send_to_wechat_work(webhook_url, message) if success: print("\n🎉 今日工作日报已成功发送到企业微信!") else: print("\n❌ 消息发送失败,请检查网络连接或企业微信机器人配置") else: print("\n❌ 消息格式化失败") else: print("\n❌ 没有找到今日的工作记录") print("提示:请检查Excel文件中是否有今天日期的工作记录") print("\n" + "=" * 50) print("任务完成") print("=" * 50) if __name__ == "__main__": # 先检查必要的依赖 try: import pandas as pd import requests print("✅ 依赖检查通过") except ImportError as e: print(f"❌ 缺少必要的依赖包: {e}") print("请运行以下命令安装依赖:") print("pip install pandas openpyxl requests") sys.exit(1) main()