利用python自动化办公excel实用指南

背景介绍

关注下面公众号"z先生的备忘录",这里有关于数据洞察、可视化、大模型等相关技巧、实战教程、干货分享~ 大家好。今天给大家分享如何利用python来实现自动化办公操作excel文件进行各种样式展示,并自动发送文件给"老板"的邮箱,附带详细的python代码,干货满满~ 本文涉及的python库版本信息如下:

ini 复制代码
!pip install pyjanitor==0.26.0
!pip install plottable==0.1.5 
!pip install mpl_font==1.1.0
!pip install  xlsxwriter==3.2.0
!pip install  openpyxl==3.1.2

本文目录

excel相关的背景知识

Excel中常见的文件格式(xls, xlsx, xlsm, xlsb, xla, xlam等等);在操作excel类常见的有三大数据对象,分别如下:

  • WorkBook:工作簿对象
  • Sheet:表单对象
  • Cell:表格对象 本文主要使用XlsxWriter库(github.com/jmcnamara/X...%25E5%2592%258Copenpyxl%25E5%25BA%2593(https%3A%2F%2Fopenpyxl.readthedocs.io%2Fen%2Fstable%2Ftutorial.html)%25E6%259D%25A5%25E5%25AE%259E%25E7%258E%25B0%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596%25E6%2593%258D%25E4%25BD%259Cexcel%25E6%2596%2587%25E4%25BB%25B6%25E6%2595%25B0%25E6%258D%25AE%25E5%2592%258C%25E6%25A0%25B7%25E5%25BC%258F%25E3%2580%2582%25E4%25B8%258B%25E9%259D%25A2%25E8%25BF%259B%25E5%2585%25A5%25E6%2588%2591%25E4%25BB%25AC%25E7%259A%2584%25E6%25AD%25A3%25E9%25A2%2598 "https://github.com/jmcnamara/XlsxWriter)%E5%92%8Copenpyxl%E5%BA%93(https://openpyxl.readthedocs.io/en/stable/tutorial.html)%E6%9D%A5%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%8C%96%E6%93%8D%E4%BD%9Cexcel%E6%96%87%E4%BB%B6%E6%95%B0%E6%8D%AE%E5%92%8C%E6%A0%B7%E5%BC%8F%E3%80%82%E4%B8%8B%E9%9D%A2%E8%BF%9B%E5%85%A5%E6%88%91%E4%BB%AC%E7%9A%84%E6%AD%A3%E9%A2%98")~

对单个单元格进行操作

makefile 复制代码
# 导入xlsxwriter库,用于创建Excel文件
import xlsxwriter

# 创建一个名为"demo.xlsx"的工作簿(即Excel文件)
workbook = xlsxwriter.Workbook("demo.xlsx")

# 在工作簿中添加一个名为'sheet1'的工作表
worksheet = workbook.add_worksheet(name='sheet1')

# 在B1单元格写入数值500
worksheet.write("B1", 500)

# 在第0行第1列等价于B1单元格写入数值500
worksheet.write(0, 1, 500)

# 在B2单元格写入公式,计算B1单元格数值的平方
worksheet.write_formula("B2", "{=SUM(B1*B1)}")

# 设置A列的宽度为40
worksheet.set_column("A:A", 40)

# 创建两个格式对象,分别设置缩进级别为1和2
indent1 = workbook.add_format({"indent": 1})  # 第1级缩进格式
indent2 = workbook.add_format({"indent": 2})  # 第2级缩进格式

# 使用不同的缩进格式在A1和A2单元格写入文本,并设置相应的缩进
worksheet.write("A1", "This text is indented 1 level", indent1)  # A1单元格内容缩进1级
worksheet.write("A2", "This text is indented 2 levels", indent2)  # A2单元格内容缩进2级

# 关闭并保存工作簿
workbook.close()

将2维list数组插入excel中

ini 复制代码
# 定义表格的表头信息以及相关数据
headings = ["Number", "Batch 1", "Batch 2"]  # 表头列表
data = [                      # 数据列表
    [2, 3, 4, 5, 6, 7],       # 第一行:编号
    [40, 40, 50, 30, 25, 50], # 第二行:批次1的数据
    [30, 25, 30, 10, 5, 10],   # 第三行:批次2的数据
]
# 创建一个加粗格式样式以突出显示表头
bold = workbook.add_format({"bold": 1})
# 将表头信息写入到第一行(从A1开始)
worksheet.write_row("A1", headings, bold)
# 将数据按列依次写入工作表
worksheet.write_column("A2", data[0])  # 写入编号数据到A列
worksheet.write_column("B2", data[1])  # 写入批次1的数据到B列
worksheet.write_column("C2", data[2])  # 写入批次2的数据到C列
# 关闭并保存工作簿
workbook.close()

设置单元格样式

makefile 复制代码
# 创建三种不同对角线样式的格式:
format1 = workbook.add_format({"diag_type": 1}) # - format1: 对角线类型1
format2 = workbook.add_format({"diag_type": 2}) # - format2: 对角线类型2
format3 = workbook.add_format({"diag_type": 3}) # - format3: 对角线类型3
# 创建一个带有红色对角线、对角线类型为3且边框线型为7的格式
format4 = workbook.add_format({
    "diag_type": 3,
    "diag_border": 7,
    "diag_color": "red",
})
# 使用不同对角线样式写入单元格内容
worksheet.write("B1", "Text", format1)  # 使用format1样式写入
worksheet.write("B2", "Text", format2)  # 使用format2样式写入
worksheet.write("B3", "Text", format3)  # 使用format3样式写入
worksheet.write("B4", "Text", format4)  # 使用format4样式写入
# 创建一个居中并对齐、加粗的单元格格式
centered_format = workbook.add_format({"align": 'center', 'valign': 'vcenter', "bold": True})
# 使用居中对齐格式写入单元格内容
worksheet.write("A2", "Text", centered_format) 
# 最后关闭并保存工作簿
workbook.close()

插入图表到excel文件中

bash 复制代码
# 在工作表的A1单元格嵌入图片"demo.png"
# 注意:此操作默认会按照图片原始尺寸插入
worksheet.insert_image("A1", "demo.png")
# 注:若要实现图片自适应单元格大小,可能需要在插入图片时直接指定宽度和高度。
worksheet.insert_image("A1", "demo.png", {"x_scale": 0.5, "y_scale": 0.5})
# 最后,关闭并保存工作簿
workbook.close()

插入超链接在单元格中

csharp 复制代码
# 设置第一列(A列)的宽度为30
worksheet.set_column("A:A", 30)
# 创建一个样本格式:红色字体、加粗、下划线、字号为12
red_format = workbook.add_format({
    "font_color": "red",  # 文字颜色设为红色
    "bold": 1,            # 字体加粗
    "underline": 1,       # 文字下划线
    "font_size": 12,      # 字号为12
})
# 写入一些超链接
# A1单元格包含一个隐式格式的超链接至 http://www.python.org/
worksheet.write_url("A1", "http://www.python.org/")
# A3单元格包含一个显示文本为"Python Home"的超链接至 http://www.python.org/
worksheet.write_url("A3", "http://www.python.org/", string="Python Home")
# A5单元格包含一个提示信息为"Click here"的超链接至 http://www.python.org/
worksheet.write_url("A5", "http://www.python.org/", tip="Click here")
# A7单元格包含一个应用了红色格式的超链接至 http://www.python.org/
worksheet.write_url("A7", "http://www.python.org/", red_format)
# A9单元格包含一个电子邮件链接至jmcnamara@cpan.org,显示文本为"Mail me"
worksheet.write_url("A9", "mailto:jmcnamara@cpan.org", string="Mail me")
# 最后,关闭并保存工作簿
workbook.close()

显示迷你图

python 复制代码
# 示例数据集,每个列表代表一行数据
data = [
    [-2, 2, 3, -1, 0],  # 第一行数据
    [30, 20, 33, 20, 15],  # 第二行数据
    [1, -1, -1, 1, -1],  # 第三行数据
]
# 将示例数据写入到工作表中
worksheet.write_row("A1", data[0])  # 写入第一行数据
worksheet.write_row("A2", data[1])  # 写入第二行数据
worksheet.write_row("A3", data[2])  # 写入第三行数据
# 在F1单元格添加一条带标记点的默认折线型sparkline图表(基于A1到E1区域的数据)
worksheet.add_sparkline("F1", {"range": "Sheet1!A1:E1", "markers": True})
# 在F2单元格添加一条柱状sparkline图表,采用非默认风格(基于A2到E2区域的数据)
# 同时显示第一个点和最后一个点
worksheet.add_sparkline("F2", {
    "range": "Sheet1!A2:E2", 
    "type": "column", 
    "style": 12, 
    "first_point": True, 
    "last_point": True
})
# 在F3单元格添加一条胜败(Win/Loss)类型的sparkline图表(基于A3到E3区域的数据)
# 高亮显示负值区域,并显示最高点和最低点
worksheet.add_sparkline("F3", {
    "range": "Sheet1!A3:E3", 
    "type": "win_loss", 
    "negative_points": True,
    "high_point": True, 
    "low_point": True
})
# 最后,关闭并保存工作簿
workbook.close()

设置单元格保护防止修改

makefile 复制代码
# 创建两种具有保护属性的单元格格式:
# - unlocked: 不锁定的格式,可以编辑
# - hidden: 隐藏格式,公式不可见
unlocked = workbook.add_format({"locked": False})  # 创建不锁定的格式
hidden = workbook.add_format({"hidden": True})     # 创建隐藏公式的格式
# 设置A列的宽度为40,以便更好地展示文本
worksheet.set_column("A:A", 40)
# 开启工作表保护模式
worksheet.protect()  # 默认情况下所有单元格都会被锁定
# 分别写入锁定、解锁及隐藏公式的单元格内容
worksheet.write("A1", "Cell B1 is locked. It cannot be edited.")  # B1默认锁定
worksheet.write("A2", "Cell B2 is unlocked. It can be edited.")
worksheet.write("A3", "Cell B3 is hidden. The formula isn't visible.")
# 写入具有不同保护属性的公式
worksheet.write_formula("B1", "=1+2")  # 默认锁定,无法编辑公式
worksheet.write_formula("B2", "=1+2", unlocked)  # 公式所在单元格已解锁,可以编辑
worksheet.write_formula("B3", "=1+2", hidden)  # 公式所在单元格被隐藏,公式不可见
# 关闭并保存工作簿
workbook.close()

显示色阶图

这里使用openpyxl库来实现色阶图输出到excel文件中。

ini 复制代码
from openpyxl import Workbook
from openpyxl.formatting.rule import ColorScaleRule
# 创建一个新的工作簿
workbook = Workbook()
# 选择或创建一个工作表
worksheet = workbook.active
worksheet.title = 'Color Scale Test'
# 假设我们有以下一列测试数据
data = [30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
# 将数据写入单元格
for row, value in enumerate(data, 1):
    ws.cell(row=row, column=1, value=value)
# 定义色阶规则
rule = ColorScaleRule(start_type='min', start_color='FF0000',
                      mid_type='percentile', mid_value=50, mid_color='FFFF00',
                      end_type='max', end_color='00FF00')
# 应用色阶到数据所在列 (这里是第一列A)
worksheet.conditional_formatting.add('A1:A{}'.format(len(data)), rule)

# 保存Excel文件
wb.save('demo.xlsx')

显示条件格式图

这里使用openpyxl库来实现条件图输出到excel文件中。

ini 复制代码
# 导入所需库
from openpyxl import Workbook
from openpyxl.formatting.rule import ColorScaleRule, DataBarRule
from openpyxl.styles.colors import Color
# 1. 创建一个新的Excel工作簿
workbook = Workbook()
# 2. 选择或获取工作簿的第一个工作表,并设置其标题
worksheet = workbook.active
worksheet.title = 'Color Scale Test'
# 3. 假设有如下一列测试数据
data = [30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
# 4. 将测试数据写入Excel工作表的A列,从第二行开始(Excel表格的第一行默认为表头)
for row_index, value in enumerate(data, 1):  # 使用enumerate()函数,索引从1开始
    worksheet.cell(row=row_index, column=1, value=value)  # 设置单元格内容
# 5. 定义数据所在的区域,即A2到A10这一列(由于enumerate()从1开始,所以此处是A1到A10)
data_range = worksheet['A1:A10']
# 6. 创建一个DataBarRule实例,用于在指定范围内应用数据条(颜色条)条件格式
rule = DataBarRule(
    start_type='min',  # 数据条的起点基于该列的最小值
    end_type='max',   # 数据条的终点基于该列的最大值
    color=Color(rgb='00FF00'),  # 数据条的颜色为绿色
    showValue=True,           # 显示数据条旁边的实际数值
    minLength=None,            # 数据条的最小长度将由程序自动计算,保持默认值
    maxLength=None             # 数据条的最大长度将由程序自动计算,保持默认值
)
# 7. 将数据条条件格式规则应用到指定的单元格区域
worksheet.conditional_formatting.add('A1:A10', rule)  # 将规则应用到A1到A10这一列
# 8. 保存已应用条件格式的工作簿至Excel文件
workbook.save('demo.xlsx')  # 文件名:demo.xlsx

利用calamine读取excel大文件数据性能测试

ini 复制代码
# 生成一个50000行、5列的随机数二维数组
data = np.random.random(size=(50000, 5))
# 将生成的随机数组转换为Pandas DataFrame,这是一个表格型数据结构,便于进行数据分析和操作
pf = pd.DataFrame(data)
# 利用openpyxl引擎写入excel文件
%timeit pf.to_excel("demo.xlsx",index=False, engine= 'openpyxl')
# 4.33 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 利用calamine引擎读excel文件
%timeit pd.read_excel("demo.xlsx", engine= 'calamine')
# 344 ms ± 1.76 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 利用openpyxl引擎读excel文件
%timeit pd.read_excel("demo.xlsx", engine= 'openpyxl')
# 3.33 s ± 26.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

通过实验看出: 在5万行*5数据中,通过calamine引擎读excel文件比传统openpyxl快9倍多。

将生成的excel文件发送到'老板'的邮箱

以163为例,打开邮箱设置对应的smtp服务

在开启的同时会弹出'授权密码',下面会用到。

编写python代码将excel文件发送到指定邮箱

python 复制代码
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE
from email import encoders
import os

# 配置SMTP服务器和登录信息
smtp_server = 'smtp.163.com' #使用163邮箱作为发送服务器,也可以使用其他邮箱
smtp_port = 25 #端口号
username = 'your_email@163.com' #你的163邮箱,也可以使用其他邮箱
password = 'xxxxx' #你邮箱对应smtp的授权密码
sender_email = 'your_email@163.com'
receiver_emails = ['recipient1@qq.com',]  # 收件人列表

# 创建MIMEMultipart对象以便容纳多部分邮件内容
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = COMMASPACE.join(receiver_emails)
msg['Subject'] = '测试文件'

# 创建邮件正文
body = '这是今天的测试文档.'
msg.attach(MIMEText(body))

# 打开并读取Excel文件
filename = 'demo.xlsx'  # 要发送的Excel文件路径
with open(filename, 'rb') as f:
    attachment = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    attachment.set_payload(f.read())
    encoders.encode_base64(attachment)  # 对附件内容进行base64编码
    attachment.add_header('Content-Disposition', f'attachment; filename="{os.path.basename(filename)}"')
    msg.attach(attachment)

# 连接SMTP服务器并发送邮件
try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # 如果使用的是非安全端口,需要启用TLS加密
    server.login(username, password)
    server.sendmail(sender_email, receiver_emails, msg.as_string())
    server.quit()
    print("Email sent successfully.")
except Exception as e:
    print("Error occurred while sending email:", e)

效果展示

参考文档

  1. github.com/jmcnamara/X...
  2. github.com/DeepSpace2/...
  3. openpyxl.readthedocs.io/en/stable/t...
  4. github.com/tafia/calam...

z先生说

今天给大家分享利用python来实现自动化办公处理excel文件数据,并将结果自动发送老板邮箱,干货满满~

如果本文对你有帮助,还请你点赞在看转发。你的支持就是我创作的最大动力,关注下面公众号不迷路~

相关推荐
_深海凉_19 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦20 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu20 小时前
Python 语法之数据结构详细解析
python
AI问答工程师20 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan52021 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕21 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙21 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话1 天前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
悟空爬虫-彪哥1 天前
VRChat开发环境配置,零基础教程
python
数据知道1 天前
《 Claude Code源码分析与实践》专栏目录
python·ai·github·claude code·claw code