HTMLのような方法で列幅を計算する(セルの内容に基づく)
-
27-09-2019 - |
質問
さまざまな(完璧ではない)PHPコンバーター/ジェネレーターを使用して、RTF、PDFなどにエクスポートしたいデータのグリッドがあります。
私が最も欠けているのは、セル内の文字列の長さに基づいて、列幅のHTMLテーブル自動調整です(文字列には、保存する必要があるため、少し複雑にするラインブレークが含まれます)。
セルの内容(プレーンテキスト)、テーブルの総幅、文字の平均幅が各列の幅を返すアルゴリズムが必要です。何かがすでに利用可能であれば、私は車輪を再発明したくありません。
もちろん、フォントが可変幅であれば完璧ではありませんが、近似は正常に行われます。または、各文字に幅を備えた構成可能なテーブルがあるかもしれません。
どんなヒントも感謝します。
解決
これは簡単なものではありません。
phpexcelでは、セルが自動化されるように設定されている場合、gdライブラリimagettfbbox()関数を使用します
// font size should really be supplied in pixels in GD2,
// but since GD2 seems to assume 72dpi, pixels and points are the same
$fontFile = self::getTrueTypeFontFileFromFont($font);
$textBox = imagettfbbox($font->getSize(), $rotation, $fontFile, $text);
// Get corners positions
$lowerLeftCornerX = $textBox[0];
$lowerLeftCornerY = $textBox[1];
$lowerRightCornerX = $textBox[2];
$lowerRightCornerY = $textBox[3];
$upperRightCornerX = $textBox[4];
$upperRightCornerY = $textBox[5];
$upperLeftCornerX = $textBox[6];
$upperLeftCornerY = $textBox[7];
// Consider the rotation when calculating the width
$textWidth = max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX);
return $textWidth;
しかし、特に大きなワークシートを操作する場合は非常に集中しているため、代替(近似)メソッドもあります
// Calculate column width in pixels. We assume fixed glyph width. Result varies with font name and size.
switch ($fontName) {
case 'Calibri':
// value 8.26 was found via interpolation by inspecting real Excel files with Calibri 11 font.
$columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText));
$columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size
break;
case 'Arial':
// value 7 was found via interpolation by inspecting real Excel files with Arial 10 font.
$columnWidth = (int) (7 * PHPExcel_Shared_String::CountCharacters($columnText));
$columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size
break;
case 'Verdana':
// value 8 was found via interpolation by inspecting real Excel files with Verdana 10 font.
$columnWidth = (int) (8 * PHPExcel_Shared_String::CountCharacters($columnText));
$columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size
break;
default:
// just assume Calibri
$columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText));
$columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size
break;
}
// Calculate approximate rotated column width
if ($rotation !== 0) {
if ($rotation == -165) {
// stacked text
$columnWidth = 4; // approximation
} else {
// rotated text
$columnWidth = $columnWidth * cos(deg2rad($rotation))
+ $fontSize * abs(sin(deg2rad($rotation))) / 5; // approximation
}
}
// pixel width is an integer
$columnWidth = (int) $columnWidth;
return $columnWidth;
所属していません StackOverflow