Eclipse + Maven で Apache POI を用いてExcelファイルを出力する環境の構築(HelloWorldまで)

Apache POI を用いることで、javaでExcelファイルを出力するプログラムを作成することができるようになります。
今回は、環境設定を行い、HelloWorldを試す所まで記事にしました。
ライブラリを落としてきたりパスの設定をするのに手間がかかるので、今回は Eclipse + Maven で設定を行っています。

【Mavenプロジェクトの作成】

1.Eclipseを立ち上げ、ファイル > 新規 > Mavenプロジェクト を選択。

2.「シンプルなプロジェクトの作成」「デフォルト・ワークスペース・ロケーションの使用」にチェックを入れて次に進む。

3.グループIdに任意の名前(プロジェクトを一意に識別する名前)、アーティファクトIdにプロジェクト名を入力し、完了を押下する。

4.作成されたプロジェクトについて、JREシステム・ライブラリー > プロパティー を選択。

5.適切な実行環境を設定(今回は「JavaSE-1.8」を選択)

【ライブラリのインストール・設定】

1.作成されたプロジェクトに存在するpom.xmlを開き、下記のように入力する。


<project xmlns=”http://maven.apache.org/POM/4.0.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
  <modelVersion>4.0.0</modelVersion>
  <groupId>hoge</groupId>
  <artifactId>ProjectName</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>4.1.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.1.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>4.1.2</version>
    </dependency>
  </dependencies>
</project>



dependenciesタグを自分で追記する。

dependencyタグ内の記述については、自分で調べる場合はMVNrepositoryで調べる。ライブラリ名で検索すると、dependencyタグの記述する内容が記載されているページにたどり着く。

2.pom.xmlを保存すると、dependencyタグに記載されたライブラリが自動的にインストール・設定される。

【Excelファイルを出力】

1.src/main/java 直下で右クリックし、新規 > クラス を選択。その後、クラス名(今回は「POITestMain」)を入力し、クラスを生成する。

2.下記のようにソースを記述する。

3.クラスを実行すると、ソース内で記述したパスに下記のような内容のファイルが生成される。


実行時にjava.lang.NoClassDefFoundErrorが出る可能性があります(私の環境では出ました)。
その場合は、Eclipseを一度落とし、C:\Users\ユーザ名\.m2 にある repository フォルダを削除し、もう一度Eclipseを立ち上げ、プロジェクトで右クリック > 実行 > Maven Clean を実施し、pom.xmlをもう一度保存し直したりしてみて下さい。
良く起こる事象のようで、「Maven NoClassDefFoundError」でWebで検索すると色々情報が出てきます。


いかがでしたでしょうか?

Apache POIはよく使われているライブラリのようで、Webで検索すると色々と情報が見つかりますが、導入するまでの所で意外とつまずくポイントが少なくないと感じたので、今回の記事を執筆しました。
個人的に、新しい技術を学ぶ時には、「概要の理解→導入→できる限りシンプルなコードで動作確認(多くの場合はHelloWorld)」という流れを大事にしています。
(動いて終わりではなく、なぜ動いたのかを自分で調べて理解することが大事です)
ここまでできれば、詳しい使い方を調べてコードを付け加えていくことで、実務にも耐え得る成果物を作ることができるからです。

これからも、技術を導入する際に役に立つ記事を書いていきたいと思います!

java:walkFileTreeメソッドの使い方

walkFileTreeメソッドとは、ディレクトリ構造を再帰的に走査するメソッドです。
Java7で追加されたFilesクラスが提供するメソッドの一つであり、比較的新しいメソッドです。
(このメソッドの提供により、ディレクトリ構造については自力でCompositeパターンを組む必要がなくなりました)

walkFileTreeメソッドの引数は2つあり、1つ目は起点となるパス、2つ目はFileVisitorインターフェースです。
FileVisitorインターフェースにはディレクトリ構造を走査した際の処理が定義されており、FileVisitorインターフェースを利用者が実装することでディレクトリ走査時の具体的な処理内容を記述可能になります。

以下、サンプルコードです。
詳しい使い方はWebを調べると出てきますので、必要に応じて調べてみると良いでしょう。

【サンプルコード】

・FileVisitorTest.java

・WalkFileTreeTestMain.java

【テスト用ディレクトリ構造】

【実行結果】


いかがでしたでしょうか?

Java7がリリースされてからもう10年近く経ちますが、Javaを昔に勉強した人だとJava7(やJava8)の知識が抜けていることが意外と少なくないと思います。
しかし、Java7では、今回紹介したwalkFileTreeメソッドのように便利なFilesクラスが提供されています。
勉強し直すのは面倒かもしれませんが、新機能を使うことによりコードを簡潔に、かつ安全にすることができるので、勉強する価値はあると思います。

これからも、JavaやC#等で提供されている便利な文法を紹介していきたいと思います!

java:並行開発を行うためのテクニック

何も考えずにクラス分割を行いクラス毎に開発者を割り当てると、未完成のクラスを取り込むことができず、他のクラスが完成するのを待つ必要が出てきてしまいます。
今回は、他のクラスが完成するのを待たずに並行開発するテクニックを、javaの例を用いて説明します。


下記は何も考えずにクラス分割した場合の例です。
HelloProductクラスを取り込みたいのですが、HelloProductクラスが完成していないため、コンパイルができず、HelloProductクラスが完成するまで実行確認を行うことができません。

【サンプルコード】

・HelloMain.java(新規)

【実行結果】


そこで、Interfaceを用いる手があります。
Interfaceの下に、最終的に取り込みたいクラス(HelloProductクラス)と、実行確認時に暫定的に取り込むクラス(HelloTestクラス)を定義することで、最終的に取り込みたいクラスの完成を待たずに、実行確認時に暫定的に取り込むクラスを用いてテストが可能になります。
下記は、暫定的にクラスを取りこんで実行確認を行う例です。

【サンプルコード】

・HelloMain.java(修正)

・HelloInterface.java(新規)

・HelloTest.java(新規)

【実行結果】


そして、最終的に取り込みたいクラスが完成したら、newの箇所を変更することでそのクラスの取り込みが可能になります。

【サンプルコード】

・HelloMain.java(修正)

・HelloProduct.java(新規)

【実行結果】


以上のようにInterfaceの機能を用いて並行開発を行うのは、実際の開発でもよく使われる手段です。

補足すると、この手段は若干古典的な手段となります。
より発展的な手段としては、DI(Dependecy Injection)という手段があり、SpringFramework等のフレームワークの機能を用いることで容易に実現することが可能になります。
DIは、newの箇所(上記のサンプルコードで「 = new HelloTest();」や「 = new HelloProduct();」としていた箇所)の定義を何かしらの方法で不要とすることで、ソースコードを変更することなく取り込むクラスを変更できるようにする、という手段です。
SpringFrameworkでは、特定のアノテーションをソースコードに付与することで、取り込むクラスをxmlファイルで指定することが可能になります。上記のサンプルコードの例で言うと、HelloTestクラスを取り込むのかHelloProductクラスを取り込むのかをxmlファイルに定義することが可能になります。

DIについてはこの記事では詳しく触れませんが、現在の開発ではDIが使われることも多く、書籍やWebの文献も豊富です。
実際に使おうと思った時に実装方法がわからずに困る、ということは少ないでしょう。


いかがでしたでしょうか?

実際に多人数で開発していると、全てのソースコードが完成しないとコンパイルできないというのはかなり不便で、スケジュールにも影響してきます。
多人数で開発する場合は、今回の記事のようにInterface、フレームワークを使用しているならDIの機能を使用すると良いでしょう。

javaの記事が続いてきましたが、今後はC#の記事も書いていきたいと思っています。
ではまた次回!

java:WEBからHTMLファイルを取得するサンプルプログラム

HTML形式のログを定期的に取得しているのですが、その時に使用しているサンプルプログラムを公開します。
Javaの実行環境が整っているWindowsOSで、LogGet.java と LogGet.bat を同じディレクトリに置き、LogGet.bat を実行すると、「html」フォルダが出来上がりそこにHTMLファイルが格納されます。
取得するHTMLファイルのURL、及びHTMLファイルのローカルでのファイル名は、LogGet.java を修正して変更します。
HTMLファイルの文字コードは「EUC-JP」を前提としていますので、他の文字コードが使用されている場合は LogGet.java の「EUC-JP」の箇所を適宜修正してください。

【サンプルコード】

・LogGet.java

・LogGet.bat


いかがでしたでしょうか。

定期的にHTMLファイルを取得する機会があったので、javaでプログラムを作ってみました。
複雑なWebページを取得するには不向きですが、単純なHTMLで書かれたページを定期的に取得する時に便利だと思います。

便利な機能を見つけたら、また紹介したいと思います!

javaでのCommandパターン

Commandパターンとはデザインパターンの一種で、1つ1つのコマンド(命令)をそのままオブジェクトとして表現するパターンです。
コマンドをオブジェクトとして表現することで、コマンドの管理(追加・削除・実行)が可能になるというメリットがあります。

今回は、ファイルやフォルダを作成するコマンドを管理するサンプルコードを作成してみました。
Commandクラスが1つ1つのコマンドを表し、コマンドの管理はInvokerクラスで行い、コマンドの実際の処理はReceiverクラスで記述します。

【サンプルコード】

・Command.java

・ConcreteCommandForOperation.java

・ConcreteCommandForTemporary.java

・Receiver.java

・ConcreteReceiverMkfil.java

・ConcreteReceiverMkdir.java

・Invoker.java

・CommandMain.java

【実行結果】

・コンソール出力

・ファイルやフォルダの生成確認


いかがでしたでしょうか。

デザインパターンに出てくる設計は、自力ではなかなか思いつかない勉強しがいがあるものが少なくないと思います。
「コマンドをオブジェクトとして表現することで、管理(追加・削除・実行)を可能とする」というCommandパターンの発想も、その一つなのではないかと思います。

ここしばらくの間はデザインパターンの紹介を行ってきましたが、一旦一区切りつけたいと思います。
次週からはまた別の観点で役に立つ記事を発信して行きたいと思いますので、今後もよろしくお願いします!