excelのパース

Excelをまとめて処理する必要があるので少しやり方を考えてみる。
どうやらJScriptWSHとして開くのが(自分には)楽そうに思えた。
ので、サンプルを書いてみた。
excel_test.jsとして拡張子を".js"として保存してBook1.xlsというファイルを
同じフォルダに放り込むとそれなりにうまく動く。


// カレントにあるBook1.xlsを開く。
a = openExcelFile('Book1.xls');
// 結果の表示
WScript.Echo(a);


/**
* フルパス取得
*/
function getFilePath(fileName){
var fso = new ActiveXObject("Scripting.FileSystemObject");
return fso.GetAbsolutePathName(fileName);
}

/**
* エクセルファイルを開くサンプル
*/
function openExcelFile(fileName){
var xl = new ActiveXObject("Excel.Application");
xl.Visible = true;
var xlFile = getFilePath(fileName);
WScript.Echo(xlFile);
var book = xl.Workbooks.Open(xlFile);
var str = "";
// 1枚目のワークシートの取得はこうやってやる
// (index)で取得する必要があるらしい:indexは1から始まる
var sheet = book.worksheets(1);
// 1枚目のワークシート名前の表示
str+= "sheet name is " + sheet.Name + "\n";
// ワークシートの枚数の取得
str+= "sheet counts is " + book.worksheets.Count + "\n";


// ワークシート名を順に表示する
// for in 文で動かしたい。
for(var i=1; i<=book.worksheets.Count; i++){
sheet = book.worksheets(i);
str += i + "枚目のシートの名前->" + sheet.Name + "\n";
// ワークシート内の行ごとのパーシング開始
var rows = sheet.UsedRange.Rows;
// あるワークシート内の
// rows.rowが記述開始行番号
// rows.row + rows.Count が記述終了行
for(var j=1; j<=rows.Count;j++){
str += rows.row + "行のデータ->";
// 列ごとのパーシング
//var cols = rows(j);
var cols = sheet.UsedRange.Rows(j);
for(var k=1; k<=sheet.UsedRange.Columns.Count;k++){
//WScript.Echo(book.worksheets(i).UsedRange.Rows(j).Columns(k).Value);
// 空白はnullを入れる
cell = typeof(cols.Columns(k).Value) == "undefined"? "null": cols.Columns(k).Value;
str += cell + " ";
}
str += "\n";
}
str += i + "枚目のシートの" + rows.Count + "行目には" + cols.Columns.Count +"個要素があるらしい\n";
}
book.Close;
xl.Exit;
xl.Quit();
return str;
}

セルの結合がある場合はどうやら一番左上の「若い番号」が有効になるらしい。
へぇ。