-
今回は PHPExcel でセルの中にフォントサイズが異なる文字列を設定する方法を説明したいと思います。
今まではセルに対して文字列をそのまま設定すれば、フォントサイズはデフォルトのままで設定できました。
セルに設定する値を文字列では無く、リッチテキストクラス「PHPExcel_RichText」を使うことで、 設定する文字列にフォントなどの指定ができます。<?php // ライブラリ読込 require_once './PHPExcel-1.8/Classes/PHPExcel.php'; // PHPExcelオブジェクト作成 $objBook = new PHPExcel(); // シート設定 $objSheet = $objBook->getActiveSheet(); // リッチテキストで前半はサイズ12で、後半はサイズ20で設定 $objRichText = new PHPExcel_RichText(); // リッチテキストに文字列設定 $objTextElm = $objRichText->createTextRun("サイズ12"); // フォントサイズ12設定 $objTextElm->getFont()->setSize(12); // リッチテキストに文字列追加設定 $objTextElm = $objRichText->createTextRun("サイズ20"); // フォントサイズ20設定 $objTextElm->getFont()->setSize(20); // [A1]セルに設定 $objSheet->getCell('A1')->setValue($objRichText); // ブラウザへの指定 $objWriter = PHPExcel_IOFactory::createWriter($objBook, "Excel2007"); $objWriter->save('test11-1.xlsx'); exit(); ?>
出力されたエクセルファイルを見てみると以下の様になります。
”サイズ12”の文字列はサイズ12で、”サイズ20”の文字列はサイズ20で設定されている様子がわかります。
PR -
今回は QRコード を画面上に表示する方法について説明します。
QRコード と言えばトヨタ自動車系列の会社である株式会社デンソー(現在はデンソーウェーブ)が開発したマトリックス型の二次元コードです。 このコードの中にはASCII(半角英数)で最大4296文字まで入るため、各種の情報を埋め込むことができます。
デンソーは敢えて普及のため QRコード の特許をオープンし特許権を行使していないため、自由に使用できます。
最近は非常に普及が進み、現在はスマホのカメラアプリにも QRコード の読み取りが標準で装備されていて、いろんなシーンで利用されています。 テレビ画面にもスマホのためのURLが QRコード で表示され、このコードを見ない日が無いぐらいです。
さてこの QRコード をブラウザの画面上に表示する方法について話を戻します。
先ずはプログラムが必要無く HTML の IMG タグに直接指定する方法について説明します。
Google Chart Tools を使うのですが、チャートのタイプとして QRコード を指定し、コードの中身のテキスト文字列を指定するだけで QRコード の画像が表示されます。
■Google Chart Tools を使い QRコード を表示するHTMLファイル
<html> <head> <meta charset="utf-8"> <title>test qr code</title> </head> <body> <img src="https://chart.apis.google.com/chart?cht=qr&chs=250x250&chl=this is test"> </body> </html>
上記の QRコード の部分を実際に表示すると以下の様になります。
Google Chart Tools への URL は「https://chart.apis.google.com/chart?」でその後ろに生成する QRコード の情報を指定します。<パラメータの指定方法> cht=qr : QRコードを指定(必須) chs=<width>x<height>: QRコードのサイズを指定。width,height 共に同じ値(必須) chl=<data> : コードの中身のテキスト文字列(必須) choe=<encoding> : データをQRコードにエンコードする方法。 利用可能な値は次のとおりです。 ・UTF-8 [デフォルト] ・Shift_JIS ・ISO-8859-1 chld=<error_correction_level>|<margin> : error_correction_level : 誤り訂正レベル ・L-[デフォルト]最大7%の誤り訂正 ・M-最大15%の誤り訂正 ・Q-最大25%の誤り訂正 ・H-最大30%の誤り訂正 margin : QRコードの周りの白い幅でピクセル値では無い([デフォルト:4])
このAPIにより返される画像データ形式は「PNG」の様です。「PNG」が表示できないブラウザでは QRコード が表示されませんので注意して下さい。 (現状ではそんなブラウザは無いと思いますが)
なお、このAPIのGoogle の正式ページは以下の通りです。
⇒https://developers.google.com/chart/infographics/docs/qr_codes
このページの先頭には以下の注意書きがあります。Warning: This API is deprecated. Please use the actively maintained Google Charts API instead. See our deprecation policy for details.
「このAPIは非推奨になっています。 代わりにGoogle Charts APIを使用してください。 」とありますので、 いつ使えなくなっても仕方ありません。 現状では「Google Charts API」を見ても QRコード の項目は見当たらないので、代替の方法を考えなければと思います。
と言うことで、以下は QRコード用jQuery ライブラリを使った方法について説明します。
ここでは qrcode.js ライブラリを使用します。
■ qrcode.js ライブラリのダウンロード
qrcode.js ライブラリのダウンロードは以下のページから行えます。
⇒https://github.com/jeromeetienne/jquery-qrcode
ページ右上の「↓Code」ボタンをクリックしてさらに「Download ZIP」をクリックします。
ZIPファイルのダウンロードが始まりますので適当なフォルダを設定してダウンロードさせます。
ZIPファイルを解凍し「jquery.qrcode.min.js」をHTMLから参照できるところにコピーします。 (今回のテストではHTMLファイルと同じフォルダにしました。)
■ qrcode.js ライブラリの使用例
以下に qrcode.js ライブラリの使用例を示します。
HTMLファイルと同じディレクトリに「jquery.qrcode.min.js」を設置しヘッダーで読込みます。
qrcode.js が QRコード を画像展開する「DIVタグ」を宣言します。
javascript ではファイルロード直後に「DIVタグ」に対して QRコード を展開するコードを記述します。<html> <head> <meta charset="utf-8"> <title>test qrcode</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="./jquery.qrcode.min.js"></script> <script type="text/javascript"> $(function(){ $('#qrcode').qrcode({ render: "canvas", width : 150, height: 150, text: "this is test." }); }); </script> </head> <body> <div id="qrcode"></div> </body> </html>
<qrcode のパラメータオブジェクトの指定方法> render : 生成方法の指定「"canvas","table"のみ」(オプションでデフォルト:"canvas") width : QRコードのサイズ幅を指定。 height : QRコードのサイズ高さを指定。 text : コードの中身のテキスト文字列(必須)
上のソースの QRコード の部分をブラウザのウエブ開発などでのぞいてみると、 canvas 指定の場合には「DIVタグ」の中身に以下のHTMLが生成され、画像データが存在します。
<canvas width="150" height="150"></canvas>
また table 指定の場合には「DIVタグ」の中身に以下の様なHTMLが生成され、 「tdタグ」の背景色で黒白のドットを生成している様です。
<table style="width: 150px; height: 150px; border: 0px none; border-collapse: collapse; background-color: rgb(255, 255, 255);"> <tbody> <tr style="height: 6px;"> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> </tr> <tr style="height: 6px;"> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> <td style="width: 6px; background-color: rgb(255, 255, 255);"></td> <td style="width: 6px; background-color: rgb(0, 0, 0);"></td> ... 後は割愛
-
以下のページではPHPのクラス(Class)に存在しない プロパティ へのアクセスが可能になる様に マジックメソッド の __get(), __set(), __isset(), __unset() を宣言してクラスを拡張しました。
⇒PHP クラス(Class)のプロパティの使い方について(__get(), __set())
さて、このクラスに配列データをそのままプロパティとして設定する関数を追加します。
この関数では、配列データの キー をプロパティ名、 データ をプロパティの値として設定します。 (処理の実体は自分の中の __set() メソッドを利用します。)<?php class test { // 宣言していないプロパティ退避用配列 private $arrProp = array(); public function __get($name) { // 退避配列にデータが存在するか? if (isset($this->arrProp[$name])) { // データを返す return $this->arrProp[$name]; } else { return NULL; } } public function __set($name, $value) { // 退避配列にデータを設定 $this->arrProp[$name] = $value; } public function __isset($name) { // 退避配列内の存在チェック return isset($this->arrProp[$name]); } public function __unset($name) { if (isset($this->arrProp[$name]) == true) { // 退避配列内のunset unset($this->arrProp[$name]); } } // 配列のデータをプロパティ的に退避 public function setArray($arr) { if (is_array($arr)) { foreach ($arr as $key => $val) { $this->__set($key, $val); } } } } // クラス生成 $obj = new test(); // テスト用配列 $arrTest = array("prop1" => 100, "prop2" => "ABCDE", "prop3" => array("111", "222", "333")); // テスト用配列をプロパティ的に退避 $obj->setArray($arrTest); // プロパティとして取得 echo "<pre>"; var_dump($obj->prop1); var_dump($obj->prop2); var_dump($obj->prop3); echo "</pre>"; ?>
これを実行するとブラウザに以下の様に表示されます。 プロパティ「$prop1」「$prop2」「$prop3」の値が設定されていることが分かります。
int(100) string(5) "ABCDE" array(3) { [0]=> string(3) "111" [1]=> string(3) "222" [2]=> string(3) "333" }
配列をプロパティ的に使う例としては、データベースのテーブルの1レコードの内容をプロパティとして退避する場合があると思います。 以下にその例を示します。
あるデータベースに「test」テーブルが存在し、主キーとして「id」があるとします。その「id = 1」の1行データを取得することにします。 このソースの前にはデータベースへの接続が在りますが、今回は割愛してあります。 (ソース上は「$db」に接続後のPDOインスタンスが生成されたとしています)<?php ... // クラス生成(クラスのソースはこの前で読込済みとする) $obj = new test(); // SQL文を準備:「:id」がプレースホルダー $sql = 'SELECT * FROM test WHERE id = :id'; // PDOStatementクラスのインスタンス生成 $pre = $db->prepare($sql); // SQL文の「:id」を「1」に置き換え $pre->bindValue(':id', 3, PDO::PARAM_INT); // プリペアドステートメントを実行する $pre->execute(); // PDO::FETCH_ASSOCは、テーブルカラム名をキーとして連想配列にデータを取得 $row = $pre->fetch(PDO::FETCH_ASSOC); if ($row) { // テーブル行データ配列をプロパティ的に退避 $obj->setArray($arrTest); // この後でカラム名でプロパティとしてアクセスできる $w = $obj->XXXXXX; // XXXXXX:カラム名 } ... ?>
この結果 $obj->XXXXXX の様にしてテーブルのカラム名でデータが取得できる様になります。
各テーブルごとにこの「test」クラスを基底としたクラスを作成し、その中でレコード取得関数を作り setArray を行えば 各テーブルクラスのインスタンスからカラム名のプロパティでカラムデータが取得できる様になると思います。
-
今回はPHPのクラス(Class)の プロパティ について説明したいと思います。
クラスの プロパティ はそのクラスの内部で必要な属性を保存しておくための変数として使用します。 プロパティ の宣言は private 及び public で行います。 public で宣言したプロパティは、外部から直接アクセスができますが private で宣言したプロパティは、外部から直接アクセスができないため、値を設定したり、取得する関数を別に用意します。
また、宣言されていないプロパティをアクセスした時に呼ばれる関数(マジックメソッド)が在りますので、 それを使った対処方法を以下に順次記します。
- 簡単な プロパティ の宣言例
- 存在しない プロパティ へのアクセス例
- 存在しない プロパティ へのアクセス例その2(設定)
- マジックメソッド での存在しない プロパティ へのアクセス制御(__get(), __set())
- マジックメソッド での存在しない プロパティ へのアクセス制御その2(__isset(), __unset())
■簡単な プロパティ の宣言例
テスト用クラスとして test を宣言しその中に1個のプロパティ $prop1 を宣言します。
このクラスを生成し、プロパティを var_dump 関数で直接アクセスします。<?php // テストクラス class test { public $prop1; } // クラス生成 $obj = new test(); // プロパティへのアクセス var_dump($obj->prop1); ?>
これを実行するとブラウザに以下の様に表示されます。クラス生成後「$prop1」には何も設定されていので「NULL」と表示されます。
NULL
■存在しない プロパティ へのアクセス例
以下の例は上の例と似ていますが、宣言されていないプロパティ $prop2 へのアクセスを行います。
<?php // テストクラス class test { public $prop1; } // クラス生成 $obj = new test(); // 宣言されていないプロパティへのアクセス var_dump($obj->prop2); ?>
これを実行するとブラウザに以下の様に表示されます。
Notice: Undefined property: test::$prop2 in xxxxx on line 9 NULL
(xxxxx:この部分は実際のソースの位置なので伏字にしました)
PHPのエラーメッセージが Notice となっていて、その後に NULL が表示されているので、どうも $prop2 が存在している様な感じです。
そこでソースの最後に、クラスのインスタンスオブジェクトそのものを表示してみます。<?php // テストクラス class test { public $prop1; } // クラス生成 $obj = new test(); // 宣言されていないプロパティへのアクセス var_dump($obj->prop2); ?>
これを実行するとブラウザに以下の様に表示されます。クラスのインスタンス内には $prop2 は存在しない様です。 Notice の後の NULL はプロパティが存在しないので、仮に NULL が返された様です。
Notice: Undefined property: test::$prop2 in xxxxx on line 9 object(test)#1 (1) { ["prop1"]=> NULL }
■存在しない プロパティ へのアクセス例その2(設定)
今度は存在しない プロパティ へ直接上書き設定を行っています。
<?php // テストクラス class test { public $prop1; } // クラス生成 $obj = new test(); // 宣言されていないプロパティへのアクセス(強制設定) $obj->prop2 = "2"; $obj->prop3 = "3"; // クラスインスタンスの表示 echo "<pre>"; var_dump($obj); echo "</pre>"; ?>
これを実行するとブラウザに以下の様に表示されます。宣言されていないプロパティへの設定は強制的に作成される様です。
これは仕様の様なので仕方無いのですが、微妙な感じです。 この微妙さを解消する為にPHPには宣言されていないプロパティをアクセスした時に呼ばれるメソッドをクラス内に宣言するころで 自分で対処できる様です。object(test)#1 (3) { ["prop1"]=> NULL ["prop2"]=> string(1) "2" ["prop3"]=> string(1) "3" }
■マジックメソッド での存在しない プロパティ へのアクセス制御(__get(), __set())
PHPには宣言されていないプロパティをアクセスした時に呼ばれるメソッド名が決まっていまして、 プロパティ値の取得・設定用にそれぞれ __get() 、 __set() を宣言します。 以下にその例を示します。
<?php class Test { public $prop1; public function __get($name) { echo "__get($name)プロパティエラー
"; } public function __set($name, $value) { echo "__set($name, $value)プロパティエラー
"; } } // クラス生成 $obj = new test(); // 宣言されていないプロパティへのアクセス(強制設定) $w = $obj->prop2; $obj->prop2 = "2"; ?>これを実行するとブラウザに以下の様に表示されます。
__get(prop2)プロパティエラー __set(prop2, 2)プロパティエラー
この例では、宣言されていないプロパティへのアクセスでエラーを表示しているだけですので、 これを少し修正して、プロパティを内部に連想配列として退避することで、プロパティの動きを作ります。 以下にその修正版を示します。
取得用の __get() では退避配列にデータが存在すればその値を返し、無ければ NULL を返しています。 また設定用の __set() では退避配列にデータを退避するだけです。<?php class test { public $prop1; // 宣言していないプロパティ退避用配列 private $arrProp = array(); public function __get($name) { // 退避配列にデータが存在するか? if (isset($this->arrProp[$name])) { // データを返す return $this->arrProp[$name]; } else { return NULL; } } public function __set($name, $value) { // 退避配列にデータを設定 $this->arrProp[$name] = $value; } } echo "<pre>"; // クラス生成 $obj = new test(); // 宣言されていないプロパティへのアクセス(取得) var_dump($obj->prop2)."
"; // 宣言されていないプロパティへのアクセス(設定) $obj->prop2 = "2"; // 宣言されていないプロパティへのアクセス(再取得) var_dump($obj->prop2)."
"; var_dump($obj)."
"; echo "</pre>"; ?>これを実行するとブラウザに以下の様に表示されます。 配列「$arrProp」にプロパティ「prop2」が格納されています。
今回 __get() で配列にデータが無い場合には NULL を返していますが、 Exception でエラーを返した方が良い場合があると思います。NULL string(1) "2" object(test)#1 (2) { ["prop1"]=> NULL ["arrProp":"test":private]=> array(1) { ["prop2"]=> string(1) "2" } }
■マジックメソッド での存在しない プロパティ へのアクセス制御その2(__isset(), __unset())
マジックメソッド である __get() 、 __set() を宣言することで 宣言されていないプロパティをアクセスできる様になりました。
但し、以下の様にそのプロパティの存在チェックを isset() 関数で行うと思った様になりません。<?php class test { public $prop1; // 宣言していないプロパティ退避用配列 private $arrProp = array(); public function __get($name) { // 退避配列にデータが存在するか? if (isset($this->arrProp[$name])) { // データを返す return $this->arrProp[$name]; } else { return NULL; } } public function __set($name, $value) { // 退避配列にデータを設定 $this->arrProp[$name] = $value; } } // クラス生成 $obj = new test(); // プロパティ存在確認 if (isset($obj->prop2) == true) { echo "プロパティ存在OK"."
これを実行するとブラウザに以下の様に表示されます。
"; } else { echo "プロパティ存在NG"."
"; } // プロパティ設定 $obj->prop2 = "2"; // プロパティ存在確認 if (isset($obj->prop2) == true) { echo "プロパティ存在OK"."
"; } else { echo "プロパティ存在NG"."
"; } ?>プロパティ存在NG プロパティ存在NG
これは、よくよく考えてみれば、__set() でプロパティ値として退避しているのは 「$arrProp」なのでこの中の存在をチェックしなければ、意味が無いことが分かります。
尚、マジックメソッド として宣言できるものの中に __isset() 、 __unset() があるのですが これらはクラスのプロパティに対して isset() 、 unset() を行う時に呼ばれるメソッドです。
よって、これらを宣言し、クラス内の「$arrProp」を処理する様に修正します。
<?php class test { public $prop1; // 宣言していないプロパティ退避用配列 private $arrProp = array(); public function __get($name) { // 退避配列にデータが存在するか? if (isset($this->arrProp[$name])) { // データを返す return $this->arrProp[$name]; } else { return NULL; } } public function __set($name, $value) { // 退避配列にデータを設定 $this->arrProp[$name] = $value; } public function __isset($name) { // 退避配列内の存在チェック return isset($this->arrProp[$name]); } public function __unset($name) { if (isset($this->arrProp[$name]) == true) { // 退避配列内のunset unset($this->arrProp[$name]); } } } // クラス生成 $obj = new test(); // プロパティ存在確認 if (isset($obj->prop2) == true) { echo "プロパティ存在OK"."
これを実行するとブラウザに以下の様に表示されます。
"; } else { echo "プロパティ存在NG"."
"; } // プロパティ設定 $obj->prop2 = "2"; // プロパティ存在確認 if (isset($obj->prop2) == true) { echo "プロパティ存在OK"."
"; } else { echo "プロパティ存在NG"."
"; } ?>プロパティ存在NG プロパティ存在OK
これでクラス内で宣言していないプロパティを外部から任意の名前でアクセスができるクラスを作成できました。 このクラスを基底クラスとして、拡張したクラスを作成していけると思います。
ただし、任意の時点でプロパティが作成できることは、あちらこちらでその処理を行うと、 後からソースを見た時に理解に時間が掛かるかもしれません。 この辺りは、プロパティの仕様をしっかりしないと、クラス内に個別にプロパティを宣言した方が良かったことになりかねませんので。
-
今回は PhpSpreadsheet でエクセルファイルをPHPの配列への「読み込み」について説明したいと思います。
PhpSpreadsheet のワークシートオブジェクトにはシート内に存在する全てのセルのデータをPHPの配列へ読み込む rangeToArray 関数があります。 この関数を使えば、特に気にしなくてもセルの表示される値が取得できます。
■エクセルファイルの「読み込み」その1(セルは値のみ設定)
処理の手順は以下の通りです。
- 最初に IOFactory::load() メソッドで既存エクセルファイルを読込みSpreadsheetオブジェクト作成します。
- Spreadsheetオブジェクトの getSheet() メソッドでワークシートオブジェクトを取得します。
- ワークシートオブジェクトの calculateWorksheetDimension() メソッドでシート全体の領域を示す文字列を取得します。 (この関数は結果として "A1:[最大カラム文字列][最大行]" を返します。)
- ワークシートオブジェクトの rangeToArray() メソッドで全体のセルの値を配列に取得します。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Worksheet; // [test11.xlsx] ファイルをロードしSpreadsheetオブジェクト作成 $objSpreadsheet = IOFactory::load('./test11.xlsx'); // ワークシートオブジェクトの取得 $objSheet = $objSpreadsheet->getSheet(0); // ワークシート内の最大領域座標("A1:XXXnnn" XXX:最大カラム文字列, nnn:最大行) $strRange = $objSheet->calculateWorksheetDimension(); // ワークシートの全てのデータ取得(配列データとして) $arrData = $objSheet->rangeToArray($strRange); echo "<pre>"; print_r($arrData); echo "</pre>"; ?>
読み込むエクセルファイルは以下のものを使います。
ブラウザの表示は以下の様な感じになります。(エクセル上で空白のセルは、配列の結果としても空白になります。)Array ( [0] => Array ( [0] => No [1] => DATA1 [2] => DATA2 [3] => DATA3 [4] => DATA4 ) [1] => Array ( [0] => 1 [1] => AAAAAAA [2] => BBB [3] => CCC [4] => DDDD ) [2] => Array ( [0] => 2 [1] => aaaa [2] => bbb [3] => ccc [4] => ) [3] => Array ( [0] => 3 [1] => ああああ [2] => いいい [3] => 漢字データ [4] => aaaa ) [4] => Array ( [0] => 4 [1] => [2] => [3] => [4] => ) )
■エクセルファイルの「読み込み」その2(セルに計算式を含む場合)
上記のエクセルファイルの読み込みソースで、以下の様なセルに計算式を含むものがあるものを読込ませてみます。
尚、ソース上で「IOFactory::load('./test11.xlsx');」のファイルの部分を「'./test11-2.xlsx'」とします。
ブラウザの表示は以下の様な感じになります。(金額の計算結果が値として配列に設定されています。)Array ( [0] => Array ( [0] => No [1] => 商品名 [2] => 単価 [3] => 数量 [4] => 金額 ) [1] => Array ( [0] => 1 [1] => 商品1 [2] => 1000 [3] => 10 [4] => 10000 ) [2] => Array ( [0] => 2 [1] => 商品ああ [2] => 100 [3] => 5 [4] => 500 ) [3] => Array ( [0] => 3 [1] => 商品い [2] => 300 [3] => 6 [4] => 1800 ) [4] => Array ( [0] => 4 [1] => 商品う [2] => 500 [3] => 1 [4] => 500 ) )
■エクセルファイルの「読み込み」内容をHTMLのTABLE表示
それでは上記で使用したエクセルファイル「'./test11-2.xlsx'」を読込んで HTML の TABLE タグを使って表形式での表示を行います。
<?php // ライブラリ読込 require '../vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Worksheet; // [test11-2.xlsx] ファイルをロードしSpreadsheetオブジェクト作成 $objSpreadsheet = IOFactory::load('./test11-2.xlsx'); // ワークシート・オブジェクトの取得 $objSheet = $objSpreadsheet->getSheet(0); // ワークシート内の最大領域座標("A1:XXXnnn" XXX:最大カラム文字列, nnn:最大行) $strRange = $objSheet->calculateWorksheetDimension(); // ワークシートの全てのデータ取得(配列データとして) $arrData = $objSheet->rangeToArray($strRange); ?> <html> <head> <meta charset="utf-8"> <title>test excel array </title> </head> <body> <table border="1"> <thead> <?php $arrWK = $arrData[0]; ?> <tr> <?php for ($ii = 0; $ii <= (count($arrWK) - 1); $ii++) { ?> <th><?php echo $arrWK[$ii]; ?></th> <?php } ?> </tr> </thead> <tbody> <?php for ($i = 1; $i <= (count($arrData) - 1); $i++) { $arrWK = $arrData[$i]; ?> <tr> <?php for ($ii = 0; $ii <= (count($arrWK) - 1); $ii++) { ?> <td><?php echo $arrWK[$ii]; ?></td> <?php } ?> </tr> <?php } ?> </tbody> </table> </body> </html>
ブラウザには以下の様に表示されます。