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

创建一个基于libreoffice文本的数据源,并使用java设置设置,java,csv,datasource,libreoffice,Java,Csv,Datasource,Libreoffice,我需要在Java中创建一个基于LibreOffice文本的数据源。我的需要是向用户提供一个.csv文件,其中包含一行标题和n个多值行。此csv文件是执行邮件合并作业的数据源。如果我使用LibreOffice向导手动创建用于创建新数据库的数据源,那么邮件合并作业的执行已经非常有效 在我的环境中,我无法为每个使用该应用程序的用户创建数据库 我已经能够创建一个新的数据源,并用下面的代码示例注册它 XSingleServiceFactory service = UnoRuntime.queryInter

我需要在Java中创建一个基于LibreOffice文本的数据源。我的需要是向用户提供一个.csv文件,其中包含一行标题和n个多值行。此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中设置这些设置吗


诚然。

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

这是如此简单,我仍然无法相信这对我来说是有效的。 这是相关的线路

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文件有了正确的设置,我可以进行邮件合并了