Python用openpyxl读取单元格中的公式或读取公式计算值

本文参考了CSDN博主「claria029」的文章,原文链接:https://blog.csdn.net/claria029/article/details/116486904

Python使用openpyxl读取带公式的单元格时,可以选择读取公式还是读取公式计算值。其关键在于打开文件时给出data_only参数,当该参数的值设为False时,读取的是单元格中的公式;当该参数的值设为True时,读取的是单元格中的公式计算值。当省略该参数时,默认为False。

如下两种打开文件方式,都读取的是公式:

wb = openpyxl.load_workbook(filename)

wb = openpyxl.load_workbook(filename, data_only=False)

如下打开文件方式,读取的是公式计算值:

wb = openpyxl.load_workbook(filename, data_only=True)

注意:如果该工作簿是用open

<think>我们使用openpyxl按列读取Excel单元格。主要步骤包括: 1. 加载工作簿 2. 选择工作表(可以按名字选择,也可以选择活动工作表) 3. 获取某一列的所有单元格 4. 遍历该列的单元格读取每个单元格 注意:openpyxl中列可以用字母(如'A')者数字索引(从1开始)表示。但是,当我们用列字母获取整列时,会得到该列的所有单元格,包括空单元格(但空单元格是None)。 有两种方式可以按列读取: a) 通过列字母:`sheet['A']` 返回A列的所有单元格(从第一个非空行到最后一个非空行,但实际上会包括中间的空单元格,直到最大行) b) 通过迭代列:`sheet.iter_cols()` 可以指定最小列、最大列,然后按列迭代。 但是,我们通常知道列字母者列索引,所以第一种方式更直接。 另外,openpyxl的工作表有一个属性`max_row`表示最大行,我们可以通过列字母和行号来遍历,但直接使用`sheet[列字母]`会更方便。 以下是一个示例函数,它按列读取,并返回该列所有非空单元格者包括空,根据需求)的列表。 我们可以选择是否跳过空。</think># 使用 openpyxl 按列读取 Excel 单元格Python 中使用 openpyxl 按列读取 Excel 单元格是一个常见需求,下面我将详细介绍实现方法和注意事项。 ## 完整解决方案 ```python from openpyxl import load_workbook def read_column_values(file_path, sheet_name=None, column_letter='A', include_header=False): """ 读取Excel文件中指定列的单元格 :param file_path: Excel文件路径 :param sheet_name: 工作表名称(默认为活动工作表) :param column_letter: 列字母(如'A', 'B', 'C') :param include_header: 是否包含标题行 :return: 包含列的列表 """ # 加载工作簿(设置data_only=True以获取公式计算后的) wb = load_workbook(file_path, data_only=True) # 选择工作表 sheet = wb.active if sheet_name is None else wb[sheet_name] # 获取指定列的所有单元格 column_cells = sheet[column_letter] # 确定起始行索引(是否包含标题行) start_index = 0 if include_header else 1 # 提取单元格并处理空 values = [] for cell in column_cells[start_index:]: # 处理空单元格(返回None空字符串) value = cell.value if cell.value is not None else '' values.append(value) return values # 使用示例 file_path = 'example.xlsx' sheet_name = 'Sheet1' # 可选,默认为活动工作表 column_letter = 'B' # 要读取的列 # 读取B列数据(不包含标题) column_values = read_column_values(file_path, sheet_name, column_letter) print(f"列 {column_letter} 的: {column_values}") # 读取A列数据(包含标题) column_a_with_header = read_column_values(file_path, sheet_name, 'A', include_header=True) print(f"列 A 的(含标题): {column_a_with_header}") ``` ## 关键参数说明 1. **`column_letter`**:指定要读取的列(如 'A', 'B', 'C') 2. **`include_header`**:控制是否包含第一行的标题 - `True`:包含标题行 - `False`:从第二行开始读取(默认) 3. **`sheet_name`**:指定工作表名称(默认使用活动工作表) ## 处理不同数据类型 Excel 单元格可能包含多种数据类型,以下是处理建议: ```python # 在循环中添加类型处理 for cell in column_cells[start_index:]: value = cell.value # 处理日期类型 if isinstance(value, datetime): value = value.strftime('%Y-%m-%d') # 处理布尔类型 elif isinstance(value, bool): value = str(value) # 处理空 elif value is None: value = '' # 自定义默认 values.append(value) ``` ## 性能优化技巧 对于大型 Excel 文件,可以使用以下优化方法: ```python def read_large_column(file_path, column_letter, max_rows=1000): """高效读取大型文件的列数据""" wb = load_workbook(file_path, data_only=True, read_only=True) sheet = wb.active values = [] row_count = 0 # 逐行读取(减少内存占用) for row in sheet.iter_rows(min_col=ord(column_letter)-64, max_col=ord(column_letter)-64, values_only=True): if row_count >= max_rows: break values.append(row[0] if row[0] is not None else '') row_count += 1 wb.close() return values ``` ## 常见问题解决方案 1. **处理空单元格**: ```python # 在循环中添加空检查 value = cell.value if cell.value is not None else 'N/A' ``` 2. **读取多列数据**: ```python def read_multiple_columns(file_path, columns): """读取多列数据""" wb = load_workbook(file_path, data_only=True) sheet = wb.active result = {} for col in columns: result[col] = [cell.value for cell in sheet[col][1:]] return result ``` 3. **处理公式计算结果**: ```python # 确保加载工作簿时设置 data_only=True wb = load_workbook(file_path, data_only=True) ``` ## 注意事项 1. **列字母大小写**:列字母不区分大小写,'A' 和 'a' 效果相同 2. **空处理**:空单元格返回 `None`,建议转换为空字符串自定义 3. **性能考虑**: - 小型文件:使用 `sheet[column_letter]` 直接获取整列 - 大型文件:使用 `iter_rows()` 逐行读取,设置 `read_only=True` 4. **数据类型**:Excel 中的日期会转换为 Python 的 `datetime` 对象 5. **关闭工作簿**:处理完成后建议显式关闭工作簿(特别是大型文件) > openpyxl 是处理 Excel 2010+ (.xlsx) 文件的强大工具,但对早期格式 (.xls) 支持有限[^1]。对于大型数据集,pandas 可能是更高效的选择[^2]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值