用python使用openpyxl读取Excel表数据

以下是使用 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)
  • 注意:openpyxl 不支持旧版 .xls 格式,需转换为 .xlsx 或使用其他库(如 xlrd[5] [8]

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}")
  • 注意:空单元格返回 None[1] [5]
多单元格遍历
# 遍历所有行数据(推荐)
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}")
  • 若表格有空行或空列,需手动处理[1] [14]

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}')

注意事项

  1. 文件路径处理:建议使用 pathlib 处理绝对路径,避免路径错误[5]
  2. 大文件优化:启用 read_only=True 模式减少内存占用,适用于百万级数据[18]
  3. 格式兼容性:若需同时处理 .xls.xlsx,需结合 xlrdopenpyxl[8]
  4. 异常处理:避免在 load_workbook() 中添加不支持参数(如 encoding)导致错误[17]

通过以上步骤,您可高效读取 Excel 文件内容并转换为结构化数据。更多高级操作(如样式修改、图表插入)可参考官方文档或进阶教程[27] [37]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值