[PhpSpreadsheet]自動改行機能を作成するひとつの方法

頑張りましょう。

はじめに

PHPSpreadsheetは結局のところ普段やってるエクセルの操作をPHPでやってるだけの話になる。なので、デザインやらなにやらを凝りたいなら設定が込み入ることになる。

めんどいので頑張りましょう。

組み方のイメージ

エクセルは文字がいっぱい入ったから自動改行するね、という仕様はない。なのでこっちでもそれが前提になる。

改行したいならそれ用の高さを指定する。

改行しなきゃいけない場合は、という条件分岐を作っていく。

大量の文字列を流し込む場合

セルの幅は決まっていて、文字数に合わせて高さを変えたいとする。

まずは自前でエクセルを作ってみて、セルの幅、フォントサイズを確認して1行あたりの文字数を確認する。流し込む文字数の総数を1行あたりの文字数で割れば行数が出てくる。で、セルの高さ(1行分の高さ)を決めておいて、行数と掛けた数値を高さとして指定する。

例えばこんな感じ。

//1行の高さ
$celHeight = 16;
//1行あたりの文字数
$celTextNum = 20;
//流し込む文字列
$text = 'あああああ...';
//行数を割り出して行の高さを求める
$celHeightResult = ceil(mb_strlen($history) / $celTextNum) * $celHeight;

//PhpSpreadsheetを使うアレ
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
︙
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
︙

//文字列の改行を有効化
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);
//セルの高さを指定
$sheet->getRowDimension(1)->setRowHeight($celHeightResult);
︙
//文字列挿入
$sheet->setCellValue('A1', $text);
︙

//書き出し
$writer = new Xlsx($spreadsheet);
$writer->save('export/excel.xls');

文字列内の改行に合わせて高さ指定

内容に合わせて高さを変えたいとする。

あああああああ
いいいいいいい
ううううううう

こういうのをセルに入れたい場合は3行分の高さを指定することになる。

phpでは改行数を数えることができるので、それでやっていく。

//1行の高さ
$celHeight = 16;
//1行あたりの文字数
$celTextNum = 20;
//流し込む文字列
$text01 = $_POST['text01'];
$text02 = $_POST['text02'];
$text03 = $_POST['text03'];
$text = '';
$text .= $text01;
if(!empty($text02){$text .= ."\n".$text02;});
if(!empty($text03){$text .= ."\n".$text03;});
//改行数(\nの数)+1で行数を出す
$count = substr_count($text,"\n") + 1;
//行の高さ
$celHeightResult = $celHeight * $count;
︙
//文字列の改行を有効化
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);
//セルの高さを指定
$sheet->getRowDimension(1)->setRowHeight($celHeightResult);
︙
//文字列挿入
$sheet->setCellValue('A1', $text);
︙

//書き出し
$writer = new Xlsx($spreadsheet);
$writer->save('export/excel.xls');

行数を変数にして標準で1、要素を追加して改行するごとに+1してもいい。まあでも出力内容に\nが含まれてるので、カウントしたほうがシンプルでいいかもしれない。

そういう感じで。

コメント

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