[[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

***引数 [#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)


#areaedit
*沸き上がる疑問 [#i1739e66]
たとえば、jarファイルで提供されているWorkbookクラスがあったとしよう。
利用開始時には、まあ、インポートの仕方のサンプルぐらいはわかるとはおもう。

でも、そこから先、クラス名は何が使えるようになったのか、クラスのメソッドは何があるのか
知る術がないと、開発力は落ちる。

だから、その一覧を取得する方法を得る必要がある。


コマンドプロンプトから
#areaedit(end)
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS