2012年6月20日水曜日

データベースでテーブル一覧を取得する方法

もう複数のDBについてまとめられてました。

◆PostgreSQLがなかったので追加。

ちなみに、このページから取得しました。
SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public'


2012年6月14日木曜日

PHP:COMでMSワードにアクセスするメモ

仕事がらみでPHPを使ってMS-Wordの中身を抜き出す方法を調べたメモ。

PHP:COMモジュール

PHPの標準で、MS-Wordを直接扱えるCOMモジュールが提供されている。
COMというのはOLE2の基盤技術のことで、アプリケーションから別のアプリケーションを呼び出して使うためのプロトコル(?)らしい。余り詳しくはないので、間違っているかも。

ともあれ、COMモジュールを使うには、
・OSがWindowsで、
・MS-Wordがインストールされている、
のが条件。
PHP:COMモジュール自体もウィンドウズ版でのみ提供されている。

自分の環境は、
Windows7(64bit)、MSOffice2003、XAMPP、という条件で動いた。

php.ini設定

php.iniの設定で、COMを使えるように変更する必要がある。
ここの実行時設定にあるディレクティブを、
デフォルトのままコメントを削除したら動いた。

dcomcnfgの設定

スターとメニューの「プログラムとファイルの検索」に
dcomcnfg
と入力して、dcomcnfg.exeを実行。
すると、こんなウィンドウが開きました。




後は…書くのが面倒なので、こちらの素晴らしいページを参考に作業を進める。

つまり、

1)コンポーネントサービス > コンピューター > マイ コンピューター
のプロパティを表示
2)プロパティタブの「COMセキュリティ」を選択
3)起動とアクティブ化のアクセス許可の既定値の編集
4)IUSR_を追加する
追加ボタン > 詳細設定ボタン > 検索ボタン > IUSRを選択してOK連打

といった感じで動きました。

Bookmarkとの連携

ワードをテンプレートの用に使うことが出来ます。
そのときに利用するのが「ブックマーク」という機能。

HTMLのフォーム要素のような存在です。
ブックマークにも名前があるので、名前を使って要素を指定し、要素の値を読み込んだり書き込むことがPHPから出来ます。

便利そうですよね。

サンプルコード

こんなので動きます。


$word = new COM( "Word.Application", NULL, CP_UTF8 ) or die( 'no word!?' );
$word->Visible = 0;
$word->Documents->Open( 'word.doc' );
// show all bookmarks
$num_bookmarks = $word->ActiveDocument->Bookmarks->Count;
for( $i = 1; $i <= $num_bookmarks; $i ++ ) {
    try {
        $mark = $word->ActiveDocument->Bookmarks($i)->Name;
        $wdMark = $word->ActiveDocument->Bookmarks( $mark );
        $range = $wdMark->Range;
        $range->Text = "#{$i}:$mark";
    }
    catch( Exception $e ) {}
}
$word->Documents[1]->SaveAs( 'word_new.doc' );

結構、問題が・・・

実際に動かすと分かりますが、
すべてのブックマークを読み込めませんでした。

また日本語を書き込むと後ろにゴミのようなものが・・・!

そこそこ動きますが、仕事に必要な精度は出せませんでした。

2012年6月13日水曜日

JavaScriptでBookmarklet


何となく、JavaScriptを使ったBookmarkletを作って見た。
ブックマークにJavaScriptを書き込んで、ページ上で走らせることができる。
参考:Bookmarklet - ブックマークレットを作成する際のポイント

使ったことはあったけど、自分で作ったことがなかったので
ちょっとやってみた。

基本形:

javascript:( function() { var v; /* do it */ })()



  1. 上の無名関数内に実行するスクリプトを書いて、
  2. 改行をとって(つまり一行にして)、
  3. ブックマークのURLの部分に貼り付けると
  4. Bookmarkletになる。


無名関数を使うのは、varで宣言された変数がローカルになるので。
上の基本形を元に作る方が安全と思う。

作ったブックマークボタンを押すと、表示されてるページでスクリプトが実行されます。

いくつか作ってみたので、解説でも。

inputタグの名前を抜き出す。


  1. 全input要素を抜き出して:document.getElementsByTagName("input")
  2. 要素をループして:for(i=0;i<theForms.length;i++)
  3. list変数に書き込んで:list = list + ','+theForms[i].name;
  4. alertとして書き出す:alert( list );

javascript:(function() { /* do something */ var theForms = document.getElementsByTagName("input");var list = '';for(i=0;i<theForms.length;i++) list = list + ','+theForms[i].name;alert( list );})()


inputタグの自動入力

今度はinputタグの名前を抜きだし、値として使ってみる。

javascript:(function() { /* do something */ var theForms=document.getElementsByTagName("input");var list='';for(i=0;i<theForms.length;i++) theForms[i].value=theForms[i].name;})()
開発していて、大量の入力フォームがある時に便利かなと思って作って見た。

想定どおりに動くんだけれど、数字のみにしたい、セレクト・チェックボックスなどに対応して内など、細かな問題が多くて使いづらい。

一行なので修正も動作確認も面倒だし、
Bookmarkletは使いどころが難しい、という感想。