*目次 [#f6f871c7] #contents *対象読者 [#v1b80415] ビルドパスの設定ぐらいは簡単にできる方 *SCALAをつかってExcelを扱う [#q379a6fe] SCALAを実際につかってみて、どれだけ楽に記述できるようになったのか検証してみたいとおもいます。 *Java Excel API [#me7def6d] -http://jexcelapi.sourceforge.net/ **Download [#z1c51a49] http://sourceforge.net/projects/jexcelapi/files/ **インストールというかjarファイルのコピー [#b79cf4a7] ダウンロードしてきたzip解凍 SCALAのをインストールディレクトリにlibディレクトリがあるとおもいますが -そこに放り込むか -userフォルダを作成します。 **scala起動用の下バッチファイルをパスの通った場所に設置 [#j63fffe0] たとえば、scala.exeのある場所に起動用バッチを作成。ファイル名はscalaa.batとする。 今後jarファイルを取り込む数が増える可能性大でありながら、 Excelという業務で最も使われているであろうファイルにアクセスするjarファイルがデフォルトで入っていないのはけしからん、 とはいえ、毎回クラスパスを通すのは面倒である。というわけでバッチファイルから指定ディレクトリにあるjarファイルは有無をいわさずクラスパスに追加する ***scalaa.batの例 [#v338e19a] --説明 BASEが2回出てきているが、どちらも自動的にJarファイルを読み込みたいフォルダである。 下記の例のように追加したいフォルダの数だけ繰り返し記述するとよいでしょう。 @echo off setlocal ENABLEDELAYEDEXPANSION set CP=. set BASE=C:\scala\lib for %%f in (%BASE%\*) do set CP=!CP!;%%f set BASE=C:\scala\lib\user for %%f in (%BASE%\*) do set CP=!CP!;%%f SET SCALA_DOC_HOME="C:\scala\doc" ECHO %CP% scala -classpath %CP% %1 **チュートリアル [#ya413957] ダウンロードしてきたファイルを解凍するとtutorial.htmlがあるので、 それをみるといいとおもわれる。 **Java Excel API 日本語での紹介サイト [#uf4640ed] ***Java Excel API(読み込み機能) [#a3b50f93] ---http://www.emxas.co.jp/itblog/category_35/item_133.html ***Java Excel API(書き込み機能(1)) [#n2fdd81f] ---http://www.emxas.co.jp/itblog/category_35/item_151.html ***Java Excel API(書き込み機能(2)) [#y4349ece] ---http://www.emxas.co.jp/itblog/category_35/item_172.html *Sheetの名前を出力してみる [#afc1ab76] Javaをつかった場合とScalaをつかった場合を比較してみよう **Javaをつかった場合 [#e40eec5f] import java.io.File; import java.io.IOException; import jxl.Workbook; import jxl.read.biff.BiffException; public class Main { public static void main(String[] args) throws BiffException, IOException { File excelFile = new File(args[0]); Workbook workbook = Workbook.getWorkbook(excelFile); System.out.println(workbook.getSheet(0).getName()); workbook.close(); } } **SCALAの特徴を使った場合 [#g6e7bb6a] Java用につくられたExcelのWorkbookクラスを、そのままでも使えますが、 SCALAの特徴を生かしたobjectをつくります、ファイル名をWorkbookScala.scala とでもしましょうか。 -WorkbookScala.scala import java.io.File import java.io.IOException import jxl.Workbook import jxl.read.biff.BiffException import scala.util.DynamicVariable object WorkbookScala{ val dynamicvariable= new DynamicVariable[Workbook](null) //自動的にcloseするopen def open (path:String)(block : => Unit){ var excelFile = new File(path) var workbook = Workbook.getWorkbook(excelFile) try { dynamicvariable.withValue(workbook){block} } finally { workbook.close(); } } //自動的に設定されるブロック変数のようなもの def $_()={ dynamicvariable.value } } -Sample.scala SCALAは動的変数を使うことでブロック部分以外をカプセル化できる点がJavaより優れています。 --特徴 ---自動的にファイルクローズする(Javaで困難な箇所) ---ブロック変数は宣言せずに$_で使えるようになっている ---複雑なインポートの宣言をimport WorkbookScala._だけで済ませている import WorkbookScala._ object Sample{ def main(args: Array[String]): Unit = { open(args(0)){ println($_.getSheet(0).getName()) } } } **確認の仕方 [#d862710d] ***コマンドラインでコンパイルする場合 [#neab0acc] scalac --classpath jarファイルのパス コンパイルしたい.scala ***実行は [#d3e9b77a] scala --classpath jarファイルのパス コンパイルしたい.scala ***引数 [#y99fc9ff] Excel版 Scale版 どちらも引数にEXCELのファイルを必要とする。 たとえば c:\xxx\yyy.xslならば"c:\\xxx\\yyy.xsl" を渡す *SCALAの動的メソッドをつかったら便利になるか確かめてみる [#ed546188] def 動的関数名(引数)(動的変数 => Unit){ }