Python基础 - 办公自动化
openpyxl 库不兼容 office 2007 以前的版本,如果遇到了,可以使用 xlwt / xlrd / xlutils 进行读写。
官文网站:https://pypi.org/
1.自动化表格处理
-
加载工作簿
openpyxl.load_workbook(文件路径)
-
获取工作表
- 变量名.active
- 变量名[‘工作表名’] # type: worksheet
-
获取工作表属性
- sheet.max_row
- sheet.max_column
- sheet.dimensions
-
遍历单元格获取单元格的值
for row in (2, sheet.max_row + 1): for col in (1, sheet.max_column + 1): value = sheet.cell(row, clo).value
-
sheet[‘指定单元格’] = 值或函数
-
变量名.save(保存路径)
-
单元格格式改写
- 字体改写
header_style = xlwt.XFStyle() pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN # 0 - ⿊⾊、1 - ⽩⾊、2 - 红⾊、3 - 绿⾊、4 - 蓝⾊、5 - ⻩⾊、6 - 粉⾊、7 - ⻘⾊ pattern.pattern_fore_colour = 5 header_style.pattern = pattern titles = ('姓名', '语⽂', '数学', '英语') for index, title in enumerate(titles): sheet.write(0, index, title, header_style) font = xlwt.Font() # 字体名称, 字体应是电脑里有的字体 font.name = '华⽂楷体' # 字体⼤⼩(20是基准单位,18表示18px) font.height = 20 * 18 # 是否使⽤粗体 font.bold = True # 是否使⽤斜体 font.italic = False # 字体颜⾊ font.colour_index = 1 header_style.font = font align = xlwt.Alignment() # 垂直⽅向的对⻬⽅式 align.vert = xlwt.Alignment.VERT_CENTER # ⽔平⽅向的对⻬⽅式 align.horz = xlwt.Alignment.HORZ_CENTER header_style.alignment = align borders = xlwt.Borders() props = ( ('top', 'top_colour'), ('right', 'right_colour'), ('bottom', 'bottom_colour'), ('left', 'left_colour') ) # 通过循环对四个⽅向的边框样式及颜⾊进⾏设定 for position, color in props: # 使⽤setattr内置函数动态给对象指定的属性赋值 setattr(borders, position, xlwt.Borders.DASHED) setattr(borders, color, 5) header_style.borders = borders
- 单元格格式改写
# 设置⾏⾼为40px sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}')) titles = ('姓名', '语⽂', '数学', '英语') for index, title in enumerate(titles): # 设置列宽为200px sheet.col(index).width = 20 * 200 # 设置单元格的数据和样式 sheet.write(0, index, title, header_style)
2. 自动化邮件处理
在日常办公过程中,不可避免的是邮件交流,在Python的标准库中为我们提供了强大的邮件处理模块,不仅可以自动发送文本邮件,同时还具有定时发送、添加附件等能力。
在发送邮件时,需要通过 SMTP 协议与邮件服务器进行网络通信实现发送邮件的目标。在Python标准库中对SMTP进行可封装,我们只用通过创建对象,给对象发消息就可以实现。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 创建SMTP_SSL对象
smtp_obj = smtplib.SMTP_SSL(host='smtp.126.com', port=465)
# 1. 登录授权
smtp_obj.login('jackfrued@126.com', 'PYNTEOLFBGAVJJKS')
m_part = MIMEMultipart()
# 发件人邮箱
m_part['From'] = 'jackfrued@126.com'
# 收件人邮箱
m_part['To'] = '957658@qq.com;luohao@1000phone.com'
# 抄送人邮箱
m_part['Cc'] = 'sasak@126.com'
# 邮件主题
m_part['Subject'] = 'Python办公自动化学习内容'
content = """
hello! my friend!
"""
mime_text = MIMEText(content, 'plain', 'utf-8')
m_part.attach(mime_text)
# 添加附件
with open('resources/用Python发送邮件和短信.pdf', 'rb') as file:
pdf_file = MIMEText(file.read(), 'base64', 'utf-8')
pdf_file['content-type'] = 'application/pdf'
pdf_file['content-disposition'] = 'attachment; filename="Python-email-sms.pdf"'
m_part.attach(pdf_file)
with open('resources/阿里巴巴2020年股票数据.xlsx', 'rb') as file:
excel_file = MIMEText(file.read(), 'base64', 'utf-8')
excel_file['content-type'] = 'application/vnd.ms-excel'
excel_file['content-disposition'] = 'attachment; filename="alibaba-stock.xlsx"'
m_part.attach(excel_file)
# 2. 发送邮件
smtp_obj.sendmail(
from_addr='jackfrued@126.com',
to_addrs=['957658@qq.com', 'luohao@1000phone.com'],
msg=m_part.as_string()
)
# 3. 结束会话
smtp_obj.quit()
-
Base64 编码
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
它是一种将二进制编码转换为可打印字符一种。它是MIME编码里面非常常见一种可逆转换二进制方法!现常用于电子邮件中,邮件类型声明如:Content-Transfer-Encoding: base64 !
由于2的6次方等于64,所以每6个位为一个单元,对应某个可打印字符。三个字节有24个位元,可以对应4个Base64单元,因此3个字节需要用4个base64单元来表示!如:MaN对应base64是:TW Fu ! 这64个可打印字符a-z,A-Z,0-9就占62字符,剩下2个字符不同系统可能使用不同,经常是:“+/”。base64编码后,文档大小为原先的4/3,里面所有字节(包括常见可打印字符)也编码了!
编号 字符 编号 字符 编号 字符 0 A 16 Q 32 g 48 w 1 B 17 R 33 h 49 x 2 C 18 S 34 i 50 y 3 D 19 T 35 j 51 z 4 E 20 U 36 k 52 0 5 F 21 V 37 l 53 1 6 G 22 W 38 m 54 2 7 H 23 X 39 n 55 3 8 I 24 Y 40 o 56 4 9 J 25 Z 41 p 57 5 10 K 26 a 42 q 58 6 11 L 27 b 43 r 59 7 12 M 28 c 44 s 60 8 13 N 29 d 45 t 61 9 14 O 30 e 46 u 62 + 15 P 31 f 47 v 63 / -
Base64 编码转换原理
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
-
百分号编码
使用这种编码的目的是为了传输, 类似UTF8的用途。百分号编码中分为保留字符和非保留字符, 很明显, 所谓的保留字符就是有其特殊用途的, 编码时需要转换的; 非保留字符就是可以直接被使用的, 编码时不需要转换的。
非保留字符是很明确的, 所以在编码时, 只要判断哪些是非保留的, 剩下的就是保留的(需要转换的)