Python读取Excel表格,生成海报发送企业微信机器人

import pandas as pd
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import requests
import base64
import hashlib
import os
 
 
# 读取Excel数据
data = pd.read_excel('data.xlsx')
 
# 上传的背景图像路径
background_image_path = 'background.jpg'
 
# 打开背景图像
background_image = Image.open(background_image_path)
# 计算海报所需总高度
total_rows = len(data)
row_height = 60  # 单行文本高度
header_height = 600 # 间距的高度
poster_height = total_rows * row_height + header_height  # 加上标题和间距的高度
poster_width = background_image.size[0]  # 保持宽度不变,等于背景图宽度
 
# 创建海报图像,根据数据量调整高度
poster = Image.new('RGB', (poster_width, poster_height), color=(255, 255, 255))  # 可以设置背景色
 
# 将背景图像作为海报的内容
poster.paste(background_image, (0, 0))
# 定义背景图像中心区域的坐标
bg_center_x = background_image.size[0] // 2
bg_start_y = background_image.size[1] // 4  # 或者使用其他适合的偏移量
bg_end_y = background_image.size[1] * 3 // 4
 
# 截取背景中间部分
cropped_bg = background_image.crop((0, bg_start_y, background_image.size[0], bg_end_y))
 
# 其他原有代码...
 
# 计算背景图像应缩放到的目标高度
bg_target_height = min(bg_end_y - bg_start_y, total_rows * row_height + header_height)
bg_ratio = bg_target_height / (bg_end_y - bg_start_y)
 
# 缩放背景图像
scaled_bg = cropped_bg.resize((background_image.size[0], int(bg_target_height)), resample=Image.LANCZOS)
 
# 将缩放后的背景图像粘贴到海报合适的位置
bg_paste_y = (poster_height - bg_target_height) // 2  # 确保背景位于海报中间
poster.paste(scaled_bg, (0, bg_paste_y))
 
# 在海报上添加数据
draw = ImageDraw.Draw(poster)
font_path = 'SimHei.ttf'  # 中文字体文件路径
font_data = ImageFont.truetype(font_path, size=30)
font_title_bold = ImageFont.truetype(font_path, size=40,)  # 增大标题字体大小
 
x = 200  # 文本的初始横向位置
y = 750  # 文本的纵向位置
padding = 60
 
max_column_widths = [200] * len(data.columns)  # 初始化一个列表存放每列的最大宽度
 
## 计算每列的最大宽度并加上内边距
for col, width in enumerate(max_column_widths):
    column_width = width + padding * 2  # 增加两侧内边距
 
# 重新初始化文本的初始横向位置,考虑第一列的内边距
x = padding  # 文本的初始横向位置
 
# 在循环内部设置文本位置时考虑内边距
for col, title in enumerate(data.columns):  
    # ... 添加标题 ...
    for index, value in enumerate(data.iloc[:, col]):
        text = str(value)
        position = (x + padding, y)  # 设置文本的位置,左侧增加内边距
        draw.text(position, text, font=font_data, fill=(0, 0, 0))
        y += 60
         
    x += column_width  # 移动到下一行时,要加上当前列的宽度以及内边距
    x += padding  # 两侧内边距,确保列之间的间隔
 
    y = 750  # 重置纵向位置(这里假设每列结束后回到底部)
# 循环遍历Excel数据,并在海报上添加每个数据项
for col, title in enumerate(data.columns):  # 处理每一列数据
    # 添加列标题
    title_position = (x, y)
    draw.text(title_position, title, font=font_title_bold, fill=(0, 0, 0))
    y += 60  # 调整纵向位置,使标题与数据项之间有间隔
 
    for index, value in enumerate(data.iloc[:, col]):
        text = str(value)  # 将数据项转换为字符串
        position = (x, y)  # 设置文本的位置
        draw.text(position, text, font=font_data, fill=(0, 0, 0))
        y += 60  # 调整纵向位置,使文本垂直排列
 
    x += column_width  # 切换到下一列的起始位置
    y = 750  # 重置纵向位置
 
# 保存生成的海报图像
poster.save('poster.jpg')
 
# 发送到企业微信机器人
webhook_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='
 
# 替换为你要发送的图片的本地路径  
image_path = "poster.jpg" 
   
# 开始处理图片
def get_base64_and_md5(image_path):
    with open(image_path, 'rb') as image_file:
        img_data = image_file.read()
        base64_data = base64.b64encode(img_data).decode('utf-8')
        md5_value = hashlib.md5(img_data).hexdigest()
     
    return base64_data, md5_value
 
# 发送图片到企业微信机器人
def send_image_to_robot(webhook_url, image_path):
    base64_data, md5_value = get_base64_and_md5(image_path)
 
    # 构建请求体
    payload = {
        "msgtype": "image",
        "image": {
            "base64": base64_data,
            "md5": md5_value,
        },
    }
 
    # 发送POST请求
    response = requests.post(webhook_url, json=payload)
 
    # 检查响应状态
    if response.status_code == 200:
        print("图片已成功发送至企业微信机器人")
    else:
        print("发送失败,响应状态码:", response.status_code)
 
# 使用函数发送图片
send_image_to_robot(webhook_url, image_path)

来源:https://www.52pojie.cn/thread-1881231-1-1.html

你可能感兴趣的:(python,excel,企业微信)