*目次 [#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 excelFile = new File(path)
       var workbook = Workbook.getWorkbook(excelFile)
	   try {
	     out.withValue(workbook){block}
	     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){

}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS