頑張りましょう。
はじめに
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が含まれてるので、カウントしたほうがシンプルでいいかもしれない。
そういう感じで。
コメント