Excelのテーブル定義書を元に、Java Beansの元となるテキストを作成するJavaScriptを書きました。
14行目からのCELL objectの定義を少し修正すれば、汎用的に使えると思います。
行が結合されてたりすると、途端に破綻してしまいますが...。
/*
* Excelファイル読み込み
* テーブル定義書から必要な情報を取得し、classの元データを生成する
*/
/** Excelファイル */
var XLS_FILES = [
"3.1. テーブル定義\\テーブル定義書_1.xls",
:
"3.1. テーブル定義\\テーブル定義書_N.xls"
];
/** Cell位置定義 */
var CELL = {};
/** テーブル名 (物理名) */
CELL.TABLE_NAME_ROW = 8;
CELL.TABLE_NAME_COL = 1;
/** テーブル名 (正式名) */
CELL.TABLE_DESC_ROW = 8;
CELL.TABLE_DESC_COL = 12;
/** フィールド情報 開始位置定義 */
CELL.START_ROW = 10;
CELL.FIELD_NAME_COL = 4; //フィールド名
CELL.FIELD_TYPE_COL = 12; //種類
CELL.FIELD_DESC_COL = 18; //概要
/** テーブル定義 シート名 */
var SHEET_NAME = 'フィールド';
var fso = new ActiveXObject('Scripting.FileSystemObject');
/**
* Excelファイルを開く
*/
function readExcel(xlsFile){
//ファイル存在チェック
if( ! fso.FileExists(xlsFile) ){
return;
}
var xls = null;
var book = null;
var fields = [];
try{
//Excel起動
xls = new ActiveXObject('Excel.Application');
//Excelファイル open
book = xls.Workbooks.Open(xlsFile);
//シート指定
var sheet = book.WorkSheets(SHEET_NAME);
// sheet.Cells(row, col);
var tableName = sheet.Cells(CELL.TABLE_NAME_ROW, CELL.TABLE_NAME_COL).Value;
var tableDesc = sheet.Cells(CELL.TABLE_DESC_ROW, CELL.TABLE_DESC_COL).Value;
/*
table = {
name:
description:
}
*/
fields = [{ 'name':tableName, 'description':tableDesc }]; //1要素目はtable名
/*
field = {
name:
type:
length:
description:
}
*/
var reg = /\([0-9]+\)/;
var row = CELL.START_ROW;
while(1){
var c = sheet.Cells(row, CELL.FIELD_NAME_COL).Value;
if( c == null || c.length == 0){
//フィールド名定義がない→ループ終了
break;
}
//フィールド名
var name = c;
//種別
var type = sheet.Cells(row, CELL.FIELD_TYPE_COL).Value;
//長さ
var length = 0;
if( reg.test(type) ){
var m = type.match(reg).join('');
m = m.replace(/\(|\)/, '');
length = parseInt(m);
}
//概要
var desc = sheet.Cells(row, CELL.FIELD_DESC_COL).Value;
if( desc == null || desc.length == 0 ){
desc = '';
}
fields[fields.length] = {
'name':name,
'type':type,
'length':length,
'description': desc
};
row++;
}
}catch(e){
//例外発生 -> 無視
}finally{
try{
//Excelファイル close
book.Close();
}catch(e){}
try{
//Excel終了
xls.Quit(); //きちんとQuitしないとプロセスが残る
xls = null;
}catch(e){}
}
return fields;
}
/**
* アンダーバーを除去し、lowerCamelCaseに変換する
*/
function toLowerCamelCase(str){
var tmp = str.toLowerCase();
var arr = tmp.split('_');
var ret = arr[0];
for(var i=1; i<arr.length; i++){
ret += arr[i].charAt(0).toUpperCase() + arr[i].slice(1);
}
return ret;
}
/**
* アンダーバーを除去し、UpperCamelCaseに変換する
*/
function toUpperCamelCase(str){
var tmp = str.toLowerCase();
var arr = tmp.split('_');
var ret = '';
for(var i=0; i<arr.length; i++){
ret += arr[i].charAt(0).toUpperCase() + arr[i].slice(1);
}
return ret;
}
/** JavaDocコメント文字列 出力 */
function javadocString(msg){
return ['/**',msg,'*/'].join(' ');
}
/** DBMSタイプ→Java型に変換 */
function getType(t){
var ret = 'String';
if( /VARCHAR/i.test(t) ){
ret = 'String';
}else if( /NUMBER/i.test(t) ){
ret = 'int';
}else if( /DATE/i.test(t) ){
ret = 'String';
}
return ret;
}
(function(){
for( var i=0; i<XLS_FILES.length; i++ ){
//Excelファイル読み込み
var fields = readExcel(XLS_FILES[i]);
//1つめの要素はテーブル定義
var tableName = fields[0].name;
var tableDesc = fields[0].description;
//結果出力ファイル
var fileName = tableName + '_' + tableDesc + '.txt';
WScript.Echo(fileName);
//出力ファイルデータ
var dat = [];
dat[dat.length] = javadocString(tableDesc);
dat[dat.length] = 'final public static String TABLE_NAME = "' + tableName + '";';
dat[dat.length] = '';
//フィールド順の定義
for( var j=1; j<fields.length; j++ ){
dat[dat.length] = javadocString(fields[j].description);
dat[dat.length] = 'final public static int FIELD_' + fields[j].name.toUpperCase() + ' = ' + j + ';';
}
dat[dat.length] = '';
//フィールド変数
for( var j=1; j<fields.length; j++ ){
dat[dat.length] = javadocString(fields[j].description);
var type = getType(fields[j].type);
dat[dat.length] = ['private', type, fields[j].name.toLowerCase()].join(' ') + ';';
}
//ファイル出力
var f = fso.CreateTextFile(fileName, true);
f.WriteLine(dat.join(String.fromCharCode(13) + String.fromCharCode(10)));
f.Close();
}
})();
0 件のコメント:
コメントを投稿