当前位置: 首页 > 知识库问答 >
问题:

如何获得LibreOffice无头Calc计算来保存来自uno的新值?

胥宏义
2023-03-14

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

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

soffice  --headless --nologo --nofirststartwizard --accept="socket,host=0.0.0.0,port=8100,tcpNoDelay=1;urp"
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()

从本质上说,我想从python做的是:打开、硬重新计算、保存

共有1个答案

杜成和
2023-03-14

这似乎是LibreOffice旧版本的问题。我在Linux上使用5.0.6.2,即使重新计算,当我直接提取单元格值时,新的值甚至没有显示出来。但是,我升级到6.2,使用了相同的代码和相同的输入文件,问题就消失了。
我决定只回答我自己的问题,而不是删除它,因为这会导致一个挫折,直到我解决了它。

 类似资料:
  • 我在LibreOffice的许多工作表上有大量的数据--一个列和一个列--我想计算每个地址出现的次数,放入列中。例如:

  • 问题内容: 我有一个SocketServer接受传入的连接。出于安全原因,我只应允许本地连接(来自运行服务器的计算机的连接)。 如何确定传入连接是否来自另一台计算机?以下代码是否对此安全? 而方法是这样的: 谢谢,莫森 问题答案: 如果要限制来自本地主机的连接,请在打开ServerSocket时指定该连接。如果仅侦听localhost,则只能从localhost获得连接。

  • 问题内容: 我怀疑这与字节序有关,但我不确定如何解决。我有一个C ++客户端,它告诉Java服务器它将要发送多少字节,而Java服务器仅在输入流上调用readInt()。然后,服务器继续读取其余数据。 目前,如果C ++服务器调用: 然后对应的Java端是: Bytes lBytesSent往往是一个巨大的值,然后在创建数组时就会抛出异常(不足为奇) 只需使用以下命令打开C ++套接字: 而Jav

  • 我正在尝试创建一个检查整数的函数,并将继续循环,直到用户正确输入17或更高的整数。但是,如果我输入错误的输入,例如“K”或“

  • 问题内容: 让我开始向您展示如何在SCSS中执行此操作: 可以编译为: 基本上,SCSS允许我将减号与变量连接起来,以便将其转换为负值。 是否可以使用CSS变量来实现? 问题答案: 是的,你可以做到。只需乘以: