ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

JavaアプリでmySQLのデータを取ってきてOpenOffice Calc(表計算)に書く

2007-02-08 15:54:42 | OpenOffice

 日本語についてまで考えると、まだまだやんないといけないことありそうだけど、
 とりあえず、今の段階で、書いておきます。

 mySQLから、JDBC経由でデータをとってきて、それをOpenOffice Calcに書き出す、Javaプログラムです。



■仕様

 現在、mySQLのDB名testの中に、userテーブルがあり、以下のように
 データが入っている。

このとき、1桁1レコードで、
  項目名=値
の形で、以下のように、OpenOfficeCalcに書き出す

Javaアプリプログラムを作成する




■事前準備

(1)まず、mySQLをインストールして、userテーブルを作成し、データを入れます。

 といって、どーやるの(>_<!)という場合は、

JavaでHello World > JDBC(MySQL)編
http://www.hellohiro.com/jdbcmysql.htm


 を参考にしてくださいませ

(2)JDBCドライバをとってきて、それを、Eclipseで、プロジェクトのパスに通します。
 JDBCドライバも上記の「JavaでHello World > JDBC(MySQL)編」に書いてあるので、それをとってきて、クラスパスをとおしてね(^^)

(3)OpenOfficeのjarをEclipseのパスに通します
 ここの1に書いてあるOpenOfficeのjarをクラスパスにとおしてね。

(4)mySQLを起動します
 mysqld --default-character-set=sjis
 で起動します。

(5)OpenOfficeを起動します
 "C:¥Program Files¥OpenOffice.org 2.1¥program¥soffice.exe" "-accept=socket,port=8100;urp;"
(¥は、本当は半角)みたいなかんじ




■ソース

 前に書いたSample01.java,OpenOffice.java,Calc.javaの一部を修正します。

●Sample01.java
プログラムは以下のとおり
/**
 * サンプルプログラム
 * 参考にしたサイト
 * http://www.okapiproject.com/java/java_tools/openoffice/
 *                          developer/openoffice_program1.htm
 * (本当は1行です。長いので、きりました)
 * 
 */
import com.sun.star.lang.*;
import com.sun.star.bridge.*;
import com.sun.star.uno.*;
import com.sun.star.frame.*;

import com.sun.star.sheet.*;
import com.sun.star.container.XIndexAccess;
import com.sun.star.table.*;
import com.sun.star.beans.PropertyValue;

import java.sql.*;
import java.util.*;

/**
 * OpenOffice.org の表計算(Calc)に「Hello World」と出力する。
 */
public class Sample01 {

    /**
     * 起動パラメータなし。
     * @param args String
     */
    public static void main(final String[] args)
    {
      	OpenOffice of = null;
        Calc	cl = null;

		//======================================//
		//	OpenOfficeと接続		//
		//======================================//
        XMultiServiceFactory xMSF = null;
        try
        {
        	of = new OpenOffice();
        	xMSF	=	of.connect();

        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("OpenOfficeの起動に失敗");
        }

		//======================================//
		//Calc を起動				//
		//======================================//
        XSpreadsheetDocument myDoc = null;
        try
        {
	        cl = new Calc(xMSF);
   	    	myDoc	=	cl.open("private:factory/scalc","_blank");
        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("表計算の起動に失敗");
        }


		//======================================//
		//シートを取得				//
		//======================================//
        XSpreadsheet oSheet = null;
        try
        {
			oSheet = cl.getSheetByPosition(myDoc,0);
        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("シートの取得に失敗");
        }

		//======================================//
		//DB接続				//
		//======================================//
	    Vector allData = new Vector();	//データをここに入れておく
   		try 
   		{
			// ドライバクラスをロード
      		Class.forName("org.gjt.mm.mysql.Driver");

      		// データベースへ接続
      		String url =
		 "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=sjis";
      		Connection con =
		 DriverManager.getConnection(url,"root","rootのパスワード");

		    // ステートメントオブジェクトを生成
      		Statement stmt = con.createStatement();
      		String sql = "SELECT * FROM user";

      		// クエリーを実行して結果セットを取得
		    ResultSet rs = stmt.executeQuery(sql);
      		ResultSetMetaData meta = rs.getMetaData();
      
      		// 検索された行数分ループ
      		while(rs.next())
      		{
   				HashMap mp = new HashMap();
      			for(int i = 1 ; i <= meta.getColumnCount(); i ++ )
      			{
      				mp.put(meta.getColumnName(i),
					rs.getString(meta.getColumnName(i)) );
      			}
   				allData.add(mp);		
      		}

		    // データベースから切断
      		stmt.close();
      		con.close();
		}
		catch (java.lang.Exception e)
		{
      		e.printStackTrace();
    	}
      
		//======================================//
		//	セルに書き出し			//
		//======================================//
        XCell oCell = null;
        try
        {
	     	for(int i = 0 ; i < allData.size() ; i ++ )
      		{
      			HashMap mp = (HashMap)allData.elementAt(i);
      			String[] key = (String[]) mp.keySet().toArray(new String[0]);
      			for(int j = 0 ; j < key.length ; j ++ )
      			{
		        	     oCell = cl.getCell(oSheet,i,j);
            		     oCell.setFormula(key[j] + "=" + (String)mp.get(key[j]));
      			}
      		}
        }
        catch (java.lang.Exception e)
        {
            e.printStackTrace();
            System.out.println("セル書き出しで失敗");
        }

        //処理終了
        System.exit(0);
    }
}

(上記< > ¥は、本当は半角)

 前に書いたSample01.javaとは、DB接続が追加され、セル書き出しが一部違います。
なお、
String url =
  "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=sjis";
ですが、localhostにホスト名、testにDB名が入ります。

また
Connection con =
  DriverManager.getConnection(url,"root","rootのパスワード");
は、rootにユーザー名が、"rootのパスワード"にパスワードが入ります。




●OpenOffice.java
 前のものとまったく同じですので、省略します。





●Calc.java
 前のものに、以下のメソッドを追加します。
    /**
     * セルをとってきます。
     * @param oSheet とってくるシート
     * @param x 桁(0から始まる)
     * @param y 行(0から始まる)
     * @return XCell
     */
    public XCell getCell(XSpreadsheet oSheet,int x,int y)
    		throws java.lang.Exception
	{
			return	oSheet.getCellByPosition(x,y);
	}

(上記< > ¥は、本当は半角)

とりあえず、今回はここまで。


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« YouTubeの“ヤラセ”騒動?それ... | トップ | 「横断中のiPod使用禁止…... »
最新の画像もっと見る

OpenOffice」カテゴリの最新記事