[PhpSpreadsheet]動的にセルを増やしていく方法のひとつ

参考程度に。

基本はこうする

$sheet->setCellValue('A1', 'あああああああ');

基本通りやることはあんまりない

例えばデータベースで検索して取得したリストとか、複数ある情報を引っ張ってきて載せたいんだけど、という場合。まず厄介なのは、検索条件によりけりなので実際にやってみないと記載数がわからないのでセルをベタ打ちで指定できないということがある。

なので、やってみて良さげだったのは以下の流れ。

  1. 情報を取得して配列にまとめる
  2. 配列を展開しながら記述処理を生成する

検索条件とかは割愛して、こんな感じで配列にする。

<?php
$pdo = new PDO('mysql:host=****;dbname=****;','****','****',[ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]);
$stmt = $pdo->prepare("SELECT * FROM *** WHERE *** IN (***,***)");
$stmt->execute();

$listArray = array();
foreach ($stmt as $row) {
    $column01 = '';
    if(!empty($row['column01'])){ $column01 = $row['column01'];}
    $column02 = '';
    if(!empty($row['column02'])){ $column02 = $row['column02'];}
    $column03 = '';
    if(!empty($row['column03'])){ $column03 = $row['column03'];}
    $listArray[] = [$column01, $column02, $column03];
}

配列($listArray)に情報ごとの配列を突っ込んでいく、見ての通り多次元配列。

で、配列の展開はこんな感じ。

$cel1_Alp = 'A';
$cel1_Num = 1;
$cel2_Alp = 'B';
$cel2_Num = 1;
$cel3_Alp = 'C';
$cel3_Num = 1;

foreach ($listArray as $row) {
    $sheet->setCellValue("{$cel1_Alp}{$cel1_Num}", $row[0]);
    $sheet->setCellValue("{$cel2_Alp}{$cel2_Num}", $row[1]);
    $sheet->setCellValue("{$cel3_Alp}{$cel3_Num}", $row[2]);

    $cel1_Number = $cel1_Num + 1;
    $cel2_Number = $cel2_Num + 1;
    $cel3_Number = $cel3_Num + 1;
}

繰り返すごとに改行するのはこうなるわけです。

1つの情報が複数行にまたぐときは、例えばこんな感じ。

$cel1_Alp = 'A';
$cel1_Num = 1;
$cel2_Alp = 'B';
$cel2_Num = 1;
$cel3_Alp = 'A';
$cel3_Num = 2;

foreach ($listArray as $row) {
    $sheet->setCellValue("{$cel1_Alp}{$cel1_Num}", $row[0]);
    $sheet->setCellValue("{$cel2_Alp}{$cel2_Num}", $row[1]);
    $addNum = 1;
    if(!empty($row[2])){
        $sheet->setCellValue("{$cel3_Alp}{$cel3_Num}", $row[2]);
        $addNum = $addNum + 1;
    }
    $cel1_Number = $cel1_Num + addNum;
    $cel2_Number = $cel2_Num + addNum;
    $cel3_Number = $cel3_Num + addNum;
}

セル指定の「A1」みたいなとこは変数の連結でやっていけるので、変数の管理さえ間違えなきゃ応用の幅は広い。

3つ目の値が空だったら記載しないので+1でいいんだけど、空じゃなかったら2行目に記載するので、次の情報は3行目から書くから+2になる。という感じ。

今回の例は記述だけ書いてるけど書式設定もこれに混ぜていけばいい。

エクセルやってたらわかるけど、パターンにはまらなければルールが組めないし、特例の条件をつけると非常にだるいんで、できるだけシンプルにいきたいですね。そうでなくても書くこと多いし。

コメント

タイトルとURLをコピーしました