python 库之 openpyxl 入门
openpyxl是一个用于读取/写入Excel 2010 xlsx / xlsm / xltx / xltm文件的Python库。
openpyxl 配合爬虫小程序将爬取到的数据保存为Excel文件格式, 便于分析, 或者将一些程序产生的数据保存到Excel中以备不时之需, 很有用! 值得好好学习一下, 现在我入门先!
安装
使用pip安装 openpyxl, 同时安装 pillow 库.
pip install openpyxl
pip install pillow
使用
1. 导入库并创建一个新的工作簿
# 导入Workbook类
from openpyxl import Workbook
# 实例化一个Workbook对象, 创建一个工作簿
wb = Workbook()
# 获取活动工作表, 新创建的工作簿默认是第一张工作表即"sheet"
ws = wb.active
# 创建新的工作表, wb.create_sheet第一个参数是工作表的title, 第二个参数可以指定工作表的下标, 默认从 0 开始
ws1 = wb.create_sheet(title="Mysheet1")
# ws2第二个参数 "0", 会将表插入到工作簿的第一张, 但是当前活动表还是ws表
ws2 = wb.create_sheet(title="Mysheet2", 0)
# 查看新创建表的 title
ws1_name = ws1.title # 'Mysheet1'
# 使用 Workbook.sheetname 属性查看工作簿的所有工作表的名称
all_sheet_names = wb.sheetnames
# print(all_sheet_names) # ['Mysheet2', 'Sheet', 'Mysheet1']
## 读写一个单元格数据
c = ws['A1']
print(c) # <Cell 'Sheet'.A1>
# 读取'A1'单元格的值
# print(c.value) # None 因为新创建的表, 还未赋值
print(ws['A1'].value) # 和c.value效果一样, 但是还是觉得这样用直接
# 给 'A1' 单元格赋值
ws['A1'] = "id"
print(ws['A1'].value) # 'id'
ws['B1'] = 'name'
ws['C1'] = 'age'
## 读写多个单元格的数据(使用切片访问单元格范围)
cells = ws['A1':'C2']
# 要添加的数据
content = [1, 'jeff', 26]
# 使用 append函数 添加一行数据, 每执行一次, 向下移动一行添加数据
ws.append(content)
# 读取添加的数据
for rowOfCellObject in ws['A1':'C2']:
for cellObject in rowOfCellObject:
print(cellObject.coordinate, cellObject.value)
print('...END OF ROW...\n')
### 输出如下:
# A1 id
# B1 name
# C1 age
# ...END OF ROW...
# A2 1
# B2 jeff
# C2 26
# ...END OF ROW...
# ws['B1'] = 'name'
# ws['C1'] = 'age'
# 保存工作簿, wb.save() 方法接收一个参数, 即保存文件的位置即名称
wb.save(r"C:\Users\Administrator\Desktop\Excel_demo.xlsx")
2. 加载一个已经存在的工作簿
# 导入库
from openpyxl import load_workbook
# 加载已有工作簿, 使用load_workbook
wb = load_workbook(r"C:\Users\Administrator\Desktop\log.xlsx")
# 查看工作簿的所有工作表
print(wb.sheetnames) # ['wechat_seeded', 'Sheet2', 'Sheet3']
# 获取active表
print(wb.active) # <Worksheet "wechat_seeded">
# ## 接下来的读写单元格数据和 1.中的一样
3. 单元格中使用日期类型
# 导入库
import datetime
from openpyxl import Workbook
# 创建工作簿
wb = Workbook()
# 获取当前的表
ws = wb.active
ws['A1'] = "Time"
# 将A2单元格的日期设置为当前的日期, 并按格式显示
ws['A2'] = datetime.datetime.now().strftime('%Y-%m-%d')
ws['A3'] = datetime.datetime(2018, 7, 21)
# print(ws['A2'].value) # '2019-07-31'
# print(ws['A3'].value) # "2018-07-21 00:00:00"
4. 单元格中使用简单的公式
# 导入库
from openpyxl import Workbook
# 创建工作簿
wb = Workbook()
# 获取当前的表
ws = wb.active
ws["A1"] = 1
ws["B1"] = 2
# 给C1单元格直接赋值为需要在excel中的公式
ws["C1"] = "=SUM(A1:B1)"
print(ws["C1"].value) # 显示的是"=SUM(A1:B1)" 但是在Excel表中显示的是计算结果
5. 批量修改已有excel
批量打开文件夹中的excel工作簿以及工作簿中的所有工作表, 在已有工作表的下面添加固定的文字
# coding=utf-8
import os
import openpyxl
# 用于设置自动换行, 左对齐
from openpyxl.styles import Alignment
# 根路径, 将所有的excel相关的文件夹放在此文件夹下
path = 'D:\File\Python\Python_Excel\Excel_Self\Contents'
# 需要写入单元格的值
strs = "多谢惠顾!请贵公司核对后签字盖章并在次月5日前将原件交回本公司,否则,基于本公司信用管理政策,将很可能影响到后续的供货安排。为了能向贵公司提供更好的产品和服务,需要您的配合与支持,谢谢!"
def get_excel_path(path:str) -> list:
'''
传入str类型的路径, 返回的是该路径下的已.xlsx结尾的文件的集合
'''
# 存放excel路径的列表
result_excels = []
# 对根路径进行迭代
for each_entry in os.scandir(path):
# 判断文件是不是目录
if each_entry.is_dir():
# 如果是目录, 则将该目录传递给函数, 递归调用
result_excels += get_excel_path(each_entry.path)
# 如果文件是一个普通文件, 判断是不是excel文件, 如果是就加入到result_excels
else:
if each_entry.path.endswith('.xlsx'):
result_excels.append(each_entry.path)
return result_excels
def write_to_excel(result_excels:list):
'''
传入一个excel工作簿的列表, 打开每一个工作簿的工作表, 完成合并单元格, 赋值等工作
'''
# 这个for 循环打开result_excels列表中的每一个excel
for each_excel in result_excels:
print(each_excel)
wb = openpyxl.load_workbook(each_excel)
# 获取所有的工作表
sheets = wb.sheetnames
# 获取每一个sheet, 并且在最大行的后面增加固定的值
for each_sheet in sheets:
# 获取工作表
ws = wb[each_sheet]
# 获取工作表最大行(有内容的最大行数)加2行的行数
start = ws.max_row + 2
# 合并单元格
ws.merge_cells(start_row=start, start_column=1, end_row=start, end_column=10)
# 设置单元格左对齐, 上下居中, 自动换行
alignment = Alignment(horizontal="left", vertical="center", wrap_text=True)
ws.cell(row=start, column = 1).alignment = alignment
# 设置行高
ws.row_dimensions[start].height = 30
# 给合并后的单元格赋值
ws.cell(row=start, column = 1).value = strs
# 设置确认, 审核, 制单的单元格
ws.cell(row=start+1, column=1, value="客户名称确认(签字并盖章):")
ws.cell(row=start+1, column=5, value="审核:")
ws.cell(row=start+1, column=9, value="制单:TLL")
# 保存
wb.save(each_excel)
# 调用函数
write_to_excel(get_excel_path(path))
6. 暂时先学到这里, 碰到实际需求在学习
学习网站: openpyxl文档