« 単価の安いものをシンプルに売る | トップページ | サービスを売る »

2008年5月27日 (火)

エクセル2003でDB更新

業務系のアプリを作成することになった。

データベースはMySQL。
PHPで作成した画面からエクセル2003のファイルをアップロードしてデータベースを更新するというシンプルなアプリケーションである。

通常だと、ファイルはCSV形式にしてからアップロードするところだけど、今回は違う方法にトライしてみたので記録しておく。

方法は以下のとおり。

[1] データベースの項目をエクセル2003で作成しておく。
  つまりテンプレートになる。
[2] これをXML方式で保存する。これがミソ。
[3] ユーザーはこのXML形式のデータをエクセル2003で入力する。
  もとから、エクセルで変換してあるので拡張子を見なければ、XMLファイルだとはわからない。
[4] 入力し終えたら、phpで作成したアップロードの画面からアップする。
[5] php側では、アップロードされたファイルをDOM_XML関数でパースしてセルのデータを配列にしてからデータベースに書き込む。

簡単な流れは以上。

今回扱ったphpは4.3.0。(なので、ちょっと苦労した。)

ファイルをアップロードさせるところはこんな感じ。

<form method="post" action="" enctype="multipart/form-data">
アップロード:
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="file" name="file" />
必ずアップロード専用のExcelファイルを使用してください。
<input type='submit' name="btn" value="送信" />
</form>

受け取るPHPではこんな感じ。

if($_FILES["file"]["tmp_name"]) {
        $dom = domxml_open_file($_FILES["file"]["tmp_name"]);
        //Excelの行レコードをすべて取り込む
        $rows = $dom->get_elements_by_tagname("Row");
        for ($i = 0; $i < count($rows); $i++) {
          //行ごとのセルを取得する。
          $cells = $rows[$i]->get_elements_by_tagname("Cell");
          $datarow = array();
          foreach($cells as $cell) {
            //ExcelのXMLはUTF-8でエンコードされているためSJISに変換する
            $datarow[] = mb_convert_encoding($cell->get_content(),"SJIS","UTF-8");
          }
          $data[] = $datarow;
        }
        //DBに書き込む処理。
}

ちょっとベタな書き方だけど、うまくいった。
ユーザーにはデータベースの知識がないのでアクセスなどはなかなか使いこなせない。
いちいち、画面から1件ずつ入力させるのも時間の効率も悪い。
ならば、エクセルを使って一括更新。(と考えた)

エクセル2003とXMLの組み合わせも利用できそうだ。

« 単価の安いものをシンプルに売る | トップページ | サービスを売る »

03 アプリケーション」カテゴリの記事