背景介绍
关注下面公众号"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相关的背景知识
- 对单个单元格进行操作
- 将2维list数组插入excel中
- 设置单元格样式
- 插入图表到excel文件中
- 插入超链接在单元格中
- 显示迷你图
- 设置单元格保护防止修改
- 显示色阶图
- 显示条件格式图
- 利用calamine读取excel大文件数据性能测试
- 将生成的excel文件发送到'老板'的邮箱
- 参考文档
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)
效果展示
参考文档
- github.com/jmcnamara/X...
- github.com/DeepSpace2/...
- openpyxl.readthedocs.io/en/stable/t...
- github.com/tafia/calam...
z先生说
今天给大家分享利用python来实现自动化办公处理excel文件数据,并将结果自动发送老板邮箱,干货满满~
如果本文对你有帮助,还请你点赞在看转发。你的支持就是我创作的最大动力,关注下面公众号不迷路~