MENU

PHPExcelを使ってExcelファイルを読み込んで編集や保存ダウンロードする

PHPでExcelファイルを編集できるかどうか調べていると非常に高機能なライブラリがあったので紹介します。色々なことができるのですが、基本的なファイルの読み込みや編集、保存方法を説明していきます。

ダウンロード

https://phpexcel.codeplex.com/

ダウンロードするとClassesフォルダがあると思います。このフォルダ内のファイルを自分のディレクトリへコピーして使います。

サンプルデータ

今回はサンプルデータとして、住所.jpの愛知県のCSVファイルをExcelで開いて、xlsファイルとして保存したものを使います。約9000行くらいある大容量データです。

http://jusyo.jp/csv/new.php

読み込み


require_once 'PHPExcel.php';

// 読み込むExcelファイル
$input = 'sample.xls';
// ファイル拡張子
$extension = pathinfo($input, PATHINFO_EXTENSION);

// xlsファイルのとき
if ($extension === 'xls')
{
  $reader = PHPExcel_IOFactory::createReader('Excel5');
}
// xlsxファイルのとき
else if ($extension === 'xlsx')
{
  $reader = PHPExcel_IOFactory::createReader('Excel2007');
}

// 読み込む
$excel = $reader->load($input);

// 最初のシートを取得
$sheet = $excel->getActiveSheet();

セルを取得

セルのデータを取得する方法は色々あるので、そのうちのいくつかを紹介します。

行と列の数を取得してループ


// 行
for ($j = 0; $j < $sheet->getHighestRow(); ++$j)
{
  // 列
  for ($i = 0; $i < PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()); ++$i)
  {
    // 各セルの値を取得(列番号は0から、行番号は1から始まるので注意)
    echo $sheet->getCellByColumnAndRow($i, $j+1)->getValue();
  }
}

行数は getHighestRow()、列数は getHighestColumn で取得することができます。ただし、列数はA6みたいに取得されるので、columnIndexFromString() で数値にしています。

イテレータ


// 行
foreach ($sheet->getRowIterator() as $row)
{
  // セル
  foreach ($row->getCellIterator() as $cell)
  {
    // 各セルの値を取得
    echo $cell->getValue();
  }
}

イテレータを使うとすっきり書けます。

一気に配列化


// 各セルの値が配列で取得できる
$cells = $sheet->toArray();
// A2のセル
echo $cells[1][0];

範囲指定で配列化


// B1からC4の範囲を配列化
$cells = $sheet->rangeToArray('B1:C4');
// B1のセル
echo $cells[0][0];

列番号で指定したい場合は以下のようにします。


// B1からC4の範囲を配列化
$cells = $sheet->rangeToArray(PHPExcel_Cell::stringFromColumnIndex(1).'1:'.PHPExcel_Cell::stringFromColumnIndex(2).'4');

セルを編集


// A1に値を設定
$sheet->setCellValue('A1', 'テスト');
$sheet->setCellValueByColumnAndRow(0, 1, 'テスト');

セル番地セル座標で指定する方法の2種類あります。

保存

ファイルとして出力


// xlsファイルのとき
if ($extension === 'xls')
{
  $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
}
// xlsxファイルのとき
else if ($extension === 'xlsx')
{
  $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
}

// 保存する
$writer->save('output.'.$extension);

ダウンロードさせる


// xlsファイルのとき
if ($extension === 'xls')
{
  $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
}
// xlsxファイルのとき
else if ($extension === 'xlsx')
{
  $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
}

// ダウンロードさせる
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename='output.$extension");
header("Cache-Control: max-age=0");

// 保存する
$writer->save('php://output');