[ PHPExcel ] 範囲指定してセルをコピーする ( setCellValue / duplicateStyle )

Pocket

ここでは、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 である
  • 結合されたセルがある場合は、上記の方法では解除されてしまう

セル結合や複雑なシートには不向きだと思われます。また、処理には結構な時間が掛かります。

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *