2013年6月4日 星期二

用 Java 處理 Microsoft Excel (1):使用 JXL

因為要幫同事處理 Excel 檔,因此嘗試了使用 JXL 這個 Open Source Library [1] 來試試看。
目標是在別的地方找到了一串 key,要在 Excel 裡面把對應的 Row 刪除。

刪除的方法在 JXL 中必須要建立一個 WritableXXXXXX 的物件,才能夠做刪除的動作
但是 JXL 並沒有從現有的 Excel 取得 WritableWorkbook 的方法,因此只能用另一種間接的方法
即把現有的 Excel 複製出來變成另一個新的 Excel 檔,然後變成 WritableWorkbook。

範例程式碼如下:
public void removeRowInExcel (File excelFile, File newExcelFile) {
  Workbook workbook = null;
  WritableWorkbook wWorkbook = null;
  try {
    // Read the existing Excel file.
    workbook = Workbook.getWorkbook(excelFile);
    // Duplicate the existing Excel to the new created WritableWorkbook.
    wWorkbook = Workbook.createWorkbook(newExcelFile, workbook);
    wWorkbook.write();

    // Get the sheet from the Excel.
    System.out.println("\nRead sheet.");
    WritableSheet langSheet = wWorkbook.getSheet("lang");

    // Search rows in the sheet.
    for(int i=langSheet.getRows()-1 ; i>=0 ; i--) {
      Cell[] cells = langSheet.getRow(i);
      if(cells != null && cells.length > 0) {
        String keyName = cells[0].getContents();
        System.out.print("Get row " + keyName + "\t");
        if(keyName != null) {
          keyName = keyName.trim();
          // Remove the row if it is contained in the Map.
          if(keyMap.get(keyName) != null) {
            langSheet.removeRow(i);
            System.out.println("(Removed)");
          } else
            System.out.println();
        } else
          System.out.println();
      }
    }
    
    System.out.println("Update excel.");
    wWorkbook.write();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    try {
      if(wWorkbook != null) wWorkbook.close();
    } catch (Exception e) { e.printStackTrace(); }
    if(workbook != null) workbook.close();
  }
}

不過目前測試結果是...刪除不會出錯,但好像也沒有正確地把目標刪掉~
StackOverflow 也有找到有人問刪除不如預期的問題,然後目前沒看到完整的解決方法。
所以暫時先停在這,來試試看別的 Library。

續篇請參考「用 Java 處理 Microsoft Excel (2):使用 Apache Poi

參考資料:
1、Java Excel API - A Java API to read, write, and modify Excel spreadsheets
2、Modifying existing excel using jxl

沒有留言: