我有一个简单的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
任何建议我在做什么?
答案 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.sleep
、subprocess.Popen
和pywinauto.keyboard.send_keys
,只需向您设置的任何单元格添加随机字符,然后保存即可。然后 data_only=True
完美运行。如果您不明白我的意思,请告诉我,我将提供示例代码。
有关 pywinauto.keyboard 的更多信息:pywinauto.keyboard
抱歉我的英语不好。
答案 3 :(得分:-1)
我遇到了同样的问题。通读此线程后,我设法通过简单地打开 excel 文件、进行更改然后再次保存文件来修复它。多么奇怪的问题。