以下是使用 openpyxl
库读取 Excel 表数据的详细步骤及示例代码,结合多个来源整理:
1. 安装 openpyxl
pip install openpyxl
- 或者用pycharm安装openpyxl
2. 加载 Excel 文件
from openpyxl import load_workbook
# 加载 Excel 文件,支持 xlsx/xlsm/xltx/xltm 格式
wb = load_workbook('example.xlsx')
# 若需处理大型文件,可启用只读模式提升性能
# wb = load_workbook('large_file.xlsx', read_only=True)
3. 获取工作表(Sheet)
# 获取所有工作表名称列表
sheet_names = wb.sheetnames
print(sheet_names) # 输出:['Sheet1', 'Sheet2']
# 选择指定工作表(通过名称或索引)
sheet = wb['Sheet1'] # 按名称选择
sheet = wb.worksheets[0] # 按索引选择(从0开始)
# 获取当前活动的工作表
active_sheet = wb.active
4. 读取单元格数据
单单元格读取
# 方法1:通过行列号(索引从1开始)
cell_value = sheet.cell(row=2, column=3).value # 读取第2行第3列(C2)
# 方法2:通过Excel坐标(如B4)
cell_value = sheet['B4'].value
# 获取单元格坐标和值
cell = sheet['B4']
print(f"坐标: {cell.coordinate}, 值: {cell.value}")
多单元格遍历
# 遍历所有行数据(推荐)
for row in sheet.iter_rows(min_row=2, values_only=True):
# row 为元组,按列顺序存储值
print(row) # 例如:('张三', 25, '销售部')
# 指定范围遍历(A1到C5)
for row in sheet.iter_rows(min_row=1, max_row=5, min_col=1, max_col=3):
for cell in row:
print(cell.value)
5. 获取表格最大行和列
max_row = sheet.max_row # 实际数据最大行数
max_col = sheet.max_column # 实际数据最大列数
print(f"行数:{max_row}, 列数:{max_col}")
6. 完整示例:读取整个表数据
data = []
for row in sheet.iter_rows(min_row=1, values_only=True):
data.append(row)
# 转换为二维列表(包含标题行)
print(data)
"""
输出示例:
[
('姓名', '年龄', '部门'),
('张三', 25, '销售部'),
('李四', 30, '技术部')
]
"""
7.工作上实际使用操作
import openpyxl
import os
from loguru import logger
import time
def do_dict(data_dict,data_key,data_value):
# 处理字典,返回字典
if data_dict:
key_list = data_dict.keys()
if data_key not in key_list:
data_dict[data_key] = [data_value]
else:
data_dict[data_key].append(data_value)
else:
data_dict[data_key] = [data_value]
return data_dict
#定义Code类型
code_type_list=['one','two','three']
one_code=[4, 5]#参数Code是one
two_code=[53, 54, 55, 56, 52, ]
#把数据表里面的类型按照Code分组
code_one_dict={}#one的Code
code_two_dict={}#two的Code
code_three_dict={}#three的Code
code_type_dict={'one':code_one_dict,'two':code_two_dict,'three':code_three_dict}
sheet_name = 'name'
log_file = f'./log/'
if not os.path.exists(log_file):
os.makedirs(log_file)
logger.add(f'{log_file}{sheet_name}{int(time.time())}AutoTest.log', rotation='100 MB', encoding='utf-8')
# 打开excel文件
file_path='./one.xlsx'
wb = openpyxl.load_workbook(file_path)
# 选择指定sheet
ws = wb[sheet_name]
#遍历最后行+1
lats_num=155 if 'sheet' in sheet_name else 156
for row in range(3, lats_num):
#读取指定行、列的值
Code_str = ws.cell(row=row, column=6).value
print(Code_str)
#获取场景名称
scene_name = ws.cell(row=row, column=4).value
#判断有Code
if Code_str is not None:
if '特殊' not in Code_str and Code_str !='' :
#把字符串转成json格式
Code_json = eval(Code_str)
#提取Code
Code = Code_json['Code']
#处理Code的格式[]
Code = str(Code).replace('[', '').replace(']', '').replace(' ', '')
#把字符串转成int格式
Code = int(Code)
#判断Code是否是one
if Code in one_code:
code_one_dict=do_dict(code_one_dict,Code,scene_name)
#判断Code是否是two
elif Code in two_code:
code_two_dict = do_dict(code_two_dict, Code, scene_name)
#判断Code是否是three
else:
code_three_dict = do_dict(code_three_dict, Code, scene_name)
print(f'{scene_name}---{Code}')
# 写入excel文件
ws.cell(row=row, column=19).value = Code
# 保存文件
wb.save(file_path)
#处理Code的数据
for code_type in code_type_list:
do_code_dict=code_type_dict[code_type]
logger.info(f'{code_type}类型')
if do_code_dict:
code_key_list=do_code_dict.keys()
for code in code_key_list:
value_list=do_code_dict[code]
logger.info(f'{code_type}---{code}---个数{len(value_list)}')
for value in value_list:
logger.info(f'{code_type}---{code}-{value}')
注意事项
- 文件路径处理:建议使用
pathlib
处理绝对路径,避免路径错误[5]。 - 大文件优化:启用
read_only=True
模式减少内存占用,适用于百万级数据[18]。 - 格式兼容性:若需同时处理
.xls
和.xlsx
,需结合xlrd
和openpyxl
[8]。 - 异常处理:避免在
load_workbook()
中添加不支持参数(如encoding
)导致错误[17]。
通过以上步骤,您可高效读取 Excel 文件内容并转换为结构化数据。更多高级操作(如样式修改、图表插入)可参考官方文档或进阶教程[27] [37]。