引入
openpyxl是用于读取/写入xlsx/xlsm文件的Python库,可借此进行excel处理
使用
1.预处理
openpyxl只能操作xlsx文件,遇到xls文件时需要进行转化。
两种转换方式:
-
手动转换 打开xls文件,手动另存为xlsx格式
-
使用pywin32模块进行转换
# 转换原excel文件为xls,xlsx类型 def change_excel_file_type(file_path, dest_type, delete_ori=False): file_path = os.path.abspath(file_path) # 获取原文件后缀 ori_type = os.path.splitext(file_path)[-1][1:] if ori_type == dest_type: return assert dest_type in ['xls', 'xlsx'], '仅支持转换为xls,xlsx文件' # 拼接新路径 dest_path = file_path[0:-len(ori_type)] + dest_type file_format = 51 if dest_type == 'xlsx' else 56 # 打开,另存 Excelapp = win32.gencache.EnsureDispatch('Excel.Application') workbook = Excelapp.Workbooks.Open(file_path) workbook.SaveAs(dest_path, FileFormat=file_format) workbook.Close() Excelapp.Application.Quit() # 删除源文件 if delete_ori: os.remove(file_path)
2.新建工作簿
工作簿相当于一个Excell文件,工作表是工作簿中页面
新建、访问、复制工作表,修改工作表名称
注意:保存文件时将覆盖现有文件而不发出警告
import openpyxl
wb = openpyxl.Workbook()
# 新文件默认带有一个工作表'Sheet'
ws = wb.active
# 访问、修改工作表名称
ws.title = "这是默认工作表"
# 新建工作表
ws1 = wb.create_sheet("我的工作表1") # 添加到最后 (default)
ws2 = wb.create_sheet("我的工作表2", 0) # 插入到最前
ws3 = wb.create_sheet("我的工作表3", -1) # 插入到倒数第二
# 通过名称访问工作表
print(wb.sheetnames)
default_ws = wb["这是默认工作表"]
# 复制工作表(图像、图表等无法复制)
target = wb.copy_worksheet(default_ws)
print(target.title)
# 保存,退出
wb.save('test.xlsx')
wb.close()
3.打开Excel文件
wb = openpyxl.load_workbook('test.xlsx')
4.访问单元格
注意:访问时会在内存中创建该单元格,即使没有给它们赋值
4.1访问单个单元格
# 直接使用行号列号
cell_1 = ws['B3']
# 或使用坐标
cell_2 = ws.cell(row=1, column=1)
# 访问并进行赋值
ws.cell(row=1, column=1, value='测试')
# 获取单元格的值
print(cell_1.value)
print(cell_2.value)
4.2访问多个单元格
4.2.1访问行、列、区域
注意:访问行、列时会获取对应行列中所有创建的单元格,哪怕未被赋值
#获取区域 得到二维元组: (行(单元格,单元格,...),行(),...)
cell_range = ws['A1':'C2']
# 获取列的名称
from openpyxl.utils import get_column_letter
get_column_letter(666)
#获取行列得到一维元组:(单元格,单元格,...)
# 获取列
colC = ws['C']
col_range = ws['C:D']
# 获取行
row10 = ws[10]
row_range = ws[5:10]
# 按行访问区域
for row in ws.iter_rows(min_row=4, max_row=6, min_col=3, max_col=6):
for cell in row:
print(cell.value)
# 按列访问区域
for col in ws.iter_cols(min_row=4, max_row=6, min_col=3, max_col=6):
for cell in col:
print(cell.value)
# 遍历值而不是单元格(注意此时遇到公式返回的仍是公式)
for row in ws.iter_rows(min_row=4, max_row=6, min_col=3, max_col=6, values_only=True):
for value in row:
print(value)
4.2.2遍历整个表
# 遍历所有行
for row in ws.rows:
for cell in row:
print(cell.value)
# 遍历所有列
for col in ws.columns:
for cell in col:
print(cell.value)
# 遍历值而不是单元格(注意此时遇到公式返回的仍是公式)
for row in ws.values:
for value in row:
print(value)
4.2.3仅访问值
默认文件加载方式下,访问带公式的单元格cell.value得到的是公式**
使用load_workbook()中的data_only参数,可以得到公式结果**
wb = openpyxl.load_workbook('test.xlsx', data_only=True)