python - Openpyxl 获取单元格值(对于有公式、无公式或日期时间的单元格)
问题描述
我有一个电子表格,其中的单元格包含没有公式的文本、有公式的单元格以及格式为datetime
. 我需要阅读所有这三种情况的实际值。
将 Python 3 与 Openpyxl 3.0.3 一起使用。
目前,我有以下代码。使用data_only=True
,正如其他关于此类问题的 SO 帖子所建议的那样。
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)
解决方案
第三列是日期格式,但我需要单元格的实际值(因此它们将是 26/1/2020 和 27/1/2020)
至于格式化strfomart
,python 中的 datetime 模块有选项
from datetime import datetime
value[2].strformat("%d/%m/%Y)
您能否首先验证是否导入了值而不是公式,就像在这里完成的那样
print(sheet["a1"].value)
编辑 我创建了一个包含三列的 Excel 测试文件
奇怪的是,它在你的 for 循环中返回正确的输出。
输出
(1, 5, 6)
(2, 7, 9)
(3, 9, 12)
(4, 11, 15)
我找到了以下评论(来源)
FWIW,如 openpyxl.load_workbook() 中所述,使用 data_only=True 打开工作簿时获得的值是“Excel 上次读取工作表时存储的值”。这依赖于 .xls[x/m/...] 文件的缓存功能(我在除 Microsoft 之外的任何地方都可以找到有关该文件的文档)。– 用户948581
也许尝试打开文件检查公式是否正确计算(显示为单元格中的值),然后保存文件并确保它已关闭。
推荐阅读
- node.js - 如何在 Mac 上运行 TopoJSON?
- c# - How to Implement Multibinding with combox and button?
- openssl - RSA-OAEP 和 RSAES-OAEP 有什么区别?
- php - 如何通过服务帐户身份验证获取营业地点(和评论)
- apache - Apache Httpd 从源构建:致命错误:expat.h:没有这样的文件或目录
- jenkins - 添加自定义路径到 jenkins 节点的 sh 路径
- amazon-web-services - CloudWatch Insights 语法 - Sum() 字节
- swift - 从未出现在视图中的子类创建按钮
- python-3.x - Python:如何捕获 os.chdir FileNotFoundError 执行
- php - 从json获取每天的总和值