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

回到顶部