作成日:2020-07-21, 更新日:2020-07-27
基本型
下記をもとにクラスを作ってやれば良さげ。
<?php
require 'vendor/autoload.php';
// 使うファイルをuseで設定していく
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
if ( !defined('DS') ) {
define('DS', DIRECTORY_SEPARATOR);
}
// 各PATHや対象にしたいシート名
$use_file_path = __DIR__.DS.'hello world.xlsx';
$use_excel_sheet = 'Worksheet';
$output_file_path = __DIR__.DS.'add_img.xlsx';
// Excelファイルを読み込み、シートを指定する
$reader = new XlsxReader();
$excel = $reader->load($use_file_path);
$sheet = $excel->getSheetByName($use_excel_sheet);
// ▼ごにょごにょしたい処理を追加
~ 略 ~
// ▲ごにょごにょしたい処理を追加
// サーバに出力
$writer = new XlsxWriter($excel);
$writer->save($output_file_path);
// // サーバに出力じゃなくダウンロードさせたいとき
// $dl_file_name = 'dl_hello_world.xlsx';
// header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;');
// header('Content-Disposition: attachment; filename="'.$dl_file_name.'"');
// header('Cache-Control: max-age=0');
// $writer = new XlsxWriter($excel);
// $writer->save('php://output');
// exit;
ごにょごにょしたい処理
上記の「~ 略 ~」ってトコに下記内容を記載
セルに値を追加
$sheet->setCellValue('A2', 'ほげほげ');
結合したセルに値を追加
一つ目のセルを指定すれば大丈夫っぽい
▼「C2」と「C3」を結合している場合
$sheet->setCellValue('C2', 'ほげほげ');
▼「C2」と「D2」を結合している場合
$sheet->setCellValue('C2', 'ほげほげ');
数式が絡むとき
PHPでごにょごにょしたからと言って数式が消えるわけではない。
例:Excelファイルの「C1」に「=A1*B1」という書式があった場合
→A1、B1にそれぞれ値をセットすると「C1」に「=A1*B1」の計算結果が入る
画像の追加
$img_path = '〇〇〇/〇〇〇.jpg';
(new Drawing())
->setPath($img_path) // 画像のパス
->setCoordinates('A1') // セルの指定(※大きい画像はセルをはみ出す)
->setWidth(200) // 画像の幅(px)
->setHeight(100) // 画像の高さ(px)
->setResizeProportional(false) // false:アスペクト比を維持
->setWorksheet($sheet); // 対象のシート
▼別途、最初にuseが必要
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
まとめて流し込む
$start_cell = 'A3';
$add_data = array(
array(1, 2, 3), // A3, B3, C3に格納される値
array('hoge1'), // A4に格納される値
array('foo1', 'foo2'), // A5, B5に格納される値
);
$excel->getActiveSheet()->fromArray($add_data, NULL, $start_cell, true);
※第二引数:特定の値があったときに書き込みを拒否?
シートの複製
$ori_excel_sheet = 'Worksheet';
$new_excel_sheet = 'ほげ';
// シートのコピーをとり、シート名を設定
$cloned_excel_sheet = clone $excel->getSheetByName($ori_excel_sheet);
$cloned_excel_sheet->setTitle($new_excel_sheet);
// コピーしたシートを追加
$excel->addSheet($cloned_excel_sheet);
// 新しいシートを指定して、値を追加
$sheet = $excel->getSheetByName($new_excel_sheet);
$sheet->setCellValue('A2', 'ももたろう');
※「$excel->addSheet()」のトコで「addSheet()」を「addExternalSheet()」にすれば別のExcelファイルにコピーしたシートを複製できるっぽい(未調査)
書式指定
▼「文字列:001」を「数値:1」として入力
$sheet->setCellValueExplicit('A2', '001', DataType::TYPE_NUMERIC);
▼別途必要
use PhpOffice\PhpSpreadsheet\Cell\DataType;
▼指定できる内容と指定方法
・文字:TYPE_STRING
・数値:TYPE_NUMERIC
・true / false:TYPE_BOOL
・null:TYPE_NULL
・式:TYPE_FORMULA
「true / false:TYPE_BOOL」について
「0(数値 or 文字)」なら「FALSE」が入力される。
「0(数値 or 文字)」じゃないなら「TRUE」が入力される。
※nullや空白のときは、未調査。
「式:TYPE_FORMULA」について
「=」は必要。
・「A2+A3」としたとき→「=2+A3」がExcelに入力される
・「=A2+A3」としたとき→「=A2+A3」がExcelに入力される
※何か別の指定 or 設定の問題?
改行を許可
$cell = 'A1'; $val = "ほげ\nもげ\n"; $sheet->getStyle($cell)->getAlignment()->setWrapText(true); $sheet->setCellValue($cell, $val);
範囲指定
最初(左上)のセルと最後(右下)のセルの「:」でつなぐ
$cell = 'A1:C3';
日時
$pValue = '2020-07-22 09:22:00'; $cell = 'A1'; // 日付の書式 $date_format = 'yyyy-mm-dd hh:mm:ss'; $conv_value = Date::PHPToExcel($pValue); $sheet->getStyle($cell)->getNumberFormat()->setFormatCode($date_format); $sheet->setCellValue($cell, $conv_value);
▼別途必要
use PhpOffice\PhpSpreadsheet\Shared\Date;
郵便番号、カンマ区切りの数字
$pValue = '1234567'; $cell = 'A1'; // 郵便番号:「$format = '000-0000';」(「$pValue=1234567」は「123-4567」になる) // カンマあり:「$format = '#,##0';」 $format = '000-0000'; $sheet->getStyle($cell)->getNumberFormat()->setFormatCode($format); $sheet->setCellValueExplicit($cell, $pValue, DataType::TYPE_NUMERIC);
▼別途必要
use PhpOffice\PhpSpreadsheet\Cell\DataType;
値の取得
$cell = 'A1'; echo $sheet->getCell($cell)->getValue();
値が式の場合
たとえば・・・「セル:C1」に「=A1+B2」が入っているとき。
▼計算式である「=A1+B2」を取得する
$cell = 'C1'; $val = $sheet->getCell($cell)->getValue();
▼計算式である「=A1+B2」の計算結果を取得する
$cell = 'C1'; $val = $sheet->getCell($cell)->getCalculatedValue();
getCalculatedValue()
計算式を取得することがないなら常に「getCalculatedValue()」を使うのも良さげな気がする
行・列の追加・削除
行・列の追加
できるのは、指定した行(列)の「前」に追加。「後」に追加はできないっぽい。
・insertNewColumnBefore()
・insertNewRowBefore()
▼「列:B」の前に「3列」追加
$sheet->insertNewColumnBefore('B', 3);
▼「行:2」の前に「4行」追加
$sheet->insertNewRowBefore(2, 4);
行・列の削除
・removeRow()
・removeColumn()
コピーした行・列の追加
無い。
元データをコピーして、空行を追加して、コピーした元データをペーストする感じ。
セルの追加
無いっぽい(未調査)