python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python自动化操作excel

python自动化办公操作excel的示例详解

作者:z先生的备忘录

这篇文章主要为大家详细介绍了如何利用python来实现自动化办公操作excel文件进行各种样式展示,并自动发送文件给"老板"的邮箱,希望对大家有所帮助

本文涉及的python库版本信息如下:

!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类常见的有三大数据对象,分别如下:

本文主要使用XlsxWriter库和openpyxl库来实现自动化操作excel文件数据和样式。下面进入我们的正题~

对单个单元格进行操作

# 导入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()

将二维list数组插入excel中

# 定义表格的表头信息以及相关数据
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()

设置单元格样式

# 创建三种不同对角线样式的格式:
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文件中

# 在工作表的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()

插入超链接在单元格中

# 设置第一列(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()

显示迷你图

# 示例数据集,每个列表代表一行数据
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()

设置单元格保护防止修改

# 创建两种具有保护属性的单元格格式:
# - 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文件中。

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文件中。

# 导入所需库
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大文件数据性能测试

# 生成一个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文件发送指定邮箱

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)

效果展示

以上就是python自动化办公操作excel的示例详解的详细内容,更多关于python自动化操作excel的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文