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)
composer require phpoffice/phpexcel
composer require phpoffice/phpspreadsheet
読み込みオブジェクトの生成 (.xlsx) / ファイルの読み込み (.xlsx)
$reader = PHPExcel_IOFactory::createReader('Excel2007');
$spreadsheet = $reader->load($path);
// use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = IOFactory::load($path);
// or
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load($path);
読み込むシートを限定する
$reader->setLoadSheetsOnly(array('シート名'));
読み込む情報を値のみにする
$reader->setReadDataOnly(true);
書き込みオブジェクトの生成 (.xlsx) / ファイル書き込み
$writer = PHPExcel_IOFactory::createWriter($spreadsheet, 'Excel2007');
$writer->save($path);
// use PhpOffice\PhpSpreadsheet\IOFactory;
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($path);
ワークブックの生成
$spreadsheet = new PHPExcel();
// use PhpOffice\PhpSpreadsheet\Spreadsheet;
$spreadsheet = new Spreadsheet();
シートの取得 (シート名から)
$sheet = $spreadsheet->getSheetByName('シート名');
シートの取得 (index から)
$sheet = $spreadsheet->getSheet(0); // 最初のシート
セルオブジェクトの取得 (A1形式)
$cell = $sheet->getCell('A1');
セルオブジェクトの取得 (行番号、列番号指定)
$cell = $sheet->getCellByColumnAndRow(0, 1); // A1 ($col (0 == A), $row (1))
$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... です。
セル値の取得 (計算式など内部の値)
$v = $cell->getValue();
セル値の取得 (書式通りに)
$v = $cell->getFormattedValue();
セル値の取得 (計算された値として)
$v = $cell->getCalculatedValue();
セル値の一括取得 (計算された値として)
$vArray = $cell->rangeToArray('A1:B10'); // A1~B10 までの配列
セル値の取得 (DateTimeとして)
$date = PHPExcel_Shared_Date::ExcelToPHPObject( $sheet->getCell('A1')->getValue() );
//use \PhpOffice\PhpSpreadsheet\Shared\Date;
$date = Date::excelToDateTimeObject( $sheet->getCell('A1')->getValue() );
セル値の設定 (計算式など内部の値)
$cell->setValue('=SUM(A1:A10)');
セル値の設定 (明示的に文字列として)
$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); // セルオブジェクト経由でセット。これもデータ型を省略しても可
//use \PhpOffice\PhpSpreadsheet\Cell\DataType;
$sheet->setCellValueExplicit('A1', '012345', DataType::TYPE_STRING); // A1に文字として 012345 をセット (PHPExcelと違ってデータ型省略不可)
// or
$cell->setValueExplicit('012345', DataType::TYPE_STRING); // セルオブジェクト経由でセット
セル値の設定 (日付として)
$date = new DateTime(); // 文字列 ('2020-01-01' など) でも可
$sheet->setCellValue('A1', PHPExcel_Shared_Date::PHPToExcel($date)); // A1 に日付の値を設定
$sheet->getStyle('A1')->getNumberFormat()->setFormatCode('yyyy/mm/dd'); // A1 に日付書式設定
//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 に日付書式設定
セルの結合
$sheet->mergeCells('A1:B1'); // A1~B1を結合
セルの結合解除
$sheet->unmergeCells('A1:B1'); // A1~B1の結合を解除
行の挿入
$sheet->insertNewRowBefore(2, 1); // 2行目の上に1行分挿入
行の削除
$sheet->removeRow(2, 3); // 2行目から3行分削除
列幅の設定
$sheet->getColumnDimension('A')->setWidth(14); // A列の幅を 14 (おおよそ 14) に
列幅の設定 (自動)
$sheet->getColumnDimension('A')->setAutoSize(true); // A列の幅を自動調整
画像の追加
$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());
$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());
印刷範囲の設定
$sheet->getPageSetup()->setPrintArea("A1:I10"); // A1~I10までの範囲で印刷
印刷ページの設定 (「次のページに合わせて印刷」)
$sheet->getPageSetup()->setFitToWidth(1); // 横を1ページに合わせる (自動にしたい場合は 0)
$sheet->getPageSetup()->setFitToHeight(1); // 縦を1ページに合わせる (同上)
印刷サイズの設定
// 印刷サイズをA4横に設定
$sheet->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
$sheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);
// 印刷サイズをA4横に設定
$sheet->getPageSetup()->setPaperSize(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::PAPERSIZE_A4);
$sheet->getPageSetup()->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE);
ページ余白の設定
$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);
ヘッダー、フッターのテキスト設定
$sheet->getHeaderFooter()->setOddHeader( '&L左側 &C中央 &R右側' ); // &Lで左側、&Cで中央、&Rで右側にテキスト配置
$sheet->getHeaderFooter()->setOddFooter( '&RPage &P / &N' ); // &R = 右側、&P = 現在ページ番号、&N = 総ページ数
&L
などの意味については Recipes - PhpSpreadsheet Documentation #Setting the print header and footer of a worksheet を参照してください。
名前付き値取得 (ブック)
$namedRange = $spreadsheet->getNamedRange('名前');
$values = $namedRange->getWorksheet()->namedRangeToArray('名前');
名前付き値取得 (シート)
$values = $sheet->namedRangeToArray('名前');
計算キャッシュ無効化
PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(false);
// use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
Calculation::getInstance($spreadsheet)->setCalculationCacheEnabled(false);
数式の事前計算無効化
$writer->setPreCalculateFormulas(false);
A1形式の列名を取得(1→A, 2→B)
$colName = PHPExcel_Worksheet::stringFromColumnIndex(1); // A
// use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
$colName = Coordinate::stringFromColumnIndex(1); // A
参考
- Welcome to PhpSpreadsheet's documentation - PhpSpreadsheet Documentation
- Namespaces | PhpSpreadsheet
更新履歴
- 2019/04/29 ページの構成を変更しました。(表形式だと見づらかったため) また、印刷などの項目を追加しました。
- 2018/04/29 初版