使用 OpenOffice java api 保存文档会引发异常

Posted

技术标签:

【中文标题】使用 OpenOffice java api 保存文档会引发异常【英文标题】:Saving documents using OpenOffice java api throws Exception 【发布时间】:2020-07-10 10:00:17 【问题描述】:

仅供参考/上下文:我正在 Windows 10 上运行 libreoffice 的便携式安装(但在正常安装的 mac 上遇到相同的异常)。

阅读文档

也许这很重要...我正在通过 InputStream 阅读文档,因为另一种方法由于不同的异常而失败(可能是另一个故事)。

public XComponent openFileViaStream(File file) throws CommandAbortedException, Exception 
    Object fileAccess = this.componentFactory.createInstanceWithContext(SimpleFileAccessClass, this.context);
    XSimpleFileAccess xSimpleFileAccess = (XSimpleFileAccess) UnoRuntime.queryInterface(XSimpleFileAccess.class,
            fileAccess);
    XStream xInputStream = xSimpleFileAccess.openFileReadWrite(file.getAbsolutePath());
    PropertyValue[] loadProps = new PropertyBuilder().add("InputStream", xInputStream).build();

    return loader.loadComponentFromURL("private:stream", "_blank", 0, loadProps);

编写文档

PropertyBuilder 是一个实用程序类,它只是构建一个 PropertyValues 数组以便于使用。

public void save(Object storeMe, File destination) throws IOException, MalformedURLException 
    //@formatter:off
    PropertyValue[] propertyValue = new PropertyBuilder()
            .add("Overwrite", Boolean.TRUE)
            .add("FilterName", "StarOffice XML")
            .build();
    //@formatter:on
        
    XStorable2 st = UnoRuntime.queryInterface(XStorable2.class, storeMe);
    

    // already tried
    // st.storeAsURL(destination.toURI().toURL().toString(), propertyValue);
    // st.storeToURL(destination.toURI().toString(), propertyValue);
    // st.storeToURL(destination.toURI().toURL().toString(), propertyValue);
        
    st.storeAsURL(destination.toURI().toString(), propertyValue);

异常

我在 *** 上搜索时找不到解决方案...

 com.sun.star.task.ErrorCodeIOException: SfxBaseModel::impl_store <file:/E:/test/abc.odt> failed: 0x81a(Error Area:Io Class:Parameter Code:26)
    at com.sun.star.lib.uno.environments.remote.Job.remoteUnoRequestRaisedException(Job.java:173)
    at com.sun.star.lib.uno.environments.remote.Job.execute(Job.java:139)
    at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:334)
    at com.sun.star.lib.uno.environments.remote.JobQueue.enter(JobQueue.java:303)
    at com.sun.star.lib.uno.environments.remote.JavaThreadPool.enter(JavaThreadPool.java:87)
    at com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge.sendRequest(java_remote_bridge.java:636)
    at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.request(ProxyFactory.java:146)
    at com.sun.star.lib.uno.bridges.java_remote.ProxyFactory$Handler.invoke(ProxyFactory.java:128)
    at com.sun.proxy.$Proxy10.storeAsURL(Unknown Source)
    at DocumentHandler.save(DocumentHandler.java:54)
    at Main.test(Main.java:14)
    at Main.main(Main.java:19)

我真的不知道我做错了什么。我查看了来自 api.libreoffice.org 等的示例。 我错过了什么吗?属性值?

提前谢谢你!

【问题讨论】:

我也尝试使用 XStorable 而不是 XStorable2。 【参考方案1】:

看看这些想法是否有帮助。

URI 应类似于 file:///E:/test/abc.odt

将过滤器名称设置为StarOffice XML (Writer)writer8。或者根本不设置它;传递一个属性而不是两个。

验证您是否有权写入文件,例如使用标准 Java 库在该位置创建文件。确保文件没有被其他进程锁定。

【讨论】:

以上是关于使用 OpenOffice java api 保存文档会引发异常的主要内容,如果未能解决你的问题,请参考以下文章

如何将 OpenOffice.org 作为后台进程运行以将我的应用程序连接到使用 UNO Java API?

从 openOffice 或 Microsoft Office 检查葡萄牙语语法的 Java API

从 openoffice API 控制 Impress 演示窗口

OpenOffice Basic 宏与 openoffice API

打开 Office 拼写检查器/Java API

如何使用 OpenOffice API 将 HTML 文本放入 OpenOffice 文档