Excelスプレッドシートの読み取りと書き込み

オープンソースコミュニティは、チャート作成ソフトウェアからゲームフレームワーク、ワードプロセッサに至るまで、多くのオープンソースJavaプロジェクトを作成してきました。この投稿では、MicrosoftExcelスプレッドシートを読み書きするためのオープンソースライブラリプロジェクトを紹介します。

スプレッドシートライブラリの推奨

Q:会社のJavaベースのスプレッドシートソフトウェアを拡張して、Excelスプレッドシートを読み書きするように依頼されました。このタスクに役立つオープンソースのJavaライブラリをお勧めできますか?

A: JExcelAPIを確認することをお勧めします。これは、Excelスプレッドシートの読み取り、書き込み、および変更を可能にする、成熟したJavaベースのオープンソースライブラリです。その多くの機能のいくつかを次に示します。

  • Excel 95、97、2000、XP、および2003ブックからデータを読み取ります
  • 数式の読み取りと書き込み(Excel 97以降のみ)
  • Excel2000形式でスプレッドシートを生成します
  • フォント、数値、および日付のフォーマットをサポートします
  • セルシェーディング、セル境界、およびセルカラーリングをサポートします
  • 既存のワークシートを変更します
  • チャートのコピーをサポート
  • スプレッドシートへの画像の挿入とコピーをサポートします

JExcelAPIはAndrewKahnによって開発され、GNU劣等一般公衆利用許諾契約書の下でリリースされました。

JExcelAPIライブラリのダウンロード

Q: JExcelAPIをダウンロードするにはどうすればよいですか?

A: JExcelAPIをダウンロードするには、次の手順を実行します。

  1. ブラウザでJExcelAPIのSourceForgeサイトにアクセスします。
  2. jexcelapiリンクをクリックします。
  3. 表示されたページで、フォルダリンクの1つをクリックします。たとえば、2.6.12リンクをクリックしました。
  4. 表示されたページで、配布アーカイブのファイル名をクリックします。たとえば、jexcelapi_2_6_12.zipリンクをクリックしました。
  5. 少し遅れて、ブラウザはこのファイルを保存するように促します。先に進み、ファイルを保存します。

ダウンロード後、このファイルをアーカイブ解除します。jexcelapiディレクトリ内のホームディレクトリを確認する必要がありjexcelapi_2_6_12ます。

JExcelAPIライブラリのデモンストレーション

Q: JExcelAPIライブラリにはデモが含まれていますか?

A: JExcelAPIのjexcelapiホームディレクトリには、jxl.jarスプレッドシートの読み取り、書き込み、およびコピーのデモを含むファイルが含まれています。

読み取りデモは、既存のスプレッドシートを読み取り、-csvor-xmlコマンドラインオプションを使用してコンマ区切り値(CSV)またはXML形式に変換します。次の例を検討してください。

java -jar jxl.jar -csv budget.xls java -jar jxl.jar -xml budget.xls

これらの例ではbudget.xls、その内容をCSVおよびXML形式で読み取り、標準出力に出力します。-csv-xml指定されていない場合を-csv想定します。

書き込みデモは、数式、境界線、画像などを含むサンプルスプレッドシートを作成します。このスプレッドシートは-write、以下に示すように、コマンドラインオプションを指定することによって生成されます。

java -jar jxl.jar -write sample.xls

図1は、結果のsample.xlsスプレッドシートの一部を示しています。

図1.LibreOfficeCalcを使用してsample.xlsスプレッドシートにアクセスしました

コピーデモjxlrwtest.xlsは、と同じディレクトリに保存されているサンプルスプレッドシートをjxl.jar新しいスプレッドシートにコピーします。結果のスプレッドシートでは、最初のシート(元のシート)は変更されていませんが、2番目のシート(変更された)には変更された値が含まれています。

このデモは、-rwコマンドラインオプションの後jxlrwtest.xlsに出力スプレッドシートの名前を指定して生成されます。次のコマンドラインについて考えてみます。

java -jar jxl.jar -rw jxlrwtest.xls copy.xls

このコマンドラインはにコピーjxlrwtest.xlscopy.xlsます。図2は、LibreOffice Calcの2番目の(変更された)シートを示しています。

図2.元のタブと変更されたタブをクリックして、元のシートと変更されたシートを表示します

コンパイルと実行のためのJExcelAPIを含む

Q:ソースコードをコンパイルしてアプリケーションを実行するときにJExcelAPIを含めるにはどうすればよいですか?

A:ソースコードをコンパイルしてアプリケーションを実行するときにJExcelAPIを含めるには、次のいずれかを実行します。

  • jexcelapiホームディレクトリのjxl.jarファイルをCLASSPATH環境変数に追加します。
  • Include jxl.jar via the javac and java program's -cp command-line option.

Programming with JExcelAPI

Q: How do I create Java programs that leverage JExcelAPI?

A: The jexcelapi home directory includes a tutorial.html file that presents a basic tutorial on programming with JExcelAPI. The tutorial shows you how to read, write, and copy spreadsheets. The tutorial also discusses formatting.

jexcelapi also includes a docs subdirectory, which provides access to extensive API documentation. Point your Web browser to this directory's index.html file and you can explore the types in this library's four documented packages:

  • jxl: the main package's types
  • jxl.demo: types for the various demos
  • jxl.format: types related to formatting
  • jxl.write: types for writing to a spreadsheet

Note that this list isn't exhaustive. Additional packages such as jxl.read are present but are not documented. To learn about additional packages, execute jar tvf jxl.jar and examine the package information in the resulting JAR listing.

To help you get started with JExcelAPI, I've created a simple JExcelAPIDemo application that demonstrates creating a new spreadsheet that is saved in output.xls and then reading and outputting the contents of this spreadsheet. Check out Listing 1.

Listing 1. Writing and reading a simple spreadsheet

import java.io.File; import java.io.IOException; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import jxl.write.Label; import jxl.write.Number; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; public class JExcelAPIDemo { public static void main(String[] args) throws BiffException, IOException, WriteException { WritableWorkbook wworkbook; wworkbook = Workbook.createWorkbook(new File("output.xls")); WritableSheet wsheet = wworkbook.createSheet("First Sheet", 0); Label label = new Label(0, 2, "A label record"); wsheet.addCell(label); Number number = new Number(3, 4, 3.1459); wsheet.addCell(number); wworkbook.write(); wworkbook.close(); Workbook workbook = Workbook.getWorkbook(new File("output.xls")); Sheet sheet = workbook.getSheet(0); Cell cell1 = sheet.getCell(0, 2); System.out.println(cell1.getContents()); Cell cell2 = sheet.getCell(3, 4); System.out.println(cell2.getContents()); workbook.close(); } }

Listing 1 first creates a writable workbook by invoking one of Workbook's factory methods. A writable sheet is then created for this workbook, and then a label and a number are added as the sheet's two cell values. The workbook is then written and closed.

Listing 1 continues by getting a workbook associated with output.xls and reading its contents. The getSheet() method provides access to the first sheet within this workbook. Its getCell() method is called to access the two cells, whose contents are then output.

Assuming that jxl.jar is located in the current directory, execute the following command to compile Listing 1:

javac -cp jxl.jar JExcelAPIDemo.java

Assuming success, execute the following command to run JExcelAPIDemo:

java -cp jxl.jar;. JExcelAPIDemo

You should observe the following output:

A label record 3.146

Figure 3 shows you output.xls in a LibreOffice context.

Figure 3. The solitary sheet displays two cell values

What's next?

次回は、Javaライブラリの進化に取り組む一連の謎解きを紹介します。これらの困惑者は、クライアントプログラムとこれらのプログラムが使用するライブラリ間のソースおよびバイナリコードの互換性に焦点を当てています。

ダウンロードソースをダウンロードこの投稿のアプリケーションのソースコードを取得します。JavaWorldのためにJeffFriesenによって作成されました

次のソフトウェアを使用して、投稿のコードを開発しました。

  • 64ビットJDK7u6
  • JExcelAPI 2.6.12

投稿のコードは、次のプラットフォームでテストされました。

  • 64ビットWindows7SP1上のJVM

このストーリー「Excelスプレッドシートの読み取りと書き込み」は、もともとJavaWorldによって公開されました。