以下の記事で、クラス(class)のオーバーライドの使い方について説明してきました。
⇒PHP クラス(class)の使い方について
⇒PHP クラス(class)のオーバーライドの使い方について・その2
そこで、今回は簡単なクラスでの説明ではなく、少し有用性があるクラスを作成し、それを元にオーバーライドの使い方について説明します。
以下のクラスは PHPExcel ライブラリを利用して指定されたエクセルファイルをオープンし、全ての行を順次読込むためのクラスです。 メソッドとしては以下の4個を持ちます。
- コンストラクタ(__construct):ファイルを指定してインスタンス生成
- ファイルオープン(open):ファイルをオープンして各種属性を取得
- カラムMAX取得(getColMax):カラムの最大値を返す
- 1行データ取得(getLine):データが存在した場合は配列データを返す(最後を超えた場合はfalse)
<?php
// Excelライブラリ読込
require_once './PHPExcel-1.8/Classes/PHPExcel.php';
// Excelファイル読込クラス[cExcelGet.php]
class cExcelGet
{
// 共通変数宣言
private $strFilePath; // ファイルフルパス名退避
// エクセル用カラム名
private $arrColName = array(
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ",
"BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ",
);
// ワークシートオブジェクト取得
private $objWorksheet;
private $intLine; // データ行数
private $intColMax; // カラムMAX数
private $intRowMax; // 行MAX数
// コンストラクタ
// [引数] $_strFilePath string : ファイルフルパス名
public function __construct ($_strFilePath)
{
// ファイルフルパス名を退避
$this->strFilePath = $_strFilePath;
}
// ファイルオープン
// [戻り値] :true:正常、false:エラー
public function open() {
// ファイル存在チェック
if (!file_exists($this->strFilePath)) {
// ファイル存在エラー
return false;
}
// エクセルファイル読込オブジェクト
$objReader = PHPExcel_IOFactory::createReader("Excel2007");
// PHPExcelオブジェクト取得
$objPHPExcel = $objReader->load($this->strFilePath);
// ワークシートオブジェクト取得
$this->objWorksheet = $objPHPExcel->getActiveSheet();
// カラムMAX取得
$strColMax = $this->objWorksheet->getHighestColumn(); // カラム文字列
$this->intColMax = PHPExcel_Cell::columnIndexFromString($strColMax);
// 行MAX取得
$this->intRowMax = $this->objWorksheet->getHighestRow();
// データ行数
$this->intLine = 0;
// 正常
return true;
}
// カラムMAX取得
public function getColMax() {
return $this->intColMax;
}
// 1行データ取得
// [戻り値] :データが存在した場合は配列データ
// (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 )
// :false:行最終
public function getLine() {
// データ行数
$this->intLine++;
if ($this->intLine > $this->intRowMax) {
// 処理行数がMAXを超えた場合
return false;
}
// 1行データ取得・行指定
$arrData = $this->getLineDirect($this->intLine);
// データ配列を返す
return $arrData;
}
// 1行データ取得・行指定
// [引数] $_intLine : 行番号(PHPExcelでは行は1~)
// [戻り値] :データが存在した場合は配列データ
// (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 )
// :false:行最終
public function getLineDirect($_intLine) {
$arrData = array();
for($c = 0; $c < $this->intColMax; $c++) { //colは [0] 始まりで [0] = "A" となる(rowは [1] 始まり)
$arrData[$c] = $this->objWorksheet->getCellByColumnAndRow($c, $_intLine)->getValue();
if (is_null($arrData[$c])) {
$arrData[$c] = "";
} else {
$arrData[$c] = trim($arrData[$c]);
}
// 変換後のキーと値で設定
$arrData[$this->arrColName[$c]] = $arrData[$c];
}
// データ配列を返す
return $arrData;
}
}
?>
このクラスを使って以下のエクセルを読込んでみます。
<?php
// クラスファイル読込
require_once 'cExcelGet.php';
// [cExcelGet]クラスの生成
$insXlsx = new cExcelGet("ctest1.xlsx");
// ファイルオープン
if ($insXlsx->open() == true) {
// 1行データ取得
while ($arrData = $insXlsx->getLine()) {
$str = "";
for ($i = 0; $i < $insXlsx->getColMax() ; $i++) {
if ($str != "") $str .= ",";
$str .= $arrData[$i];
}
$str .= "<br>\n";
echo $str;
}
} else {
echo "open error.";
}
?>
これを実行するとブラウザに以下の様に表示されます。
AAAA,BBBBB,CCC,DD 123,2000,4000,500 ABC001,B001,5000,140 C001,D002,600,200
このクラスを少し改良して、CSVファイルの場合に使用できる様にします。 尚 PHPExcel ライブラリのCSVファイル処理を利用します。(以下の記事を参照して下さい)
⇒PHP PHPExcel CSVファイルの読み込み・書き込みについて
上記の記事から、CSVファイルを読込んで PHPExcelオブジェクト を取得すれば、今回のクラスを親クラスとして利用できることが分かります。
それでは、その前に元のクラスを以下の様に変更します。
<?php
// Excelライブラリ読込
require_once './PHPExcel-1.8/Classes/PHPExcel.php';
// Excelファイル読込クラス
class cExcelGet
{
// 共通変数宣言
protected $strFilePath; // ファイルフルパス名退避
// エクセル用カラム名
private $arrColName = array(
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ",
"BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ",
);
// ワークシートオブジェクト取得
protected $objWorksheet;
private $intLine; // データ行数
private $intColMax; // カラムMAX数
private $intRowMax; // 行MAX数
// コンストラクタ
// [引数] $_strFilePath string : ファイルフルパス名
public function __construct ($_strFilePath)
{
// ファイルフルパス名を退避
$this->strFilePath = $_strFilePath;
}
// ファイルオープン
// [戻り値] :true:正常、false:エラー
public function open() {
// ファイル存在チェック
if (!file_exists($this->strFilePath)) {
// ファイル存在エラー
return false;
}
// エクセルファイル読込、ワークシートオブジェクト取得
$this->openWorksheet();
// カラムMAX取得
$strColMax = $this->objWorksheet->getHighestColumn(); // カラム文字列
$this->intColMax = PHPExcel_Cell::columnIndexFromString($strColMax);
// 行MAX取得
$this->intRowMax = $this->objWorksheet->getHighestRow();
// データ行数
$this->intLine = 0;
// 正常
return true;
}
// エクセルファイル読込、ワークシートオブジェクト取得
protected function openWorksheet() {
// エクセルファイル読込オブジェクト
$objReader = PHPExcel_IOFactory::createReader("Excel2007");
// PHPExcelオブジェクト取得
$objPHPExcel = $objReader->load($this->strFilePath);
// ワークシートオブジェクト取得
$this->objWorksheet = $objPHPExcel->getActiveSheet();
}
// カラムMAX取得
public function getColMax() {
return $this->intColMax;
}
// 1行データ取得
// [戻り値] :データが存在した場合は配列データ
// (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 )
// :false:行最終
public function getLine() {
// データ行数
$this->intLine++;
if ($this->intLine > $this->intRowMax) {
// 処理行数がMAXを超えた場合
return false;
}
// 1行データ取得・行指定
$arrData = $this->getLineDirect($this->intLine);
// データ配列を返す
return $arrData;
}
// 1行データ取得・行指定
// [引数] $_intLine : 行番号(PHPExcelでは行は1~)
// [戻り値] :データが存在した場合は配列データ
// (array("A" => "aaa", "B" => "bbbb")の様にカラム文字列でアクセス可能 )
// :false:行最終
public function getLineDirect($_intLine) {
$arrData = array();
for($c = 0; $c < $this->intColMax; $c++) { //colは [0] 始まりで [0] = "A" となる(rowは [1] 始まり)
$arrData[$c] = $this->objWorksheet->getCellByColumnAndRow($c, $_intLine)->getValue();
if (is_null($arrData[$c])) {
$arrData[$c] = "";
} else {
$arrData[$c] = trim($arrData[$c]);
}
// 変換後のキーと値で設定
$arrData[$this->arrColName[$c]] = $arrData[$c];
}
// データ配列を返す
return $arrData;
}
}
?>
クラスの中で、子クラスから参照される変数と、子クラスによりオーバーライドされるメソッドを protected として宣言します。 そこで、protected の部分を作成しCSVファイル読込クラスを宣言します。
<?php
// CSVファイル読込クラス(エクセル読込クラスから派生)
class cCsvGet extends cExcelGet
{
// コンストラクタ
// [引数] $_strFilePath string : ファイルフルパス名
public function __construct ($_strFilePath)
{
parent::__construct($_strFilePath);
}
protected function openWorksheet() {
// CSV読込クラス生成
$objReader = new PHPExcel_Reader_CSV();
// CSVファイルの文字コード:Shift-JIS
$objReader->setInputEncoding('SJIS');
// 区切り記号(カンマ)
$objReader->setDelimiter(',');
// 文字列の囲み文字(")
$objReader->setEnclosure('"');
// シートの位置
$objReader->setSheetIndex(0);
// 読込の結果としてPHPExcelオブジェクトが返る
$objPHPExcel = $objReader->load($this->strFilePath);
// ワークシートオブジェクト取得
$this->objWorksheet = $objPHPExcel->getActiveSheet();
}
}
?>
このクラスを使って以下のCSVファイルを読込んでみます。("ctest1.csv"ファイル)
aaaaaaaaaa,bbbbbb,cccccccc,dd 123,456,1000,2000 a01,b01,2000 c02,d03,500,600
以下が読込を実行するソースです。
<?php
// クラスファイル読込
require_once 'cExcelGet.php';
require_once 'cCsvGet.php';
// [cCsvGet]クラスの生成
$insCsv = new cCsvGet("ctest1.csv");
// ファイルオープン
if ($insCsv->open() == true) {
while ($arrData = $insCsv->getLine()) {
$str = "";
for ($i = 0; $i < $insCsv->getColMax() ; $i++) {
if ($str != "") $str .= ",";
$str .= $arrData[$i];
}
$str .= "<br>\n";
echo $str;
}
} else {
echo "open error.";
}
?>
これを実行するとブラウザに以下の様に表示されます。
aaaaaaaaaa,bbbbbb,cccccccc,dd 123,456,1000,2000 a01,b01,2000, c02,d03,500,600
以上、有用性があると言いましたが、特に使い勝手が良くないかもしれませんので、改良して使って頂ければと思います。
コメント