« サービスを売る | トップページ | 広告を見る »

2008年5月31日 (土)

エクセル2003でDB更新その2

先日、エクセル2003でDB更新が成功したと書いたがバグが出た。

バグというより、エクセル2003のおっせっかいな仕様のために意図しないものまでアップロードされてしまうことが判明した。

ふりがな。

XML化したら、非表示になっていても「ふりがな」がXML化されてしまうのである。
エクセル2003では、日本語入力した場合は「ふりがな」がセルに仕込まれてしまうのである。

このふりがな対策には、マクロで削除する方法が簡単だが、ユーザーにいちいちこのマクロを実行してもらうのでは面倒だし忘れられてしまう危険もある。
(だいいち、そんなことユーザーは覚えていない)

ということで、PHPスクリプトを少し変更した。

こんな感じだ。
フォームの部分は変更なし。

<form method="post" action="" enctype="multipart/form-data">
<table>
<colgroup><col width="150"><col width="100"><col width="*"><col width="1"></colgroup>
<tr>
<td class="odd">アップロード:</td>
<td><input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
    <input type="hidden" name="act" value="admin_mondai_upload" />
    <input type="file" name="file" size="30" /></td>
<td>
必ずアップロード専用のExcelファイルを使用してください。
</td>
<td>
<button style='width:63px;' type='submit' name="btn" value="送信">
<img src='img/btn_set.png' alt='設定' width='63' height='25' /></button>
</td>
</tr></table>
</form>

フォームデータを受け取ってDBに更新する部分。

      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) {
            //ふりがなデータを排除するためにDataタグのみ抽出する
            $celldata = $cell->get_elements_by_tagname("Data");
            foreach($celldata as $value) {
              //ExcelのXMLはUTF-8でエンコードされているためSJISに変換する
              $datarow[] = mb_convert_encoding($value->get_content(),"SJIS","UTF-8");
            }
          }
          $data[] = $datarow;
        }
      }

エクセル2003では、エレメント「Cell」の下に複数のエレメントを含む。
なので、「Data」エレメントだけを選んでget_contentで内容だけを取り出した。

とりあえず、このままで動く。

php5に書き換えないと...。

« サービスを売る | トップページ | 広告を見る »

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