Python openpyxl data_only = True返回None

时间:2016-03-20 16:11:43

标签: python excel openpyxl

我有一个简单的excel文件:     A1 = 200     A2 = 300     A3 = = SUM(A1:A2)

此文件在excel中工作并显示SUM的正确值,但在使用openpyxl模块进行python时,我无法在data_only = True模式中获取值

shell中的Python代码:

wb = openpyxl.load_workbook('writeFormula.xlsx', data_only = True)
sheet = wb.active
sheet['A3']
<Cell Sheet.A3> # python response
print(sheet['A3'].value)
None # python response

,同时:

wb2 = openpyxl.load_workbook('writeFormula.xlsx')
sheet2 = wb2.active
sheet2['A3'].value
'=SUM(A1:A2)'  # python response

任何建议我在做什么?

4 个答案:

答案 0 :(得分:11)

这取决于文件的来源。 data_only=True取决于像Excel这样的应用程序缓存的公式的值。但是,如果文件是由openpyxl或类似的库创建的,则可能从未评估公式,因此,没有缓存值可用,openpyxl将报告None作为值。

答案 1 :(得分:1)

我已经用Openpyxl和Python复制了该问题。

我当前正在使用openpyxl版本2.6.3和Python 3.7.4。我还假设您正在尝试完成Al Sweigart的ATBSWP的练习。

考虑到Excel确实可以缓存值,我尝试并测试了Charlie Clark的答案。我在Excel中打开电子表格,将公式复制并粘贴到相同的单元格中,最后保存了工作簿。在使用带有data_only = True选项的Openpyxl在Python中重新打开工作簿并读取该单元格的值后,我看到了正确的值500,而不是错误的值None类型。

我希望这会有所帮助。

答案 2 :(得分:0)

是的,@Beno 是对的。如果你想在不碰它的情况下编辑文件,你可以制作一个编辑excel文件的小“机器人”。

警告:这是一种编辑 excel 文件的递归方式。这些库取决于您的机器,请确保在继续其余代码之前正确设置 time.sleep

例如,我使用time.sleepsubprocess.Popenpywinauto.keyboard.send_keys,只需向您设置的任何单元格添加随机字符,然后保存即可。然后 data_only=True 完美运行。如果您不明白我的意思,请告诉我,我将提供示例代码。

有关 pywinauto.keyboard 的更多信息:pywinauto.keyboard

抱歉我的英语不好。

答案 3 :(得分:-1)

我遇到了同样的问题。通读此线程后,我设法通过简单地打开 excel 文件、进行更改然后再次保存文件来修复它。多么奇怪的问题。