Python 如何用 xlrd 读取 Excel 单元格中的公式,而不是读取对应的值?
如题,另外我知道一种方法可以通过 pandas 和 openpyxl 的方法读取单元格的公式,但是环境需要,要解析xls的 excel 文件。
Python 如何用 xlrd 读取 Excel 单元格中的公式,而不是读取对应的值?
1 回复
用 xlrd 直接读取公式本身,你需要设置 formatting_info=True 来加载工作簿,然后通过 cell 对象的 .value 属性获取公式字符串,同时用 .xf_index 配合 .xf_list 判断单元格类型。
不过要注意,xlrd 从 2.0 版本开始移除了对 .xlsx 文件公式的支持。如果你要读 .xlsx,得用 1.2.0 或更早的版本。对于 .xls 文件则没问题。
下面是个完整例子:
import xlrd
# 打开工作簿,必须设置 formatting_info=True 才能获取公式
# 如果是 .xlsx 文件,请使用 xlrd 1.2.0 或更早版本
workbook = xlrd.open_workbook('your_file.xls', formatting_info=True)
sheet = workbook.sheet_by_index(0)
# 遍历单元格
for row in range(sheet.nrows):
for col in range(sheet.ncols):
cell = sheet.cell(row, col)
# 获取单元格的扩展格式索引
xf_index = cell.xf_index
# 通过索引获取扩展格式对象
xf = workbook.xf_list[xf_index]
# 检查单元格类型:1 为文本,2 为数字,3 为日期,4 为布尔,5 为错误,6 为空白
# 公式对应的类型是 2(数字)或 3(日期),并且 xf.cell_type 为 2
if xf.cell_type == 2: # 2 表示公式
# 公式字符串在 cell.value 中,以 '=' 开头
formula = cell.value
print(f"单元格({row}, {col}) 的公式是: {formula}")
else:
# 普通值
value = cell.value
print(f"单元格({row}, {col}) 的值是: {value}")
关键点就两个:一是开工作簿时要加 formatting_info=True,二是通过 xf.cell_type == 2 来判断是不是公式单元格。公式本身就在 cell.value 里,是个以等号开头的字符串。
如果文件是 .xlsx 格式,要么降级 xlrd 到 1.2.0,要么换用 openpyxl 库来读公式。
总结:用 xlrd 读公式得开 formatting_info 并检查 cell_type。

