如何通过Catia VBA与便携版LibreOffice Calc交互并写入单元格
从Catia VBA调用LibreOffice Calc Portable的实现方案
前置准备
- 先完成LibreOffice Portable的COM服务注册:找到你的
LibreOfficeCalcPortable解压目录下的App\libreoffice\program文件夹,在该路径下打开命令提示符,执行命令:soffice.exe -regserver
执行后无弹窗提示即完成注册,后续无需重复操作。
代码调整逻辑
LibreOffice的COM调用体系与微软Office不同,没有Excel.Application类的等价独立ProgID,需通过StarOffice通用服务管理器调用Calc组件,完整示例代码如下:
Dim oSM As Object ' LibreOffice服务管理器 Dim oDesk As Object ' 桌面服务 Dim oCalcDoc As Object ' Calc文档对象 Dim oSheet As Object ' 工作表对象 Dim oCell As Object ' 单元格对象 On Error Resume Next ' 尝试获取已运行的LibreOffice服务实例 Set oSM = GetObject(, "com.sun.star.ServiceManager") If Err.Number <> 0 Then Err.Clear ' 启动新的LibreOffice服务实例 Set oSM = CreateObject("com.sun.star.ServiceManager") End If On Error GoTo 0 ' 创建桌面服务,用于加载/新建文档 Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop") ' 可选:设置界面可见,默认后台运行,若不生效可替换为下一行注释内容 oDesk.Visible = True ' oCalcDoc.CurrentController.Frame.ContainerWindow.Visible = True ' 新建空白Calc文档,若要打开已有文档替换下面的空字符串为文件URL路径,格式示例:"file:///C:/test/test.ods" Set oCalcDoc = oDesk.loadComponentFromURL("", "_blank", 0, Array()) ' 获取第一个工作表(索引从0开始计数) Set oSheet = oCalcDoc.Sheets.getByIndex(0) ' 写入指定单元格:getCellByPosition(列索引, 行索引),索引均从0开始:A1对应(0,0),B2对应(1,1) Set oCell = oSheet.getCellByPosition(0, 0) oCell.String = "从Catia VBA写入的测试内容" ' 写入文本内容 ' 写入数值用 oCell.Value = 123.45
注意事项
- 单元格定位方法
getCellByPosition的参数顺序是先列后行,且索引从0开始,和Excel的Cells(行号,列号)的参数顺序、起始值均有差异,注意适配。 - 若要打开本地已有ods文件,需将路径转换为URL格式:反斜杠替换为正斜杠,前缀加
file:///,比如本地路径C:\测试\表格.ods要写成file:///C:/测试/表格.ods。 - 便携版的COM注册操作仅需执行一次,若重装便携版需重新执行注册命令。
内容的提问来源于stack exchange,提问作者Radu Artene
相关产品推荐
相关产品推荐

