忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP PhpSpreadsheet エクセルファイルをPHPの配列データへの読み込みについて(rangeToArray)


今回は 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'」を読込んで HTMLTABLE タグを使って表形式での表示を行います。

<?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>

ブラウザには以下の様に表示されます。












PR

コメント

コメントを書く