ここでは、PHPExcel を使って範囲指定したセルのコピーを行うサンプルを掲載しています。動作確認を行ったバージョンは PHPExcel-1.7.6 になります。
スポンサーリンク
PHPExcel-1.7.6 では(複数)行コピーや(複数)列コピーはできません。セルのコピーを繰り返し処理する必要があります。下記に示すサンプルでは一般的な Excel のセル位置を表す書式 (ex. A1:B10)ではなく、プログラムから扱いやすいように列と行を数値で扱っています。
範囲を指定してセルをコピー
include_once 'PHPExcel.php';
include_once 'PHPExcel/IOFactory.php';
// テンプレートファイルのパス
$template_path = 'path/to/rangecellcopy.xls';
// テンプレートファイルのロード
$excel = PHPExcel_IOFactory::load($template_path);
// 先頭のページを取得
$sheet = $excel->getSheet(0);
$colOffset = 20; // コピー先 列のオフセット値
$rowOffset = 20; // コピー先 行のオフセット値
/*
* (0,1)から(9,10) の範囲を (20, 21)から(29, 30) の範囲にコピーする
*/
for($col=0;$col<10;$col++) {
for($row=1;$row<11;$row++) { // セルを取得 $cell = $sheet->getCellByColumnAndRow($col, $row);
// セルスタイルを取得
$style = $sheet->getStyleByColumnAndRow($col, $row);
// 数値から列文字列に変換する (0,1) → A1
$offsetCell = PHPExcel_Cell::stringFromColumnIndex($col + $colOffset) . (string)($row + $rowOffset);
// セル値をコピー
$sheet->setCellValue($offsetCell, $cell->getValue());
// スタイルをコピー
$sheet->duplicateStyle($style, $offsetCell);
}
}
// Excel 97-2003 形式で作成し、ブラウザに出力する
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="excel97-2003.xls"');
header('Cache-Control: max-age=0');
$writer = PHPExcel_IOFactory::createWriter($excel, "Excel5");
$writer->save('php://output');
注意事項
- PHPExcel では、列の開始インスデックスは 0 であり、行の開始インデックスは 1 である
- 結合されたセルがある場合は、上記の方法では解除されてしまう
セル結合や複雑なシートには不向きだと思われます。また、処理には結構な時間が掛かります。