Python通过UNO API调用LibreOffice批量实现公式转值咨询
问题场景
- 我定期会收到来自谷歌文档渠道的外部电子表格,需要将其转换为本地专有格式。我已经编写了可将ODS格式表格转换为目标非ODS格式的脚本,由于脚本需要对接大量业务专属的上层PHP逻辑,因此采用PhpSpreadsheet库实现相关能力。
- 这个PHP库理论上可以满足全部功能需求,但在处理包含大量交叉引用公式的复杂表格时,公式计算环节耗时极长,甚至会出现内存溢出。为了提升脚本处理效率,我之前采用手动预处理ODS文件的方式:选中目标工作表的全部单元格,执行【数据】>【计算】>【公式转值(Formula to Value)】操作,之后删除仅存储公式替换源数据的冗余工作表。处理后的文件体积更小,且不包含任何公式,PHP脚本仅需数秒即可完成处理,而原始文件会导致脚本长时间运行后内存耗尽。
- 我现在需要新增Python脚本实现公式转值流程的自动化,该流程需要运行在Linux服务器上,因此计划采用Python通过UNO套接字控制无头模式LibreOffice的方案。目前我已经成功连接LibreOffice的UNO套接字,可以基于旧版OpenOffice API实现单元格操作,当前待解决的核心问题为:
如何通过Python调用UNO API,一次性对工作表内所有单元格触发UI层面的
Formula to Value功能?
- 我已经检索OpenOffice旧版API文档很长时间,暂时没有找到对应的实现方法。
当前Python脚本核心代码
import uno localContext = uno.getComponentContext() resolver = localContext.ServiceManager.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", localContext ) context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") serviceManager = context.ServiceManager desktop = serviceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context) # com.sun.star.lang.XComponent / com.sun.star.sheet.SpreadsheetDocument document = desktop.getCurrentComponent() # com.sun.star.sheet.XSpreadsheets / XNameAccess sheets = document.getSheets() # com.sun.star.sheet.XSpreadsheet sheet = sheets.getByName('OneOfTheSheets') #print(sheet.getCellRangeByName("A1:AP1000")) # 现有方案速度极慢,且存在破坏性: for row in range(0, 1000): for column in range(0, 42): cell = sheet.getCellByPosition(column, row) cell.setFormula(cell.getString())
感谢任何可行的方案参考。
内容的提问来源于stack exchange,提问作者Gerrit Addiks
相关产品推荐
相关产品推荐

