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はサポートしていません。
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(); } } } } }
「数式」ー「名前の管理」から指定したセル範囲の名前が定義されていることが確認が出来ます。
名前の定義を利用したドロップダウンリスト
ドロップダウンリストのセルを設定します。
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を開くと入力規則は効くのですが、ドロップダウンリストが上手く表示されませんでした。
セルに値をセット
セルに値をセットします。
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
ダウンロード
以下でダウンロードできます。
Mavenは以下です。※2011年05月
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント