DDL生成ツール
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
*目次 [#dfe6fb13]
#contents
*趣旨 [#k7123aef]
DDLをEXCELから生成するツール
よさそうなページがあったので改造してみました。
要するに、データを格納する器を作成するツール。
参考にしたページではデータベースに対応した、いわゆるDDL生...
自分は、この生成ツールの生成箇所を、プラグインのように切...
このことにより、Daoなどデータを格納する器をエクセルから生...
*参考にしたページ [#ze6c62e7]
http://members.ld.infoseek.co.jp/mokano1/ExcelDocToDDL.htm
*作り方 [#b29b1f82]
**コンパイル例 [#d0ec1959]
自分はEclipseで編集して手作業でコンパイルしています。
理由は、意識して.classファイルを作りたいからです。
***手順1 [#d55fa7a7]
jxl.jar
を参考ページを参考にして、とってきます。
でjxl.jarを
c:\javalib
フォルダを作製して保存しておきます。
***手順2 [#c9c45302]
Eclipseで編集しており、作業中のフォルダに.javaコードが古...
DOSプロンプトで、下記のようにローカルにコンパイルしたいフ...
copy C:\pleiades\workspace\prjExcelArg\src\*.java .
***手順3 [#t853cec5]
次に、今回フレームワークチックに切り出した部分、つまり、...
javac -encoding UTF-8 -cp .;c:\javalib\jxl.jar ExcelDoc...
***手順4 [#r56e7b5c]
切り替えたい部品の箇所をコンパイル
参考にしたページに掲載されていたコードから、部品化できそ...
javac -encoding UTF-8 -cp .;c:\javalib\jxl.jar DDL.java
***実行手順 [#f3a436c0]
引数 ExcelDocTo は、使いまわしする本体で実行するmainメソ...
引数 DDL は、生成担当しているクラスで、切り替えが可能で...
引数 ExcelDocTest.xls は、参考にしたページにあるエクセル...
書式は自分の作ったプラグイン、下記で申しますとDDLに対応し...
java -cp .;c:\javalib\jxl.jar ExcelDocTo DDL ExcelDocTes...
*ソースコード [#ta7d5668]
若干、整理する箇所はのこっておりますが、(不要なインポー...
まあ、動くので掲載しておきます。
**DDL [#h4149304]
プラグインに相当します。参考にした分解前のクラス名にDDLと...
分離したという意味でDDLにしました。
import java.io.FileOutputStream;
import java.util.Vector;
import jxl.Sheet;
public class DDL extends ExcelDocTo implements IParseShe...
/** テーブル名の桁(A桁が1でC桁) */
public static final int table_nm_keta =3;
/** テーブル名の行(1行目が1で2行目) */
public static final int table_nm_gyo =2;
/** 項目の開始行=5行目から */
public static final int str_komoku_gyo =5;
/** 項目の番号の桁(A桁が1) */
public static final int bango_keta =1;
/** 項目の項目名の桁(A桁が1) */
public static final int komoku_keta =2;
/** 項目の型の桁(A桁が1) */
public static final int kata_keta =3;
/** 項目の桁数の桁(A桁が1) */
public static final int ketasu_keta =4;
/** 項目の主キーの桁(A桁が1) */
public static final int key_keta =5;
/** 項目のNOT NULLの桁(A桁が1) */
public static final int notnull_keta =6;
/**
* 1シート読み込み、テーブル作成のDDLを書き出します...
* @param sh 書き出し対象となるシート
* @param out_folder (指定がある場合)出力先のフォルダ
* @return 0 正常終了
* その他 エラー
*/
public int makeFile(Sheet sh,String out_folder) throws ...
{
//==========================//
// 引数のチェック //
//==========================//
// 引数チェック
if ( sh == null )
return -1;
if ( out_folder == null )
out_folder = "";
//==========================//
// テーブル名を取得し出力ファイルOPEN //
//==========================//
// テーブル名の取得
String tbl_name = getCell(sh,table_nm_gyo,table_nm_ket...
// テーブル名の取得
if ( tbl_name == null )
return -1;
if ( tbl_name.equals("") == true)
return -1;
// 出力ファイル名の作成
String fpath = "";
if ( out_folder.equals("") == true)
{
fpath = tbl_name + ".DDL";
}
else if ( out_folder.endsWith("\\") == true )
{
fpath = out_folder + tbl_name + ".DDL";
}
else
{
fpath = out_folder + "\\" + tbl_name + ".DDL";
}
// ファイルオープン
FileOutputStream fout = new FileOutputStream(fpath);
//==========================//
// テーブルのはじめの部分書き出し //
//==========================//
// テーブル名の部分の書き出し
fout.write("CREATE TABLE ".getBytes());
fout.write(tbl_name.getBytes());
fout.write(" ( \r\n".getBytes());
//==========================//
// レコードの部分の書き出し //
//==========================//
// レコード部分の作業領域 初期化
Vector key_list = new Vector();
for( int gyo = str_komoku_gyo; gyo <= sh.getRows();gyo...
{
// 開始行でなかったら、,と改行を書く
if ( gyo != str_komoku_gyo)
{
fout.write(",\r\n".getBytes());
}
// 項目の値を取得
String komoku = getCell(sh,gyo,komoku_keta);
String kata = getCell(sh,gyo,kata_keta);
String ketasu = getCell(sh,gyo,ketasu_keta);
String key = getCell(sh,gyo,key_keta);
String notnull = getCell(sh,gyo,notnull_keta);
// 大文字にしておく
kata = kata.toUpperCase();
notnull = notnull.toUpperCase().replaceAll(" ","");
// 桁数に設定があれば、()を付ける
ketasu = ketasu.replaceAll(" ",""); // 空白カット
if ( ketasu.equals("") == false)
{
ketasu = "(" + ketasu + ")";
}
// キーだったら、キーのリストにいれておく
key = key.replaceAll(" ","");
if ( key.equals("") == false)
{
int key_pos = Integer.parseInt(key);
// 項目が足りないとき、追加
while(key_list.size() < key_pos)
{
key_list.add(null);
}
// セット
key_list.setElementAt(komoku,key_pos-1);
}
// NOT NULL を書き換え
if ( notnull.equals("YES") == true )
notnull = " NOT NULL ";
else
notnull = "";
// 書き出し
String rec = " " + komoku + " "+ kata + ketasu + " " ...
fout.write(rec.getBytes());
}
//==========================//
// テーブルの終わりの部分の書き出し //
//==========================//
// プライマリーキーの書き出し
if ( key_list.size() > 0 )
{
fout.write(",\r\n PRIMARY KEY".getBytes());
for(int i = 0,j = 0 ; i < key_list.size() ; i ++ )
{
if ( key_list.elementAt(i) == null )
continue;
// 項目の前の,または(を書く
if ( j == 0 ) // はじめのレコード
fout.write("(".getBytes());
else
fout.write(",".getBytes());
j++;
// 項目を書く
fout.write(((String)key_list.elementAt(i)).getBytes(...
}
fout.write(")".getBytes());
}
// 終わり部分の書き出し
fout.write("\r\n);\r\n".getBytes());
//==========================//
// あとしまつ //
//==========================//
// ファイルクローズ
fout.close();
return 0;
}
}
**IParseSheet [#a64f3889]
import jxl.Sheet;
public interface IParseSheet {
public int makeFile(Sheet sh,String out_folder) throws E...
}
**ExcelDocTo.java [#i3f51beb]
/**
*
* Excelテーブル仕様書からテーブル作成<P>
*
* 内容:Excelでかかれた(フォーマットの決まってい...
* 自動的に生成します。
*
* @author ウィリアムのいたずら
*/
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
/**
*
* Excelテーブル仕様書からテーブル作成クラス<P>
*
*/
public class ExcelDocTo {
/**
* ExcelからDDL作成メインメソッド。<p>
* このメソッドは、一般的なもので、makeDDLを呼び出すと...
* 1シート1ファイル形式の書き出しに流用できます。<br>
*
* @param args 起動時の引数<BR>
* 第一引数が、対象Excelファイル(必須)、第二引数が...
* @throws ClassNotFoundException
*/
public static void main(String[] args)
{
//==========================//
// 引数のチェックと取得 //
//==========================//
// 引数チェック
if ( args.length < 2 )
{
System.out.println("エラー:引数が足りません 必要な...
System.out.println("書式:java ExcelDocTo プラグイン ...
return;
}
// 引数の取得
String classname = args[0];
String in_fname = args[1];
IParseSheet parser;
try {
ClassLoader bootstrap = ExcelDocTo.class.getClassLoad...
Class parserClass= bootstrap.loadClass(classname);
parser = (IParseSheet)parserClass.newInstance();
} catch (Exception e) {
System.out.println("---");
e.printStackTrace();
throw new RuntimeException(e);
}
String out_folder = "";
if ( args.length >= 3 )
{
out_folder = args[2];
}
//==========================//
// 対象シート全体を取得する //
//==========================//
// Excelブックをオープンする
Workbook wk = getWorkbook(in_fname);
if ( wk == null )
{
System.out.println("エラー:ブックがない パス:"+in_...
return;
}
// シート名を取得する
String[] sheetNameList = getAllSheetName(wk);
if ( sheetNameList == null )
{
System.out.println("エラー:シートがない パス:"+in_...
return;
}
//==========================//
// シートごとに読み込み、出力 //
//==========================//
for(int i = 0 ; i < sheetNameList.length ; i ++)
{
Sheet sh = getSheet(sheetNameList[i],wk);
try
{
parser.makeFile(sh,out_folder);
}
catch(Exception e)
{
e.printStackTrace();
continue;
}
}
//==========================//
// あとしまつ //
//==========================//
wk.close();
System.out.println("normal:正常に終了しました。");
}
public static String sjis(String str){
try {
return URLEncoder.encode(str,"sjis");//"utf-8"
} catch (UnsupportedEncodingException e) {
// TODO
e.printStackTrace();
return "";
}
}
//----------------------------------------------//
// ここから先は、Excelからデータをとってくるための...
//----------------------------------------------//
/**
* 指定されたExcelファイルのワークブックを取得しま...
* @param bookPath ワークブックのファイルパス
* @return nullのときエラー、それ以外のときWorkbookのク...
*/
public static Workbook getWorkbook(String bookPath)
{
if ( bookPath == null )
{
return null;
}
try
{
return Workbook.getWorkbook(new File(bookPat...
}
catch(Exception e)
{
return null;
}
}
/**
* シートを取得します。<p>
* ちなみに、sheet(1)のような取得方法をしたい場合は、ge...
* 配列を使って、こいつをよびだしてください。ブックのす...
* @param sheetName シート名
* @param workbook シートがあるワークブック
* @return nullのときエラー、それ以外のとき、シートのク...
*/
public static Sheet getSheet(String sheetName,Workbook ...
{
if ( ( sheetName== null ) || ( workbook == null ) )
{
return null;
}
try
{
return workbook.getSheet(sheetName);
}
catch(Exception e)
{
return null;
}
}
/**
* ブックに含まれているすべてのシート名を取得します。<p>
* 同時に、この返り値の配列の大きさによって、ブック数が...
* @param workbook 対象となるワークブック
* @return ワークブックの中に入っているシート名(配列...
*/
public static String[] getAllSheetName(Workbook workbook)
{
if ( workbook == null )
{
return null;
}
try
{
return workbook.getSheetNames();
}
catch(Exception e)
{
return null;
}
}
/**
* シートからセルを読み込みます。<p>
* 注意:行と列の指定が、VBAと同じようにしてあります。
* つまり、行、列の順で、1から始まります(A桁が1、1...
* sheet.getCellは、列、行の順で0から始まるので、その...
*
* @param sheet 対象となるシート
* @param gyo 行、1からはじまる
* @param keta 桁を、数字表現したもの。1からはじまる(...
* @return セルの値(数字項目でも何でも、テキストで)
* セルが範囲外、エラーのときはnull(範囲内で何も入力さ...
*/
public static String getCell(Sheet sheet,int gyo,int ke...
{
//------------------------------//
// エラーチェック //
//------------------------------//
if ( ( keta < 1 ) || ( gyo < 1 ) )
{
return null;
}
if ( sheet == null )
{
return null;
}
try
{
//------------------------------//
// データを読み込み、返す //
//------------------------------//
Cell cell = sheet.getCell(keta -1, gyo - 1);
if ( cell == null )
{
return null;
}
return cell.getContents();
}
catch(Exception e)
{
return null;
}
}
}
*プラグイン作製例 [#gf323824]
DDLという名前でプラグインとして、コードを用意しているで、...
**参考URL [#h440252e]
入力に使うサンプルのエクセルシートは下記からダウンロード...
http://members.ld.infoseek.co.jp/mokano1/index_ExcelJava....
**ソース [#s0ebea5c]
***INS.java [#pafa4174]
import java.io.FileOutputStream;
import java.util.Vector;
import jxl.Sheet;
public class INS extends ExcelDocTo implements IParseShe...
/** テーブル名の桁(A桁が1でC桁) */
public static final int table_nm_keta =3;
/** テーブル名の行(1行目が1で2行目) */
public static final int table_nm_gyo =2;
/** 項目の開始行=5行目から */
public static final int str_komoku_gyo =5;
/** 項目の番号の桁(A桁が1) */
public static final int bango_keta =1;
/** 項目の項目名の桁(A桁が1) */
public static final int komoku_keta =2;
/** 項目の型の桁(A桁が1) */
public static final int kata_keta =3;
/** 項目の桁数の桁(A桁が1) */
public static final int ketasu_keta =4;
/** 項目の主キーの桁(A桁が1) */
public static final int key_keta =5;
/** 項目のNOT NULLの桁(A桁が1) */
public static final int notnull_keta =6;
/** 件数が書いてある行=4行目 */
public static final int kensu_gyo =4;
/** データ開始の桁(A桁が1) */
public static final int str_data_keta =10;
//----------------------------------------------//
// ここからは、今回作成するDDLのためのメソッド //
//----------------------------------------------//
/**
* 1シート読み込み、1テーブル分のinsert文を書き出しま...
* @param sh 書き出し対象となるシート
* @param out_folder (指定がある場合)出力先のフォルダ
* @return 0 正常終了
* その他 エラー
*/
public int makeFile(Sheet sh,String out_folder) throws ...
{
//==========================//
// 引数のチェック //
//==========================//
// 引数チェック
if ( sh == null )
return -1;
if ( out_folder == null )
out_folder = "";
//==========================//
// テーブル名を取得し出力ファイルOPEN //
//==========================//
// テーブル名の取得
String tbl_name = getCell(sh,table_nm_gyo,table_nm_ket...
// テーブル名の取得
if ( tbl_name == null )
return -1;
if ( tbl_name.equals("") == true)
return -1;
// 出力ファイル名の作成
String fpath = "";
if ( out_folder.equals("") == true)
{
fpath = tbl_name + ".sql";
}
else if ( out_folder.endsWith("\\") == true )
{
fpath = out_folder + tbl_name + ".sql";
}
else
{
fpath = out_folder + "\\" + tbl_name + ".sql";
}
// ファイルオープン
FileOutputStream fout = new FileOutputStream(fpath);
//==========================//
// レコードの部分の書き出し //
//==========================//
for(int keta = str_data_keta;keta <= sh.getColumns();k...
{
// データを入れておくVectorを作成
Vector data_vec = new Vector();
// データのチェック
for( int gyo = str_komoku_gyo; gyo <= sh.getRows();gy...
{
// 項目の値を取得
String komoku = getCell(sh,gyo,komoku_keta);
String kata = getCell(sh,gyo,kata_keta);
String ketasu = getCell(sh,gyo,ketasu_keta);
String testVal = getCell(sh,gyo,keta);
// テストデータになにもない項目は、セットしない
if ( testVal == null )
continue;
if ( testVal.trim().equals("") == true)
continue;
// 大文字にしておく
kata = kata.toUpperCase();
// データを保存する
String[] rec = new String[4];
rec[0] = komoku;
rec[1] = kata;
rec[2] = ketasu;
rec[3] = testVal;
data_vec.add(rec);
}
// テストデータがなければ、Insertしない
if ( data_vec.size() <= 0 )
continue;
// Inset文の書き出し
// はじめの部分書き出し
fout.write("INSERT INTO ".getBytes());
fout.write(tbl_name.getBytes());
fout.write(" ( ".getBytes());
// 項目の部分書き出し
for(int i = 0 ; i < data_vec.size() ; i++)
{
if ( i != 0 )
{
fout.write(",".getBytes());
}
String[] rec = (String[])data_vec.elementAt(i);
fout.write(rec[0].getBytes());
}
fout.write(" ) VALUES ( ".getBytes());
// 値の書き出し
for(int i = 0 ; i < data_vec.size() ; i++)
{
if ( i != 0 )
{
fout.write(",".getBytes());
}
String[] rec = (String[])data_vec.elementAt(i);
if ( rec[1].indexOf("CHAR") == -1 )
{
fout.write(rec[3].getBytes());
}
else
{
fout.write("'".getBytes());
fout.write(rec[3].getBytes());
fout.write("'".getBytes());
}
}
// おわりの部分
fout.write(" );\r\n".getBytes());
}
//==========================//
// あとしまつ //
//==========================//
// ファイルクローズ
fout.close();
return 0;
}
}
***コンパイル方法 [#q814a09e]
例を示します。
javac -encoding UTF-8 -cp .;c:\javalib\jxl.jar INS.java
***実行方法 [#a3890747]
例を示します。
java -cp .;c:\javalib\jxl.jar ExcelDocTo INS ExcelDocTes...
最初に用意してあったDDLクラスをINSに置き換えただけです。
終了行:
*目次 [#dfe6fb13]
#contents
*趣旨 [#k7123aef]
DDLをEXCELから生成するツール
よさそうなページがあったので改造してみました。
要するに、データを格納する器を作成するツール。
参考にしたページではデータベースに対応した、いわゆるDDL生...
自分は、この生成ツールの生成箇所を、プラグインのように切...
このことにより、Daoなどデータを格納する器をエクセルから生...
*参考にしたページ [#ze6c62e7]
http://members.ld.infoseek.co.jp/mokano1/ExcelDocToDDL.htm
*作り方 [#b29b1f82]
**コンパイル例 [#d0ec1959]
自分はEclipseで編集して手作業でコンパイルしています。
理由は、意識して.classファイルを作りたいからです。
***手順1 [#d55fa7a7]
jxl.jar
を参考ページを参考にして、とってきます。
でjxl.jarを
c:\javalib
フォルダを作製して保存しておきます。
***手順2 [#c9c45302]
Eclipseで編集しており、作業中のフォルダに.javaコードが古...
DOSプロンプトで、下記のようにローカルにコンパイルしたいフ...
copy C:\pleiades\workspace\prjExcelArg\src\*.java .
***手順3 [#t853cec5]
次に、今回フレームワークチックに切り出した部分、つまり、...
javac -encoding UTF-8 -cp .;c:\javalib\jxl.jar ExcelDoc...
***手順4 [#r56e7b5c]
切り替えたい部品の箇所をコンパイル
参考にしたページに掲載されていたコードから、部品化できそ...
javac -encoding UTF-8 -cp .;c:\javalib\jxl.jar DDL.java
***実行手順 [#f3a436c0]
引数 ExcelDocTo は、使いまわしする本体で実行するmainメソ...
引数 DDL は、生成担当しているクラスで、切り替えが可能で...
引数 ExcelDocTest.xls は、参考にしたページにあるエクセル...
書式は自分の作ったプラグイン、下記で申しますとDDLに対応し...
java -cp .;c:\javalib\jxl.jar ExcelDocTo DDL ExcelDocTes...
*ソースコード [#ta7d5668]
若干、整理する箇所はのこっておりますが、(不要なインポー...
まあ、動くので掲載しておきます。
**DDL [#h4149304]
プラグインに相当します。参考にした分解前のクラス名にDDLと...
分離したという意味でDDLにしました。
import java.io.FileOutputStream;
import java.util.Vector;
import jxl.Sheet;
public class DDL extends ExcelDocTo implements IParseShe...
/** テーブル名の桁(A桁が1でC桁) */
public static final int table_nm_keta =3;
/** テーブル名の行(1行目が1で2行目) */
public static final int table_nm_gyo =2;
/** 項目の開始行=5行目から */
public static final int str_komoku_gyo =5;
/** 項目の番号の桁(A桁が1) */
public static final int bango_keta =1;
/** 項目の項目名の桁(A桁が1) */
public static final int komoku_keta =2;
/** 項目の型の桁(A桁が1) */
public static final int kata_keta =3;
/** 項目の桁数の桁(A桁が1) */
public static final int ketasu_keta =4;
/** 項目の主キーの桁(A桁が1) */
public static final int key_keta =5;
/** 項目のNOT NULLの桁(A桁が1) */
public static final int notnull_keta =6;
/**
* 1シート読み込み、テーブル作成のDDLを書き出します...
* @param sh 書き出し対象となるシート
* @param out_folder (指定がある場合)出力先のフォルダ
* @return 0 正常終了
* その他 エラー
*/
public int makeFile(Sheet sh,String out_folder) throws ...
{
//==========================//
// 引数のチェック //
//==========================//
// 引数チェック
if ( sh == null )
return -1;
if ( out_folder == null )
out_folder = "";
//==========================//
// テーブル名を取得し出力ファイルOPEN //
//==========================//
// テーブル名の取得
String tbl_name = getCell(sh,table_nm_gyo,table_nm_ket...
// テーブル名の取得
if ( tbl_name == null )
return -1;
if ( tbl_name.equals("") == true)
return -1;
// 出力ファイル名の作成
String fpath = "";
if ( out_folder.equals("") == true)
{
fpath = tbl_name + ".DDL";
}
else if ( out_folder.endsWith("\\") == true )
{
fpath = out_folder + tbl_name + ".DDL";
}
else
{
fpath = out_folder + "\\" + tbl_name + ".DDL";
}
// ファイルオープン
FileOutputStream fout = new FileOutputStream(fpath);
//==========================//
// テーブルのはじめの部分書き出し //
//==========================//
// テーブル名の部分の書き出し
fout.write("CREATE TABLE ".getBytes());
fout.write(tbl_name.getBytes());
fout.write(" ( \r\n".getBytes());
//==========================//
// レコードの部分の書き出し //
//==========================//
// レコード部分の作業領域 初期化
Vector key_list = new Vector();
for( int gyo = str_komoku_gyo; gyo <= sh.getRows();gyo...
{
// 開始行でなかったら、,と改行を書く
if ( gyo != str_komoku_gyo)
{
fout.write(",\r\n".getBytes());
}
// 項目の値を取得
String komoku = getCell(sh,gyo,komoku_keta);
String kata = getCell(sh,gyo,kata_keta);
String ketasu = getCell(sh,gyo,ketasu_keta);
String key = getCell(sh,gyo,key_keta);
String notnull = getCell(sh,gyo,notnull_keta);
// 大文字にしておく
kata = kata.toUpperCase();
notnull = notnull.toUpperCase().replaceAll(" ","");
// 桁数に設定があれば、()を付ける
ketasu = ketasu.replaceAll(" ",""); // 空白カット
if ( ketasu.equals("") == false)
{
ketasu = "(" + ketasu + ")";
}
// キーだったら、キーのリストにいれておく
key = key.replaceAll(" ","");
if ( key.equals("") == false)
{
int key_pos = Integer.parseInt(key);
// 項目が足りないとき、追加
while(key_list.size() < key_pos)
{
key_list.add(null);
}
// セット
key_list.setElementAt(komoku,key_pos-1);
}
// NOT NULL を書き換え
if ( notnull.equals("YES") == true )
notnull = " NOT NULL ";
else
notnull = "";
// 書き出し
String rec = " " + komoku + " "+ kata + ketasu + " " ...
fout.write(rec.getBytes());
}
//==========================//
// テーブルの終わりの部分の書き出し //
//==========================//
// プライマリーキーの書き出し
if ( key_list.size() > 0 )
{
fout.write(",\r\n PRIMARY KEY".getBytes());
for(int i = 0,j = 0 ; i < key_list.size() ; i ++ )
{
if ( key_list.elementAt(i) == null )
continue;
// 項目の前の,または(を書く
if ( j == 0 ) // はじめのレコード
fout.write("(".getBytes());
else
fout.write(",".getBytes());
j++;
// 項目を書く
fout.write(((String)key_list.elementAt(i)).getBytes(...
}
fout.write(")".getBytes());
}
// 終わり部分の書き出し
fout.write("\r\n);\r\n".getBytes());
//==========================//
// あとしまつ //
//==========================//
// ファイルクローズ
fout.close();
return 0;
}
}
**IParseSheet [#a64f3889]
import jxl.Sheet;
public interface IParseSheet {
public int makeFile(Sheet sh,String out_folder) throws E...
}
**ExcelDocTo.java [#i3f51beb]
/**
*
* Excelテーブル仕様書からテーブル作成<P>
*
* 内容:Excelでかかれた(フォーマットの決まってい...
* 自動的に生成します。
*
* @author ウィリアムのいたずら
*/
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
/**
*
* Excelテーブル仕様書からテーブル作成クラス<P>
*
*/
public class ExcelDocTo {
/**
* ExcelからDDL作成メインメソッド。<p>
* このメソッドは、一般的なもので、makeDDLを呼び出すと...
* 1シート1ファイル形式の書き出しに流用できます。<br>
*
* @param args 起動時の引数<BR>
* 第一引数が、対象Excelファイル(必須)、第二引数が...
* @throws ClassNotFoundException
*/
public static void main(String[] args)
{
//==========================//
// 引数のチェックと取得 //
//==========================//
// 引数チェック
if ( args.length < 2 )
{
System.out.println("エラー:引数が足りません 必要な...
System.out.println("書式:java ExcelDocTo プラグイン ...
return;
}
// 引数の取得
String classname = args[0];
String in_fname = args[1];
IParseSheet parser;
try {
ClassLoader bootstrap = ExcelDocTo.class.getClassLoad...
Class parserClass= bootstrap.loadClass(classname);
parser = (IParseSheet)parserClass.newInstance();
} catch (Exception e) {
System.out.println("---");
e.printStackTrace();
throw new RuntimeException(e);
}
String out_folder = "";
if ( args.length >= 3 )
{
out_folder = args[2];
}
//==========================//
// 対象シート全体を取得する //
//==========================//
// Excelブックをオープンする
Workbook wk = getWorkbook(in_fname);
if ( wk == null )
{
System.out.println("エラー:ブックがない パス:"+in_...
return;
}
// シート名を取得する
String[] sheetNameList = getAllSheetName(wk);
if ( sheetNameList == null )
{
System.out.println("エラー:シートがない パス:"+in_...
return;
}
//==========================//
// シートごとに読み込み、出力 //
//==========================//
for(int i = 0 ; i < sheetNameList.length ; i ++)
{
Sheet sh = getSheet(sheetNameList[i],wk);
try
{
parser.makeFile(sh,out_folder);
}
catch(Exception e)
{
e.printStackTrace();
continue;
}
}
//==========================//
// あとしまつ //
//==========================//
wk.close();
System.out.println("normal:正常に終了しました。");
}
public static String sjis(String str){
try {
return URLEncoder.encode(str,"sjis");//"utf-8"
} catch (UnsupportedEncodingException e) {
// TODO
e.printStackTrace();
return "";
}
}
//----------------------------------------------//
// ここから先は、Excelからデータをとってくるための...
//----------------------------------------------//
/**
* 指定されたExcelファイルのワークブックを取得しま...
* @param bookPath ワークブックのファイルパス
* @return nullのときエラー、それ以外のときWorkbookのク...
*/
public static Workbook getWorkbook(String bookPath)
{
if ( bookPath == null )
{
return null;
}
try
{
return Workbook.getWorkbook(new File(bookPat...
}
catch(Exception e)
{
return null;
}
}
/**
* シートを取得します。<p>
* ちなみに、sheet(1)のような取得方法をしたい場合は、ge...
* 配列を使って、こいつをよびだしてください。ブックのす...
* @param sheetName シート名
* @param workbook シートがあるワークブック
* @return nullのときエラー、それ以外のとき、シートのク...
*/
public static Sheet getSheet(String sheetName,Workbook ...
{
if ( ( sheetName== null ) || ( workbook == null ) )
{
return null;
}
try
{
return workbook.getSheet(sheetName);
}
catch(Exception e)
{
return null;
}
}
/**
* ブックに含まれているすべてのシート名を取得します。<p>
* 同時に、この返り値の配列の大きさによって、ブック数が...
* @param workbook 対象となるワークブック
* @return ワークブックの中に入っているシート名(配列...
*/
public static String[] getAllSheetName(Workbook workbook)
{
if ( workbook == null )
{
return null;
}
try
{
return workbook.getSheetNames();
}
catch(Exception e)
{
return null;
}
}
/**
* シートからセルを読み込みます。<p>
* 注意:行と列の指定が、VBAと同じようにしてあります。
* つまり、行、列の順で、1から始まります(A桁が1、1...
* sheet.getCellは、列、行の順で0から始まるので、その...
*
* @param sheet 対象となるシート
* @param gyo 行、1からはじまる
* @param keta 桁を、数字表現したもの。1からはじまる(...
* @return セルの値(数字項目でも何でも、テキストで)
* セルが範囲外、エラーのときはnull(範囲内で何も入力さ...
*/
public static String getCell(Sheet sheet,int gyo,int ke...
{
//------------------------------//
// エラーチェック //
//------------------------------//
if ( ( keta < 1 ) || ( gyo < 1 ) )
{
return null;
}
if ( sheet == null )
{
return null;
}
try
{
//------------------------------//
// データを読み込み、返す //
//------------------------------//
Cell cell = sheet.getCell(keta -1, gyo - 1);
if ( cell == null )
{
return null;
}
return cell.getContents();
}
catch(Exception e)
{
return null;
}
}
}
*プラグイン作製例 [#gf323824]
DDLという名前でプラグインとして、コードを用意しているで、...
**参考URL [#h440252e]
入力に使うサンプルのエクセルシートは下記からダウンロード...
http://members.ld.infoseek.co.jp/mokano1/index_ExcelJava....
**ソース [#s0ebea5c]
***INS.java [#pafa4174]
import java.io.FileOutputStream;
import java.util.Vector;
import jxl.Sheet;
public class INS extends ExcelDocTo implements IParseShe...
/** テーブル名の桁(A桁が1でC桁) */
public static final int table_nm_keta =3;
/** テーブル名の行(1行目が1で2行目) */
public static final int table_nm_gyo =2;
/** 項目の開始行=5行目から */
public static final int str_komoku_gyo =5;
/** 項目の番号の桁(A桁が1) */
public static final int bango_keta =1;
/** 項目の項目名の桁(A桁が1) */
public static final int komoku_keta =2;
/** 項目の型の桁(A桁が1) */
public static final int kata_keta =3;
/** 項目の桁数の桁(A桁が1) */
public static final int ketasu_keta =4;
/** 項目の主キーの桁(A桁が1) */
public static final int key_keta =5;
/** 項目のNOT NULLの桁(A桁が1) */
public static final int notnull_keta =6;
/** 件数が書いてある行=4行目 */
public static final int kensu_gyo =4;
/** データ開始の桁(A桁が1) */
public static final int str_data_keta =10;
//----------------------------------------------//
// ここからは、今回作成するDDLのためのメソッド //
//----------------------------------------------//
/**
* 1シート読み込み、1テーブル分のinsert文を書き出しま...
* @param sh 書き出し対象となるシート
* @param out_folder (指定がある場合)出力先のフォルダ
* @return 0 正常終了
* その他 エラー
*/
public int makeFile(Sheet sh,String out_folder) throws ...
{
//==========================//
// 引数のチェック //
//==========================//
// 引数チェック
if ( sh == null )
return -1;
if ( out_folder == null )
out_folder = "";
//==========================//
// テーブル名を取得し出力ファイルOPEN //
//==========================//
// テーブル名の取得
String tbl_name = getCell(sh,table_nm_gyo,table_nm_ket...
// テーブル名の取得
if ( tbl_name == null )
return -1;
if ( tbl_name.equals("") == true)
return -1;
// 出力ファイル名の作成
String fpath = "";
if ( out_folder.equals("") == true)
{
fpath = tbl_name + ".sql";
}
else if ( out_folder.endsWith("\\") == true )
{
fpath = out_folder + tbl_name + ".sql";
}
else
{
fpath = out_folder + "\\" + tbl_name + ".sql";
}
// ファイルオープン
FileOutputStream fout = new FileOutputStream(fpath);
//==========================//
// レコードの部分の書き出し //
//==========================//
for(int keta = str_data_keta;keta <= sh.getColumns();k...
{
// データを入れておくVectorを作成
Vector data_vec = new Vector();
// データのチェック
for( int gyo = str_komoku_gyo; gyo <= sh.getRows();gy...
{
// 項目の値を取得
String komoku = getCell(sh,gyo,komoku_keta);
String kata = getCell(sh,gyo,kata_keta);
String ketasu = getCell(sh,gyo,ketasu_keta);
String testVal = getCell(sh,gyo,keta);
// テストデータになにもない項目は、セットしない
if ( testVal == null )
continue;
if ( testVal.trim().equals("") == true)
continue;
// 大文字にしておく
kata = kata.toUpperCase();
// データを保存する
String[] rec = new String[4];
rec[0] = komoku;
rec[1] = kata;
rec[2] = ketasu;
rec[3] = testVal;
data_vec.add(rec);
}
// テストデータがなければ、Insertしない
if ( data_vec.size() <= 0 )
continue;
// Inset文の書き出し
// はじめの部分書き出し
fout.write("INSERT INTO ".getBytes());
fout.write(tbl_name.getBytes());
fout.write(" ( ".getBytes());
// 項目の部分書き出し
for(int i = 0 ; i < data_vec.size() ; i++)
{
if ( i != 0 )
{
fout.write(",".getBytes());
}
String[] rec = (String[])data_vec.elementAt(i);
fout.write(rec[0].getBytes());
}
fout.write(" ) VALUES ( ".getBytes());
// 値の書き出し
for(int i = 0 ; i < data_vec.size() ; i++)
{
if ( i != 0 )
{
fout.write(",".getBytes());
}
String[] rec = (String[])data_vec.elementAt(i);
if ( rec[1].indexOf("CHAR") == -1 )
{
fout.write(rec[3].getBytes());
}
else
{
fout.write("'".getBytes());
fout.write(rec[3].getBytes());
fout.write("'".getBytes());
}
}
// おわりの部分
fout.write(" );\r\n".getBytes());
}
//==========================//
// あとしまつ //
//==========================//
// ファイルクローズ
fout.close();
return 0;
}
}
***コンパイル方法 [#q814a09e]
例を示します。
javac -encoding UTF-8 -cp .;c:\javalib\jxl.jar INS.java
***実行方法 [#a3890747]
例を示します。
java -cp .;c:\javalib\jxl.jar ExcelDocTo INS ExcelDocTes...
最初に用意してあったDDLクラスをINSに置き換えただけです。
ページ名: