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类常见的有三大数据对象,分别如下:
- WorkBook:工作簿对象
- Sheet:表单对象
- Cell:表格对象
本文主要使用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的资料请关注脚本之家其它相关文章!