Python Openpyxl Excel处理库

270 阅读2分钟

引入

openpyxl是用于读取/写入xlsx/xlsm文件的Python库,可借此进行excel处理

使用

1.预处理

openpyxl只能操作xlsx文件,遇到xls文件时需要进行转化。

两种转换方式:

  1. 手动转换 打开xls文件,手动另存为xlsx格式

  2. 使用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)