手軽にできるウェブアプリケーション構築術

PHP

第 4回

ウェブ上のアンケートを自動集 計（ついに完成！）
前回は、ウェブ上のフォームからアンケートを収集し、エクセルで呼び出すところまで進んだ。
今回は最後の仕上げとして、エクセル内で関数を使って自動集計させ、書式も指定してみよう。
宮本和明

ホームページと表計算をつなぐ
多くの企業にとって、ホームページは企業るとは言い難い。

だろう。の窓口として定着してきた。アンケート、各

さて、この連載では、アンケートフォーム

今 回 は最 後 の詰 めとして、 エクセルの種申し込み、問い合わせ、苦情窓口など、あを作り、その回答をPHPでテキストファイルCOUNTA 関数（空欄でないセルの数を数えらゆるサービスがホームページ上に置かれ始に書きためる仕組みを作った。そして、そのる）でアンケート結果を集計したり、SUM 関めている。

テキストファイルを、同じくPHP で、エクセ数（数値の合計を出す）と組み合わせて、そ企業内でのデータ集計に使われているのは、ルから開いてみた。また、エクセル用のヘッ

れぞれが何パーセントを占めているかを集計

もっぱらウィンドウズ上で動く表計算ソフト

ダーをPHP のヘッダー関数で記述し、そのする。さらに、パーセンテージを記述するた（特にエクセル）である。
「ホームページ」と後、HTML のテーブルを書くことにより、エめの「書式」（通常はエクセル上で右クリック「表計算」、この2 つを有機的につなぐことがクセルデータとしてファイルを開けた。しかして指定する）もPHP で指定してみよう。

今後のウェブマーケティングのトレンドになる

し、ただ開くだけではエクセルを活用していfinish
フォームから入力

テキスト保存

テキストファイルとして蓄積

エクセル集計関数などを使った集計画面

290 INTERNET magazine 2001/10

インターネットマガジン／株式会社インプレスR&D

関数：与えられたデータをもとにして、あらかじめ定義された処理をおこない、その結果を返す計算機能のこと。

©1994-2007 Impress R&D

PHP=SUMや=COUNTAなどの関数を使おう
PHPの中でエクセル関数を使うのはそれほケートの回答結果だ。これに関ど難しくはない。たとえば、大人の人数と子しては、単純にCOUNTA関数

供の人数が入力されたセルがあり、その合計を使う。

<?
header (Content-Type:application/vnd.ms-excel );をエクセルのSUM関数で集計するワークシー

次に、それぞれの合計がどのトを作るには、図 1 のようにする。エクセルくらいの割合を占めているかを<HTML><BODY>の関数を使ったことのある人なら、直感的に表わしたい。こちらは「その色<TABLE>理解できるだろう。の個数／全体の個数」の割り?><TR><TD> 大人 <</TD><TD> 子供 <</TD><TD> 合計 <</TD>

この例を参考に、前回集計したテキストフ算の結果を出すようにする。エ

</TR>

ァイルを考えてみよう。図 2 が、前回までのクセルとしては、=C8/SUM<TR>

フォーム＋PHPで蓄積されたテキストファイ(C8:F8)のような式になるはずルである。これをエクセルで表示し、かつ、だ。ただし、これだけだとエク</TABLE>

集計した状態で呼び出すようにする。

セルの基本設定に従って整数</BODY></HTML><TD>8 </TD><TD>4 </TD><TD>=SUM(A2:B2)</TD></TR>

ここで注意するべきことは、「PHP のスクで出力されてしまうので、1 かリプトの中で集計を行うのではない」という0しか記述されない。書式はパ点である。PHP はあくまでも、エクセルの関ーセント形式の表示で、かつ小数を「仕込む」ために使い、「実際の集計は数点以下 1 桁で表示したい。

エクセル上で行う」のである。

これを実現するには、どうした埋め込みたいデータとしては、まず、アン

図 1 ：エクセルシート用 PHP スクリプト

らよいのだろうか。

①②

図 2：前回までのテキストファイル①F2 からF8 までで値の入っている個数をCOUNTA 関数で数えて、F9に出力する。C行からE行までも同様。
②C10を、C10からF10までの和で割って、その結果をC11に出力する。D11からF11までも同様。

●エクセル関数■エクセル関数の種類

エクセル関数は全部で300 種類以上が用意されている。

●数学関数（INT、ROUND ほか）

今回使用したエクセル関数は以下の2 つだが、ほかのエクセル関●日付関数（DATE、TIME など）●論理関数／情報関数（IF、AND など）

数もPHP 上で利用できる。

●検索／行列関数（VLOOKUP、MATCH など）
・COUNTA( )…指定された範囲で、データが入っているセルの数を●財務関数（IPMT、FV など）●文字列操作関数（REPLACE、REPT など）返す。
・SUM( )…指定された範囲の数値の合計を返す。

●データベース関数（DGET、DSUM など）

インターネットマガジン／株式会社インプレスR&D

スクリプト：インターネットで利用されるJavaScript、HyperCardが内蔵するHyperTalkなどで書かれたプログラムのこと。

©1994-2007 Impress R&D

INTERNET magazine 2001/10291

STYLEを使って書式を指定する<?
// Excel に出力する
header ( Content-Type: application/vnd.ms-excel );エクセルのヘッダーを出力パーセントの書式を記述する方法の答えは、実はSTYLEタグにある。エクセル内の値を小//読み込み先ファイルの指定$filename = C:result.txt ;数点以下1桁のパーセント表示にする場合は、以下のようにSTYLE（1）を使って指定すればよい。スタイルタグで、<style><!-.style0{mso-number-format: 0\.0% ;}--></style>と定義しておき、それを利用したい箇所の<TD> タグ内で、以下のように指定することにより、小数点以下1 桁のパーセント表示ができる。

<TD CLASS= style0// データを配列に入れる// n 行目の名前を $name[n]、メールアドレスを $email[n]、色を $color[n]という配列にする$lines = file($filename);$datanum = count($lines);for($i=0; $i<$datanum; $i++){$lines[$i] = chop($lines[$i]);list($name[$i], $email[$i], $color[$i]) = @split( \t ,$lines[$i]);}?><HTML><HEAD><META HTTP-EQUIV= Content-Type CONTENT=<style><!-.style0{mso-number-format: 0\.0% ;}text/html;CHARSET=Shift_JIS >

（1）

-->
</style></HEAD><BODY><TABLE BORDER>

WIDTH= 40 >さて、以上をすべて適用したのが、右の（PHP̲10）スクリプトだ。

<!--タイトル部--><TR><TD> 名前 </TD><TD> アドレス </TD><TD> 赤 </TD><TD> 橙 </TD><TD> 黄 </TD><TD> 茶 </TD></TR><!--データ記述部--><?
for($j=0; $j<$datanum; $j++){echo<TR>\necho<TD>if($color[$j] ==echo

赤;. $name[$j] . </TD>\n<TD>red){</TD>\n<TD>;. $email[$j] . </TD>\n<TD>

;;

}
echo

if($color[$j] ==echo

橙orange){;}echo</TD>\n<TD>

if($color[$j] ==echo

黄;yellow){;}
echo</TD>\n<TD>

if($color[$j] ==echo

茶;brown){;}echo</TD>\n;echo</TR>\n;}?>PHP̲10292 INTERNET magazine 2001/10→

次ページにつづく

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

PHP<!--集計部--><?
// 集計範囲$lln = 1 + $datanum;

集計範囲に利用するセルの 行数を、データ数から算出して変数に入れておく。

$sln = 2 + $datanum;
echo<TR>\n;<TD COLSPAN=2echo<TD BGCOLOR=

redecho<TD BGCOLOR=

orange>=COUNTA(D2:D.$lln.

)</TD>\necho<TD BGCOLOR=

yellow>=COUNTA(E2:E.$lln.

)</TD>\n;<TD BGCOLOR=

brown>=COUNTA(F2:F.$lln.

)</TD>\n;echoecho</TR>\n<TR>\n

ROWSPAN=2> 合計 </TD>\necho>=COUNTA(C2:C.$lln.

;)</TD>\n;;

COUNTA関数で集計。

;

echo

<TD CLASS=style0

WIDTH=40>=C.$sln.

/SUM(C.$sln.

:F.$sln.

)</TD>\necho<TD CLASS=style0

WIDTH=40>=D.$sln.

/SUM(C.$sln.

:F.$sln.

)</TD>\n;echo<TD CLASS=style0

WIDTH=40>=E.$sln.

/SUM(C.$sln.

:F.$sln.

)</TD>\n;<TD CLASS=style0

WIDTH=40>=F.$sln.

/SUM(C.$sln.

:F.$sln.

)</TD>\n;

echo
echo

</TR>\n;SUM 関数の結果を、CLASS で 指定したパーセンテージの 書式で出力。

;?></TABLE></BODY></HTML>

これをブラウザーで開くと、右図のようになる。 C10 のセルの中 身 が、 =COUNT(C2:C9) となっていて、エクセルの中で集計！
できたされていることがわかるだろう。
もしこれを、PHP のスクリプトの中で集計してしまうと、合計数やパーセンテージがベタ打ちで表示されてしまう。ベタ打ちで表示されてしまうと、後でこのエクセルシートを編集したときに、集計した値が正しくなくなってしまう。
今回の課題のように、エクセルの中で集計をするようにしておけば、その後にファイルを編集したときも、常に正しい計算結果を表示してくれるので安心である。

●もっといろいろやってみよう
これで、「PHPのページを開くと→エクしたので、この連載はここでひとまず終了にヒントがある。エクセルのファイルを、セルが起動して→テキストファイル内のデするが、これをもとにさまざまな拡張をイ「別名で保存」→「ファイルの種類：ウェータが表示され→その中でエクセルの関数メージできるだろう。ぜひみなさんなりのブページ(.htm .html )」で保存してみよう。

で集計が行われる」という仕組みが完成「ホームページと表計算の連携」を実現しそうすると、そのHTML ソースの中に、した。当初の目的である「PHP でアプリてみてほしい。

エクセルの書式を決定するためのSTYLEケーションを作ろう」という目標が達成

今後行き詰まったときには、エクセルタグの例などが埋まっているのである。

インターネットマガジン／株式会社インプレスR&D

アプリケーション：ワープロや表計算、データベースなどコンピュータを使って、文書や表、データベースを作るなど、それぞれの目的を実現するためのソフトのこと。アプリケーションソ
フトウェアを略した言いかた。
©1994-2007 Impress R&D

INTERNET magazine 2001/10

293

［インターネットマガジン バックナンバーアーカイブ］ ご利用上の注意
この PDF ファイルは、株式会社インプレス R&D（株式会社インプレスから分割）が 1994 年～2006 年まで発行した月刊誌『インターネットマガジン』の誌面を PDF 化し、「インターネットマガジン バックナンバーアーカイブ」として以下のウェブサイト「All-in-One INTERNET magazine 2.0」で公開しているものです。

http://i.impressRD.jp/bn
このファイルをご利用いただくにあたり、下記の注意事項を必ずお読みください。
z 記載されている内容（技術解説、URL、団体・企業名、商品名、価格、プレゼント募集、アンケートなど）は発行当時のものです。
z 収録されている内容は著作権法上の保護を受けています。著作権はそれぞれの記事の著作者（執筆者、写真の撮影者、イラストの作成者、編集部など）が保持しています。
z 著作者から許諾が得られなかった著作物は収録されていない場合があります。
z このファイルやその内容を改変したり、商用を目的として再利用することはできません。あくまで個人や企業の非商用利用での閲覧、複製、送信に限られます。
z 収録されている内容を何らかの媒体に引用としてご利用する際は、出典として媒体名および月号、該当ページ番号、発行元（株式会社インプレス R&D）、コピーライトなどの情報をご明記ください。
z オリジナルの雑誌の発行時点では、株式会社インプレス R&D（当時は株式会社インプレス）と著作権者は内容が正確なものであるように最大限に努めましたが、すべての情報が完全に正確であることは保証できません。このファイルの内容に起因する直接的および間接的な損害に対して、一切の責任を負いません。お客様個人の責任においてご利用ください。

このファイルに関するお問い合わせ先
All-in-One INTERNET magazine 編集部
im-info@impress.co.jp
Copyright © 1994-2007 Impress R&D, an Impress Group company. All rights reserved.