创建 libreoffice 基于文本的数据源并使用 java 设置设置

Posted

技术标签:

【中文标题】创建 libreoffice 基于文本的数据源并使用 java 设置设置【英文标题】:Create a libreoffice text-based datasource and set settings with java 【发布时间】:2015-11-04 12:50:30 【问题描述】:

我需要在 Java 中创建一个 LibreOffice 基于文本的数据源。我的需要是向用户提供一个带有标题行和 n 个值行的 .csv 文件。此 csv 文件是执行邮件合并作业的数据源。如果我使用 LibreOffice 向导手动创建数据源以创建新数据库,则邮件合并作业的执行已经完美。

在我的环境中,我无法为每个使用该应用程序的用户创建数据库。

我已经能够创建一个新的数据源并将其注册到以下代码示例

XSingleServiceFactory service = UnoRuntime.queryInterface(XSingleServiceFactory.class,
        msf.createInstance("com.sun.star.sdb.DatabaseContext"));

Object datasourceObject = service.createInstance();
XNamingService namingService = UnoRuntime.queryInterface(XNamingService.class, service);

XDocumentDataSource datasource = UnoRuntime.queryInterface(XDocumentDataSource.class, datasourceObject);
XStorable store = (XStorable) UnoRuntime.queryInterface(XStorable.class, datasource.getDatabaseDocument());

XModel model = UnoRuntime.queryInterface(XModel.class, datasource.getDatabaseDocument());       

store.storeAsURL("file:///C:/tmp/1.odb", model.getArgs());

namingService.registerObject("NewDataSourceName", datasource);

XPropertySet datasourceProperties = UnoRuntime.queryInterface(XPropertySet.class, datasource);
csvPath = "C:/tmp/";
datasourceProperties.setPropertyValue("URL", "sdbc:flat:" + csvPath);

store.store();

执行此代码后,我在 C:/tmp/ 中有一个名为 1.odb 的文件

现在在 LibreOffice 中还注册了一个“NewDataSourceName”数据源。

问题是这个数据源没有使用同样位于 C:/tmp/ 的 .csv 文件。

发生这种情况是因为我的 java 程序使用以下设置保存了数据源

现在我可以选择第二个复选框(逗号分隔值-Dateien (*.csv) 并将字段分隔符从 "," 更改为 ";" 和 1.odb 将被正确配置。

我用谷歌搜索了很多,发现一些非 java 解决方案可以在创建数据源时设置设置,例如

::odbSource:Settings:setPropertyValue("Extension"        , "csv")
::odbSource:Settings:setPropertyValue("HeaderLine"       , TRUE)
::odbSource:Settings:setPropertyValue("FieldDelimiter"   , ";")
::odbSource:Settings:setPropertyValue("StringDelimiter"  , '"')
::odbSource:Settings:setPropertyValue("DecimalDelimiter" , ".")
::odbSource:Settings:setPropertyValue("ThousandDelimiter", "")

有人知道我如何在 java 中设置这些设置吗?

此致。

【问题讨论】:

【参考方案1】:

所以在多次阅读 LibreOffice API 之后,我找到了正确的方法。

它是如此简单,我仍然无法相信这对我有用。 这是相关行

XSingleServiceFactory service = UnoRuntime.queryInterface(XSingleServiceFactory.class,
                msf.createInstance("com.sun.star.sdb.DatabaseContext"));
Object datasourceObject = service.createInstance();
XDocumentDataSource datasourceDocument =
                UnoRuntime.queryInterface(XDocumentDataSource.class, datasourceObject);
XPropertySet datasourceProperties =
                UnoRuntime.queryInterface(XPropertySet.class, datasourceObject);
XPropertySet datasourceSettings =
                UnoRuntime.queryInterface(XPropertySet.class,
                datasourceProperties.getPropertyValue("Settings"));
datasourceSettings.setPropertyValue("Extension", "csv");
datasourceSettings.setPropertyValue("FieldDelimiter", ";");

现在我的 .odb 文件具有正确的设置,我可以进行邮件合并了。

【讨论】:

以上是关于创建 libreoffice 基于文本的数据源并使用 java 设置设置的主要内容,如果未能解决你的问题,请参考以下文章

LibreOffice UNO:设置样式(可以使用 Java、VB、Python、C++、任何使用 UNO API 的语言提供)

LibreOffice XForm:如何使用 javascript 宏读取表单数据

LibreOffice:使用 --convert-to 将 PDF 转换为纯文本

Libreoffice API (UNO):来自 xTextField 的文本和数据

Libreoffice API (UNO):需要更改用户的 xTextField 文本

CSV 帮助 |文本分隔符 |使用 LibreOffice