Java - 利用JODConverter轉換XLS to ODS

最近有針對Excel轉檔成OpenOffice的ODS格式進行處理,主要是使用JODConverter搭配

OpenOffice Service。在這邊就記錄一下在使用上的一些心得與注意的事項!

要使用JODConverter轉檔,除了現有的library外,還需搭配以下libs

commons-io-1.4.jar
jodconverter-2.2.2.jar
juh-3.0.1.jar
jurt-3.0.1.jar
ridl-3.0.1.jar
slf4j-api-1.5.6.jar
slf4j-jdk14-1.5.6.jar
unoil-3.0.1.jar
xstream-1.3.1.jar

另外,還需要啟用OpenOffice下的Service,在此使用的版本是4.4.1

在執行下面的指令時,建議可以將C:\Program Files (x86)\OpenOffice 4\program路徑加入

置環境變數內

啟用指令

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

終止指令 (for Windows)

tskill soffice

基本範例如下:

1. 啟用OpenOffice Service

2. Java範例程式如下
File inputFile = new File("TEST.xls");
     File outputFile = new File("TEST.ods");
     // connect to an OpenOffice.org instance running on port 8100
     OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);

     try {
         connection.connect();
         DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
         converter.convert(inputFile, outputFile);
     } catch(Exception e) {
         e.printStackTrace();
     } finally {
         if(connection.isConnected())connection.disconnect(); 
     }

範例很簡單,主要是透過DocumentConverter convert method將input file轉換成output file

API文件如下:

voidconvert(java.io.File inputFile, DocumentFormat inputFormat, java.io.File outputFile, DocumentFormat outputFormat)
          Convert a document.
 voidconvert(java.io.File inputDocument, java.io.File outputDocument)
          Convert a document.
 voidconvert(java.io.File inputDocument, java.io.File outputDocument, DocumentFormat outputFormat)
          Convert a document.
 voidconvert(java.io.InputStream inputStream, DocumentFormat inputFormat, java.io.OutputStream outputStream, DocumentFormat outputFormat)
          Convert a document.

在這邊,我們使用的是第二個convert,無需指定轉前的格式及轉出的格式,因為lib內會呼叫

相關method來猜測您input file及output file的副檔名、mimetype等。

請看source code : AbstractOpenOfficeDocumentConverter.java

圖一

由圖一可以得知,最後程式還是會去呼叫帶四個參數的convert method,在inputFormat及

outputFormat的部分是帶入null

圖二


在圖二的部分,當inputFormat、outputFormat為null時,會去呼叫guessDocumentFormat

method,並將檔案帶入。此時,會利用副檔名取得預設已註冊的DocumentFormat,也就是

預先定義好,也可以說是有支援的(DefaultDocumentFormatRegistry.java)。

可以自己動手試試,如下

DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();

DocumentFormat xls = formatReg.getFormatByFileExtension("xls");

但是,如果您指定的副檔名沒有支援的話(odf),呼叫getFormatByFileExtension會得到null

如此一來,當在執行時,仍透過下面這個呼叫方式進行,

converter.convert(inputFile, null, outputFile, null);

但是在guessDocumentFormat就會出現Exception!!



因此當您input的檔案JODConverter沒有定義的話,可以自行new DocumentFormat,如odf格式

DocumentFormat odf = new DocumentFormat("OpenDocument Math", DocumentFamily.TEXT, "application/vnd.oasis.opendocument.formula", "odf");

總結

1. mimeType可以至官網查詢

2. 圖中的片段程式來自於該網站

3. 若inputFile格式JODConverter預設沒定義的話(如odf),可以自行定義DocumentFormat

4. 若xls轉換成ods後,要開啟檔案請先停用OpenOffice Service

留言