【PHP】 PHPExcel 行の動的追加

PHPExcelでは、テンプレートファイルを読み込むことができるため帳票なんかを作成するのに便利です。

 

しかし、帳票の中には件数によって行数の増減がしたいというものがあると思います。

そのため、テンプレートファイルで行数をどれくらい用意すればいいのかが問題になります。

すべてのパターンに対応するなんていうのは不可能で、かといって行数を限定してしまうのでは使い勝手が悪すぎます。

 

そこで今回はプログラムの中で動的に行数を増やす方法を学んでいきましょう。

まず、テンプレートファイルを用意します。

行追加1

 

今回は、ヘッダーとフッターのみの表を使い、この間に行を追加していきます。

<?php
set_include_path(get_include_path().PATH_SEPARATOR.$_SERVER["DOCUMENT_ROOT"]."/Classes/");

include_once 'PHPExcel.php';
include_once 'PHPExcel/IOFactory.php';

$reader = PHPExcel_IOFactory::createReader('Excel2007');
$book = $reader -> load("template.xlsx");
$book -> setActiveSheetIndex(0);
$sheet = $book -> getActiveSheet();

//枠線の設定
$cell_style = array(
		'borders' => array(
				'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
				'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
				'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
				'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
		)
);

$connect = new mysqli("localhost", "user", "password");
$sql = "select * from userData";

$writer = PHPExcel_IOFactory::createWriter($book, 'Excel2007');

if($result = $connect -> query($sql)){
	$row = 4;
	while($data = $result-> fetch_assoc()){

		//行の挿入
		$sheet -> insertNewRowBefore($row, 2);
		//書き方1
		//セル結合
		$sheet -> mergeCells('B'.$row.':B'.($row+1));
		//枠線表示
		$sheet -> getStyle("B".$row.":B".($row+1)) -> applyFromArray($cell_style);
		//文字中央揃え
		$sheet -> getStyle("B".$row.":B".($row+1)) ->getAlignment() -> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
		//背景色
		$sheet -> getStyle("B".$row.":B".($row+1)) -> getFill() -> setFillType(PHPExcel_Style_Fill::FILL_NONE);
		$sheet -> setCellValue("B".$row, $data["id"]);

		//書き方2
		$sheet -> mergeCells("C".$row.":C".($row+1));
		$sheet -> getStyle("C".$row.":C".($row+1)) -> applyFromArray($cell_style)
						-> getAlignment() -> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
		$sheet -> getStyle("C".$row.":C".($row+1)) -> getFill() -> setFillType(PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN);
		$sheet -> setCellValue("C".$row, $data["name"]);

		//書き方3
		$sheet -> mergeCells("D".$row.":D".($row+1));
		$sheet -> getStyle("D".$row.":D".($row+1)) -> getAlignment() -> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
						 -> applyFromArray($cell_style);
		$sheet -> getStyle("D".$row.":D".($row+1)) -> getFill() -> setFillType(PHPExcel_Style_Fill::FILL_GRADIENT_PATH);
		$sheet -> setCellValue("D".$row, $data["age"]);

		//書き方4
		$sheet -> mergeCells("E".$row.":E".($row+1));
		$sheet -> getStyle("E".$row.":E".($row+1)) -> getAlignment() -> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
		$sheet -> getStyle("E".$row.":E".($row+1)) -> applyFromArray($cell_style);
		$sheet -> getStyle("E".$row.":E".($row+1)) -> getFill() -> setFillType(PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR);
		$sheet -> setCellValue("E".$row, $data["birth"]);

		$writer -> save("insertRow.xlsx");
		$row +=2;

	}
	$result -> close();
}

$connect -> close();
?>

そして、作成できたのがこちらです。

行追加2

 

きちんとヘッダーとフッターの間に行が必要分挿入されています。

 

それでは、プログラムを見ていきましょう。

今回一番重要なところは行を挿入する処理です。

//$rowNumberは挿入したい場所の行番号
//$rowは挿入したい行数
insertNewRowBefore($rownumber, $row);

ここさえ出来ていれば表は作れます。

しかし、これではただ単に行を挿入しただけで見栄えがよくありません。

そのため、セルの装飾処理が必要になってきます。

今回行った装飾処理は4つです。

 

1つ目はセルの結合です。

//どのセルからどのセルを結合するか指定
mergeCells("A1:D10");

2つ目は枠線設定です。

//枠線の設定
$cell_style = array(
		'borders' => array(
				'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
				'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
				'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
				'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
		)
);

//枠線の表示
applyFromArray($cell_style);

3つ目は文字揃えです。

//セルのアライメント取得
getAlignment();
//文字揃えの指定。中央以外にも右端、左端など
setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)

4つ目は背景色です。

//セルの色取得
getFill()
//背景色の塗り方指定
setFillType(PHPExcel_Style_Fill::FILL_NONE);

列によって背景が違うのはsetFillType()で指定している値が違うからです。

 

これでテンプレートにはヘッダーとフッターを定義しておき

必要な分はプログラムで生成することが出来ます。