Openpyxl获取单元格值(适用于具有公式,无公式或日期时间的单元格)

时间:2020-04-18 07:42:11

标签: python datetime openpyxl

我有一个电子表格,其电子表格包含不带公式的文本,带公式的单元格以及格式为datetime的单元格。我需要阅读所有这三种情况的实际值。

在Openpyxl 3.0.3。中使用Python 3。

当前,我有以下代码。正如其他有关此类问题的SO帖子所建议的那样,使用data_only=True

workbook = load_workbook(r"path\to\my\spreadsheet.xlsx", data_only=True)
# select first available sheet
sheet = workbook.active
sheet.title

for value in sheet.iter_rows(min_row=2,
                             max_row=86,
                             min_col=1,
                             max_col=7,
                             values_only=True):
     print(value)

结果输出的片段如下所示。在此示例中,第一列很好。第三列是日期格式,但我需要该单元格的实际值(因此它们应为26/1/2020和27/1/2020)。第五列和第六列都有公式,但是我需要实际值。

(2, None, datetime.datetime(2020, 1, 26, 0, 0), None, '=SUM(D$3:D4)', '=E4/E3', None)
(3, None, datetime.datetime(2020, 1, 27, 0, 0), None, '=SUM(D$3:D5)', '=E5/E4', None)

1 个答案:

答案 0 :(得分:1)

第三列是日期格式,但我需要该单元格的实际值(因此它们应为26/1/2020和27/1/2020)
至于格式,python的datetime模块中有一个strfomart
选项

from datetime import datetime
value[2].strformat("%d/%m/%Y)


您是否可以像先完成验证here

一样,先验证值是导入的,而不是公式
print(sheet["a1"].value)


修改 我创建了一个包含三列的Excel测试文件
enter image description here

奇怪的是,它会在您的for循环中返回正确的输出。
输出

(1, 5, 6)
(2, 7, 9)
(3, 9, 12)
(4, 11, 15)

我发现了以下评论(source

FWIW,如openpyxl.load_workbook()中记录的那样, 在使用data_only = True打开工作簿时得到的是“存储的值 Excel上次读取工作表的时间。”这取决于缓存功能 .xls [x / m / ...]文件(我到处都可以找到有关的文档) 微软除外)。 – user948581

也许尝试打开文件,检查公式是否正确计算(在单元格中显示为一个值),然后保存文件并确保已关闭。