ビルドパスの設定ぐらいは簡単にできる方
SCALAを実際につかってみて、どれだけ楽に記述できるようになったのか検証してみたいとおもいます。
http://sourceforge.net/projects/jexcelapi/files/
ダウンロードしてきたzip解凍 SCALAのをインストールディレクトリにlibディレクトリがあるとおもいますが
たとえば、scala.exeのある場所に起動用バッチを作成。ファイル名はscalaa.batとする。
今後jarファイルを取り込む数が増える可能性大でありながら、 Excelという業務で最も使われているであろうファイルにアクセスするjarファイルがデフォルトで入っていないのはけしからん、
とはいえ、毎回クラスパスを通すのは面倒である。というわけでバッチファイルから指定ディレクトリにある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
ダウンロードしてきたファイルを解凍するとtutorial.htmlがあるので、 それをみるといいとおもわれる。
Javaをつかった場合とScalaをつかった場合を比較してみよう
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(); } }
Java用につくられたExcelのWorkbookクラスを、そのままでも使えますが、 SCALAの特徴を生かしたobjectをつくります、ファイル名を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 } }
import WorkbookScala._ object Sample{ def main(args: Array[String]): Unit = { open(args(0)){ println($_.getSheet(0).getName()) } } }
一般的には下記のとおりです。
scalac --classpath jarファイルのパス コンパイルしたい.scala
scala --classpath jarファイルのパス 実行したい.scala
Excel版 Scale版 どちらも引数にEXCELのファイルを必要とする。 たとえば c:\xxx\yyy.xslならば"c:\\xxx\\yyy.xsl" を渡す
しかしながら、このサイトでは、バッチファイルでコンパイルを処理いたしますので、次のようになります。
しかしながら、このままだとインポートする際にファイルを用意しておかなくてはならないという手間がかかってしまいます。
そこで、Jarファイル化して共通のライブラリに格納しておき、自動的にJarファイルをクラスパスに格納する方法が必要となります。
インポートするJarファイルが増えてしまうと、scalaをお手軽なスクリプト言語としてつかう際に煩雑になってしまいます。
Jarファイル名をシンプルにとどめておきたいです。となるとパッケージ名を統一してまとめておきたいですし、インポート宣言は一つにしたいところです。
また、スクリプト中からはクラスのインスタンス作成の記述が抜けていても、記述ができるように、メソッドを用意するとよいでしょう。
scalacc コンパイル対象.scala
scalaa 実行したい.scala
たとえば、jarファイルで提供されているWorkbookクラスがあったとしよう。 利用開始時には、まあ、インポートの仕方のサンプルぐらいはわかるとはおもう。
でも、そこから先、クラス名は何が使えるようになったのか、クラスのメソッドは何があるのか 知る術がないと、開発力は落ちる。
だから、その一覧を取得する方法を得る必要がある。
コマンドプロンプトから