PHPExcel と PhpSpreadsheet の比較

このページは、 PHPExcel と PhpSpreadSheet の違いをまとめる予定のページです。

目次

型の比較表

※ 変数名は「操作の比較」の各コードで使用している例示の変数名です。

PHPExcel PhpSpreadsheet
読み込みオブジェクト ($reader) PHPExcel_Reader_Excel2007 等 PhpOffice\PhpSpreadsheet\Reader\Xlsx 等
書き込みオブジェクト ($writer) PHPExcel_Writer_Excel2007 等 PhpOffice\PhpSpreadsheet\Writer\Xlsx 等
ワークブック ($spreadsheet) PHPExcel PhpOffice\PhpSpreadsheet\Spreadsheet
ワークシート ($sheet) PHPExcel_Worksheet PhpOffice\PhpSpreadsheet\Worksheet\Worksheet
セル ($cell) PHPExcel_Cell PhpOffice\PhpSpreadsheet\Cell\Cell
名前付範囲 ($namedRange) PHPExcel_NamedRange PhpOffice\PhpSpreadsheet\NamedRange
描画オブジェクト ($drawing) PHPExcel_Worksheet_Drawing PhpOffice\PhpSpreadsheet\Worksheet\Drawing

操作の比較

インストール (composer)

PHPExcel
composer require phpoffice/phpexcel
PhpSpreadsheet
composer require phpoffice/phpspreadsheet

読み込みオブジェクトの生成 (.xlsx) / ファイルの読み込み (.xlsx)

PHPExcel
$reader = PHPExcel_IOFactory::createReader('Excel2007');
$spreadsheet = $reader->load($path);
PhpSpreadsheet
// use PhpOffice\PhpSpreadsheet\IOFactory;

$spreadsheet = IOFactory::load($path);
// or
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load($path);

読み込むシートを限定する

PHPExcel, PhpSpreadsheet
$reader->setLoadSheetsOnly(array('シート名'));

読み込む情報を値のみにする

PHPExcel, PhpSpreadsheet
$reader->setReadDataOnly(true);

書き込みオブジェクトの生成 (.xlsx) / ファイル書き込み

PHPExcel
$writer = PHPExcel_IOFactory::createWriter($spreadsheet, 'Excel2007');
$writer->save($path);
PhpSpreadsheet
// use PhpOffice\PhpSpreadsheet\IOFactory;
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($path);

ワークブックの生成

PHPExcel
$spreadsheet = new PHPExcel();
PhpSpreadsheet
// use PhpOffice\PhpSpreadsheet\Spreadsheet;
$spreadsheet = new Spreadsheet();

シートの取得 (シート名から)

PHPExcel, PhpSpreadsheet
$sheet = $spreadsheet->getSheetByName('シート名');

シートの取得 (index から)

PHPExcel, PhpSpreadsheet
$sheet = $spreadsheet->getSheet(0); // 最初のシート

セルオブジェクトの取得 (A1形式)

PHPExcel, PhpSpreadsheet
$cell = $sheet->getCell('A1');

セルオブジェクトの取得 (行番号、列番号指定)

PHPExcel
$cell = $sheet->getCellByColumnAndRow(0, 1); // A1 ($col (0 == A), $row (1))
PhpSpreadsheet
$cell = $sheet->getCellByColumnAndRow(1, 1); // A1 ($col (1 == A), $row (1))

***ByColumnAndRow($col, $row) の列($col)は PHPExcel の場合 0 == A, 1 == B... ですが、PhpSpreadSheet の場合 1 == A, 2 == B... です。

セル値の取得 (計算式など内部の値)

PHPExcel, PhpSpreadsheet
$v = $cell->getValue();

セル値の取得 (書式通りに)

PHPExcel, PhpSpreadsheet
$v = $cell->getFormattedValue();

セル値の取得 (計算された値として)

PHPExcel, PhpSpreadsheet
$v = $cell->getCalculatedValue();

セル値の一括取得 (計算された値として)

PHPExcel, PhpSpreadsheet
$vArray = $cell->rangeToArray('A1:B10'); // A1~B10 までの配列

セル値の取得 (DateTimeとして)

PHPExcel
$date = PHPExcel_Shared_Date::ExcelToPHPObject( $sheet->getCell('A1')->getValue() );
PhpSpreadsheet
//use \PhpOffice\PhpSpreadsheet\Shared\Date;
$date = Date::excelToDateTimeObject( $sheet->getCell('A1')->getValue() );

セル値の設定 (計算式など内部の値)

PHPExcel, PhpSpreadsheet
$cell->setValue('=SUM(A1:A10)');

セル値の設定 (明示的に文字列として)

PHPExcel
$sheet->setCellValueExplicit('A1', '012345', PHPExcel_Cell_DataType::TYPE_STRING); // A1に文字として 012345 をセット
// or
$sheet->setCellValueExplicit('A1', '012345'); // データ型の指定を省略しても可 (文字列としてセット)
// or
$cell->setValueExplicit('012345', PHPExcel_Cell_DataType::TYPE_STRING); // セルオブジェクト経由でセット。これもデータ型を省略しても可
PhpSpreadsheet
//use \PhpOffice\PhpSpreadsheet\Cell\DataType;
$sheet->setCellValueExplicit('A1', '012345', DataType::TYPE_STRING); // A1に文字として 012345 をセット (PHPExcelと違ってデータ型省略不可)
// or
$cell->setValueExplicit('012345', DataType::TYPE_STRING); // セルオブジェクト経由でセット

セル値の設定 (日付として)

PHPExcel
$date = new DateTime(); // 文字列 ('2020-01-01' など) でも可
$sheet->setCellValue('A1', PHPExcel_Shared_Date::PHPToExcel($date)); // A1 に日付の値を設定
$sheet->getStyle('A1')->getNumberFormat()->setFormatCode('yyyy/mm/dd');  // A1 に日付書式設定
PhpSpreadsheet
//use \PhpOffice\PhpSpreadsheet\Shared\Date;
$date = new \DateTime(); // 文字列 ('2020-01-01' など) でも可
$sheet->setCellValue('A1', Date::PHPToExcel($date)); // A1 に実行時の日付の値を設定
$sheet->getStyle('A1')->getNumberFormat()->setFormatCode('yyyy/mm/dd'); // A1 に日付書式設定

セルの結合

PHPExcel, PhpSpreadsheet
$sheet->mergeCells('A1:B1'); // A1~B1を結合

セルの結合解除

PHPExcel, PhpSpreadsheet
$sheet->unmergeCells('A1:B1'); // A1~B1の結合を解除

行の挿入

PHPExcel, PhpSpreadsheet
$sheet->insertNewRowBefore(2, 1); // 2行目の上に1行分挿入

行の削除

PHPExcel, PhpSpreadsheet
$sheet->removeRow(2, 3); // 2行目から3行分削除

列幅の設定

PHPExcel, PhpSpreadsheet
$sheet->getColumnDimension('A')->setWidth(14); // A列の幅を 14 (おおよそ 14) に

列幅の設定 (自動)

PHPExcel, PhpSpreadsheet
$sheet->getColumnDimension('A')->setAutoSize(true); // A列の幅を自動調整

画像の追加

PHPExcel
$drawing = new PHPExcel_Worksheet_Drawing();
$drawing->setPath('./logo.png'); // 元の画像パス
$drawing->setCoordinates('B15'); // 追加するセル位置
// $drawing->setResizeProportional(false); // リサイズ時に縦横比率を固定する (false = 固定しない) 
// $drawing->setWidth(100); // 画像の幅 (px)
// $drawing->setHeight(100); // 画像の高さ (px)
// $drawing->setName('Logo'); // 名前
// $drawing->setDescription('Logo'); // 概要
// $drawing->setOffsetX(110); // 位置をずらす
// $drawing->setRotation(25); // 回転 (25 = 25度右に傾く)
// $drawing->getShadow()->setVisible(true); // ドロップシャドウ
// $drawing->getShadow()->setDirection(45); // ドロップシャドウの方向
$drawing->setWorksheet($spreadsheet->getActiveSheet());
PhpSpreadsheet
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setPath('./logo.png'); // 元の画像パス
$drawing->setCoordinates('B15'); // 追加するセル位置
// $drawing->setResizeProportional(false); // リサイズ時に縦横比率を固定する (false = 固定しない) 
// $drawing->setWidth(100); // 画像の幅 (px)
// $drawing->setHeight(100); // 画像の高さ (px)
// $drawing->setName('Logo'); // 名前
// $drawing->setDescription('Logo'); // 概要
// $drawing->setOffsetX(110); // 位置をずらす
// $drawing->setRotation(25); // 回転 (25 = 25度右に傾く)
// $drawing->getShadow()->setVisible(true); // ドロップシャドウ
// $drawing->getShadow()->setDirection(45); // ドロップシャドウの方向
$drawing->setWorksheet($spreadsheet->getActiveSheet());

印刷範囲の設定

PHPExcel, PhpSpreadsheet
$sheet->getPageSetup()->setPrintArea("A1:I10"); // A1~A10までの範囲で印刷

印刷ページの設定 (「次のページに合わせて印刷」)

PHPExcel, PhpSpreadsheet
$sheet->getPageSetup()->setFitToWidth(1); // 横を1ページに合わせる (自動にしたい場合は 0)
$sheet->getPageSetup()->setFitToHeight(1); // 縦を1ページに合わせる (同上)

印刷サイズの設定

PHPExcel
// 印刷サイズをA4横に設定
$sheet->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
$sheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);
PhpSpreadsheet
// 印刷サイズをA4横に設定
$sheet->getPageSetup()->setPaperSize(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::PAPERSIZE_A4);
$sheet->getPageSetup()->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE);

ページ余白の設定

PHPExcel, PhpSpreadsheet
$sheet->getPageMargins()->setTop(1);
$sheet->getPageMargins()->setBottom(1);
$sheet->getPageMargins()->setLeft(0.5);
$sheet->getPageMargins()->setRight(0.5);
$sheet->getPageMargins()->setHeader(0);
$sheet->getPageMargins()->setFooter(0);

ヘッダー、フッターのテキスト設定

PHPExcel, PhpSpreadsheet
$sheet->getHeaderFooter()->setOddHeader( '&L左側 &C中央 &R右側' ); // &Lで左側、&Cで中央、&Rで右側にテキスト配置
$sheet->getHeaderFooter()->setOddFooter( '&RPage &P / &N' ); // &R = 右側、&P = 現在ページ番号、&N = 総ページ数

名前付き値取得 (ブック)

PHPExcel, PhpSpreadsheet
$namedRange = $spreadsheet->getNamedRange('名前');
$values = $namedRange->getWorksheet()->namedRangeToArray('名前');

名前付き値取得 (シート)

PHPExcel, PhpSpreadsheet
$values = $sheet->namedRangeToArray('名前');

計算キャッシュ無効化

PHPExcel
PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(false);
PhpSpreadsheet
// use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
Calculation::getInstance($spreadsheet)->setCalculationCacheEnabled(false);

数式の事前計算無効化

PHPExcel, PhpSpreadsheet
$writer->setPreCalculateFormulas(false);

A1形式の列名を取得(1→A, 2→B)

PHPExcel
$colName = PHPExcel_Worksheet::stringFromColumnIndex(1); // A
PhpSpreadsheet
// use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
$colName = Coordinate::stringFromColumnIndex(1); // A

参考

更新履歴

  • 2019/04/29 ページの構成を変更しました。(表形式だと見づらかったため) また、印刷などの項目を追加しました。
  • 2018/04/29 初版