- 追加された行はこの色です。
- 削除された行はこの色です。
[[SCALAの記事一覧]]
*目次 [#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]
#areaedit
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
}
}
#areaedit(end)
-Sample.scala
#areaedit
SCALAは動的変数を使うことでブロック部分以外をカプセル化できる点がJavaより優れています。
--特徴
---自動的にファイルクローズする(Javaで困難な箇所)
---ブロック変数は宣言せずに$_で使えるようになっている
---複雑なインポートの宣言をimport WorkbookScala._だけで済ませている
import WorkbookScala._
object Sample{
def main(args: Array[String]): Unit = {
open(args(0)){
println($_.getSheet(0).getName())
}
}
}
#areaedit(end)
#areaedit
**確認の仕方 [#d862710d]
一般的には下記のとおりです。
***コマンドラインでコンパイルする場合 [#neab0acc]
scalac --classpath jarファイルのパス コンパイルしたい.scala
***実行は [#d3e9b77a]
scala --classpath jarファイルのパス コンパイルしたい.scala
scala --classpath jarファイルのパス 実行したい.scala
***引数 [#y99fc9ff]
Excel版 Scale版 どちらも引数にEXCELのファイルを必要とする。
たとえば c:\xxx\yyy.xslならば"c:\\xxx\\yyy.xsl"
を渡す
しかしながら、このサイトでは、バッチファイルでコンパイルを処理いたしますので、次のようになります。
しかしながら、このままだとインポートする際にファイルを用意しておかなくてはならないという手間がかかってしまいます。
そこで、Jarファイル化して共通のライブラリに格納しておき、自動的にJarファイルをクラスパスに格納する方法が必要となります。
インポートするJarファイルが増えてしまうと、scalaをお手軽なスクリプト言語としてつかう際に煩雑になってしまいます。
Jarファイル名をシンプルにとどめておきたいです。となるとパッケージ名を統一してまとめておきたいですし、インポート宣言は一つにしたいところです。
また、スクリプト中からはクラスのインスタンス作成の記述が抜けていても、記述ができるように、メソッドを用意するとよいでしょう。
***コンパイル [#u893b61b]
scalacc コンパイル対象.scala
***実行方法 [#x4e4765a]
scalaa 実行したい.scala
#areaedit(end)