February 8, 2014

PHPExcelでOpenOfficeの表計算ドキュメントを読み込んでみる

PHPExcelという、PHPでエクセルやOpenOfficeの表計算ドキュメントを読み込めるライブラリがありました。
https://github.com/PHPOffice/PHPExcel
https://packagist.org/packages/phpoffice/phpexcel

試しに、OpenOfficeの表計算ドキュメントを読み込んでみました。

1. PHPExcelをインストールします。以下はcomposer.jsonの例です。
{
    "require": {
        "phpoffice/phpexcel": "1.*"
    }
}


2. 1シートのみを前提で読み込んでます。

シートはこんな感じです。
* 面倒なので直しませんが"テストB5"じゃなくて"テストB6"でしたね。。。

ソースです。
<?php

require_once('vendor/autoload.php');

$ods = PHPExcel_IOFactory::load("test.ods");

$ods->setActiveSheetIndex(0);
$sheet = $ods->getActiveSheet();

$highestRowIndex = $sheet->getHighestRow();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());

$data = [];
for ($i = 1; $i <= $highestRowIndex; $i++) {
    $values = [];
    for ($j = 0; $j < $highestColumnIndex; $j++) {
        $values[] = $sheet->getCellByColumnAndRow($j, $i)->getValue();
    }
    $data[] = $values;
}

var_dump($data);
結果です。
array(6) {
  [0]=>
  array(4) {
    [0]=>
    string(11) "テストA1"
    [1]=>
    string(11) "テストB1"
    [2]=>
    NULL
    [3]=>
    string(11) "テストD1"
  }
  [1]=>
  array(4) {
    [0]=>
    string(11) "テストA2"
    [1]=>
    string(11) "テストB2"
    [2]=>
    NULL
    [3]=>
    NULL
  }
  [2]=>
  array(4) {
    [0]=>
    NULL
    [1]=>
    NULL
    [2]=>
    string(11) "テストC3"
    [3]=>
    NULL
  }
  [3]=>
  array(4) {
    [0]=>
    NULL
    [1]=>
    NULL
    [2]=>
    NULL
    [3]=>
    NULL
  }
  [4]=>
  array(4) {
    [0]=>
    NULL
    [1]=>
    NULL
    [2]=>
    NULL
    [3]=>
    NULL
  }
  [5]=>
  array(4) {
    [0]=>
    NULL
    [1]=>
    string(11) "テストB5"
    [2]=>
    NULL
    [3]=>
    NULL
  }
}


3. 複数シートの場合もやってみました。

シート構成は意地悪な感じで
  • 1シート目は先程と同様
  • 2シート目は空
  • 3シート目は空
  • 4シート目はこんな感じです

  • 5シート目は空

です。

ソースです。
<?php

require_once('vendor/autoload.php');

$ods = PHPExcel_IOFactory::load("test.ods");

$allData = [];
$sheets = $ods->getAllSheets();
foreach ($sheets as $sheet) {
    /** @var PHPExcel_Worksheet $sheet */

    $highestRowIndex = $sheet->getHighestRow();
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());

    $data = [];
    for ($i = 1; $i <= $highestRowIndex; $i++) {
        $values = [];
        for ($j = 0; $j < $highestColumnIndex; $j++) {
            $values[] = $sheet->getCellByColumnAndRow($j, $i)->getValue();
        }
        $data[] = $values;
    }

    $allData[] = $data;
}

var_dump($allData);
結果です。
array(6) {
  [0]=>
  array(6) {
    [0]=>
    array(4) {
      [0]=>
      string(11) "テストA1"
      [1]=>
      string(11) "テストB1"
      [2]=>
      NULL
      [3]=>
      string(11) "テストD1"
    }
    [1]=>
    array(4) {
      [0]=>
      string(11) "テストA2"
      [1]=>
      string(11) "テストB2"
      [2]=>
      NULL
      [3]=>
      NULL
    }
    [2]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      NULL
      [2]=>
      string(11) "テストC3"
      [3]=>
      NULL
    }
    [3]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      NULL
      [2]=>
      NULL
      [3]=>
      NULL
    }
    [4]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      NULL
      [2]=>
      NULL
      [3]=>
      NULL
    }
    [5]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      string(11) "テストB5"
      [2]=>
      NULL
      [3]=>
      NULL
    }
  }
  [1]=>
  array(1) {
    [0]=>
    array(1) {
      [0]=>
      NULL
    }
  }
  [2]=>
  array(1) {
    [0]=>
    array(1) {
      [0]=>
      NULL
    }
  }
  [3]=>
  array(6) {
    [0]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      string(11) "テストB1"
      [2]=>
      string(11) "テストC1"
      [3]=>
      NULL
    }
    [1]=>
    array(4) {
      [0]=>
      string(11) "テストA2"
      [1]=>
      string(11) "テストB2"
      [2]=>
      string(11) "テストC2"
      [3]=>
      NULL
    }
    [2]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      NULL
      [2]=>
      NULL
      [3]=>
      string(11) "テストD3"
    }
    [3]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      NULL
      [2]=>
      NULL
      [3]=>
      NULL
    }
    [4]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      NULL
      [2]=>
      NULL
      [3]=>
      NULL
    }
    [5]=>
    array(4) {
      [0]=>
      NULL
      [1]=>
      NULL
      [2]=>
      string(11) "テストC6"
      [3]=>
      NULL
    }
  }
  [4]=>
  array(1) {
    [0]=>
    array(1) {
      [0]=>
      NULL
    }
  }
  [5]=>
  array(1) {
    [0]=>
    array(1) {
      [0]=>
      NULL
    }
  }
}
簡単ですね。複数シートの場合、どうも1シート分余計なデータが有りますが、まあどうにでもなるかなと思います。

No comments:

Post a Comment