Python 如何让LibreOffice headless Calc calculate从uno保存新值?

Python 如何让LibreOffice headless Calc calculate从uno保存新值?,python,libreoffice,libreoffice-calc,uno,Python,Libreoffice,Libreoffice Calc,Uno,我试图从python中打开一个excel文件,让它重新计算,然后用新计算的值保存它。 电子表格很大,在LibreOffice和GUI中可以很好地打开,最初显示的是旧值。如果我然后做一个数据->计算->重新计算,我会看到正确的值,当然我可以保存为,一切看起来都很好。 但是,我想使用多个大型电子表格,所以我不想使用GUI,而是想使用Python。以下所有内容似乎都可以创建一个新的电子表格,但它没有新的值(除非我再次手动重新计算) 我在Linux上运行。首先,我这样做: soffice --head

我试图从python中打开一个excel文件,让它重新计算,然后用新计算的值保存它。
电子表格很大,在LibreOffice和GUI中可以很好地打开,最初显示的是旧值。如果我然后做一个数据->计算->重新计算,我会看到正确的值,当然我可以保存为,一切看起来都很好。 但是,我想使用多个大型电子表格,所以我不想使用GUI,而是想使用Python。以下所有内容似乎都可以创建一个新的电子表格,但它没有新的值(除非我再次手动重新计算)

我在Linux上运行。首先,我这样做:

soffice  --headless --nologo --nofirststartwizard --accept="socket,host=0.0.0.0,port=8100,tcpNoDelay=1;urp"
下面是示例python代码:

import uno

local = uno.getComponentContext()
resolver = local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", local)
context = resolver.resolve("uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager")
remoteContext = context.getPropertyValue("DefaultContext")
desktop = context.createInstanceWithContext("com.sun.star.frame.Desktop", remoteContext)
document = desktop.getCurrentComponent()


file_url="file://foo.xlsx"
document = desktop.loadComponentFromURL(file_url, "_blank", 0, ())

controller=document.getCurrentController()

sheet=document.getSheets().getByIndex(0)
controller.setActiveSheet(sheet)
document.calculateAll()

file__out_url="file://foo_out.xlsx"
from com.sun.star.beans import PropertyValue
pv_filtername = PropertyValue()                                             
pv_filtername.Name = "FilterName"                                           
pv_filtername.Value = "Calc MS Excel 2007 XML"                                             

document.storeAsURL(file__out_url, (pv_filtername,))
document.dispose()
运行上述代码并打开foo_out.xlsx后,它将显示“旧”值,而不是重新计算的值。我知道calculateAll()需要一点时间,因为我希望它能够重新计算。但是,新值似乎并没有实际保存。 如果我在Excel中打开它,它会自动重新计算并显示正确的值;如果我在LibreOffice中打开它并进行硬重新计算,它会显示正确的值。但是,我需要的是从上面的python中保存它,以便它已经包含重新计算的值

有办法吗

基本上,我想从python中做的是:
打开,硬重新计算,saveas

这似乎是旧版本LibreOffice的一个问题。我在Linux上使用的是5.0.6.2,尽管我在重新计算,但当我直接提取单元格值时,新值甚至没有显示出来。 但是,我升级到了6.2,使用相同的代码和相同的输入文件,问题就消失了。

我决定只回答我自己的问题,而不是删除它,因为这会让我感到沮丧,直到我解决了它。

这似乎是旧版本LibreOffice的问题。我在Linux上使用的是5.0.6.2,尽管我在重新计算,但当我直接提取单元格值时,新值甚至没有显示出来。 但是,我升级到了6.2,使用相同的代码和相同的输入文件,问题就消失了。

我决定只回答我自己的问题,而不是删除它,因为这会让我感到沮丧,直到我解决了它。

AOO论坛中建议的一种方法是使用
Copy
Paste Special
将公式替换为计算值。当然,你得弄清楚联合国办事处的细节。这似乎是摆脱公式的一个解决方案。我不想那样做。我只想存储当前值,这样就不必重新计算。而且,电子表格可以用熊猫阅读。目前,pandas只读取“旧”值。AOO论坛建议的一种方法是使用
Copy
Paste Special
将公式替换为计算值。当然,你得弄清楚联合国办事处的细节。这似乎是摆脱公式的一个解决方案。我不想那样做。我只想存储当前值,这样就不必重新计算。而且,电子表格可以用熊猫阅读。目前,熊猫只读取“旧”值。