JavaでJXLライブラリでExcelを扱う

JavaでJXLライブラリでExcelを扱う

JXLライブラリの開発が止まっているようですが、このライブラリを使う機会があったので使ってみました。

ファイル読み込み

jxl.WorkbookクラスのgetWorkBookメソッドを使用してxlsファイル読み込みむことが出来ます。

package jp.co.confrage;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.read.biff.BiffException;

public class JxlTest {
  public static void main(String[] args) {
    Workbook workbook = null;
    try {
      workbook = Workbook.getWorkbook(new File("C:\\tmp\\sample.xls"));
    } catch (BiffException | IOException e) {
      e.printStackTrace();
    } finally {
      if (workbook != null) {
        workbook.close();
      }
    }
  }
}

xlsファイルは読み込みできますが、xlsxファイルを読み込むとエラーとなります。

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:221)
    at jxl.Workbook.getWorkbook(Workbook.java:198)
    at jp.co.confrage.JxlTest.main(JxlTest.java:13)

wikiに以下記載があります。xlsxはサポートしていません。

Java Excel API - Wikipedia

JXL API (a.k.a. Java Excel API) allows users to read, write, create, and modify sheets in an Excel(.xls) workbook at runtime. It doesn’t support .xlsx format.

ファイル書き込み

jxl.WorkbookクラスのcreateWorkBookメソッドを使用してxlsファイル読み込みむことが出来ます。

createSheetメソッドで最低でも一つシートを作成する必要があります。

最後にwriteメソッドでExcelが出力されます。

package jp.co.confrage;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class JxlTest {
  public static void main(String[] args) {
  WritableWorkbook workbook = null;
    try {
      workbook = Workbook.createWorkbook(new File("C:\\tmp\\sample2.xls"));
      WritableSheet sheet = workbook.createSheet("sample", 0);
      workbook.write();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (workbook != null) {
        try {
          workbook.close();
        } catch (WriteException | IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

読み込んだファイルから書き込み

テンプレートファイルみたいなxlsを用意しておいて、そのxlsからファイルを書き込みます。

sample.xlsからout.xlsを出力してみます。

package jp.co.confrage;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class JxlTest {
  public static void main(String[] args) {
    WritableWorkbook workbook = null;
    Workbook workbookTmp = null;
    try {
      workbookTmp = Workbook.getWorkbook(new File("C:\\tmp\\sample.xls"));
      workbook = Workbook.createWorkbook(new File("C:\\tmp\\out.xls"), workbookTmp);
      workbook.write();
    } catch (BiffException | IOException e) {
      e.printStackTrace();
    } finally {
      if (workbook != null) {
        try {
          workbook.close();
        } catch (WriteException | IOException e) {
            e.printStackTrace();
        }
      }
    }
  }
}

名前の定義

名前の定義を設定します。

jxl.write.WritableWorkbookクラスのaddNameAreaメソッドを使用します。

引数
第一 定義する名前
第二 シートオブジェクト
第三 先頭のColumn位置
第四 先頭のRow位置
第五 末尾のColumn位置
第六 末尾のRow位置
package jp.co.confrage;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class JxlTest {
  public static void main(String[] args) {
    WritableWorkbook workbook = null;
    Workbook workbookTmp = null;
    try {
      workbookTmp = Workbook.getWorkbook(new File("C:\\tmp\\sample.xls"));
      workbook = Workbook.createWorkbook(new File("C:\\tmp\\out.xls"), workbookTmp);
      WritableSheet sheet = workbook.getSheet("Sheet1");  // シート名指定
      workbook.addNameArea("hoge", sheet, 0, 0, 0, 6);    // 名前の定義設定
      workbook.write();
    } catch (BiffException | IOException e) {
      e.printStackTrace();
    } finally {
      if (workbook != null) {
        try {
          workbook.close();
        } catch (WriteException | IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

「数式」ー「名前の管理」から指定したセル範囲の名前が定義されていることが確認が出来ます。

JavaでJExcelライブラリでExcelを扱う

名前の定義を利用したドロップダウンリスト

ドロップダウンリストのセルを設定します。

package jp.co.confrage;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Blank;
import jxl.write.WritableCellFeatures;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class JxlTest {
  public static void main(String[] args) {
    WritableWorkbook workbook = null;
    Workbook workbookTmp = null;
    try {
      workbookTmp = Workbook.getWorkbook(new File("C:\\tmp\\sample.xls"));
      workbook = Workbook.createWorkbook(new File("C:\\tmp\\out.xls"), workbookTmp);
      WritableSheet sheet = workbook.getSheet("Sheet1");  // シート名指定
      String name = "hoge";
      workbook.addNameArea(name, sheet, 0, 0, 0, 6);      // 名前の定義設定
      WritableCellFeatures wcf = new WritableCellFeatures();
      wcf.setDataValidationRange(name);
      Blank blank = new Blank(2, 1); // C2セル
      blank.setCellFeatures(wcf);
      sheet.addCell(blank);
      workbook.write();
    } catch (BiffException | IOException | WriteException e ) {
      e.printStackTrace();
    } finally {
      if (workbook != null) {
        try {
          workbook.close();
        } catch (WriteException | IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

WritableCellFeaturesクラスを使用します。これでC2セルにドロップダウンリストを表示されます。但しOffice2016でExcelを開くと入力規則は効くのですが、ドロップダウンリストが上手く表示されませんでした。

JavaでJXLライブラリでExcelを扱う

セルに値をセット

セルに値をセットします。

jxl.write.Labelクラスをnewします。コンストラクタの引数は以下の通りです。

引数
第一 Column位置
第二 Row位置
第三 セルにセットする値

WritableSheetクラスのaddCellメソッドでコンストラクタにLabelのインスタンスを渡します。

これでセルの値セットが出来ます。

package jp.co.confrage;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class JxlTest {
  public static void main(String[] args) {
    WritableWorkbook workbook = null;
    Workbook workbookTmp = null;
    try {
      workbookTmp = Workbook.getWorkbook(new File("C:\\tmp\\sample.xls"));
      workbook = Workbook.createWorkbook(new File("C:\\tmp\\out.xls"), workbookTmp);

      WritableSheet sheet = workbook.getSheet(0);
      Label label = new Label(1, 2, "ABCD");
      sheet.addCell(label);
      workbook.write();
    } catch (BiffException | IOException | WriteException e) {
      e.printStackTrace();
    } finally {
      if (workbook != null) {
        try {
          workbook.close();
        } catch (WriteException | IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

Warning: Text Object on sheet “シート名” not supported – omitting

シートにオブジェクトが存在すると、「Warning: Text Object on sheet “シート名” not supported – omitting」という警告が出ます。

オブジェクトのコピーはサポートされていないという警告で除外されるようです。

JavaDoc

http://jexcelapi.sourceforge.net/resources/javadocs/current/docs/index.html

ダウンロード

以下でダウンロードできます。

jxl « j « Jar File Download
jxl « j « Jar File Download
JExcelApi
JExcelApi Open-Source Project

Mavenは以下です。※2011年05月

Just a moment...

コメント

タイトルとURLをコピーしました