Вычисление ширины столбца в формате HTML (на основе содержимого ячейки)

StackOverflow https://stackoverflow.com/questions/3051809

Вопрос

У меня есть таблица данных, которые я хочу экспортировать в RTF, PDF и т.д.использование различных (и не идеальных) PHP-конвертеров / генераторов.

Чего мне больше всего не хватает, так это автоматической настройки ширины столбцов HTML-таблицы на основе длин строк в ячейках (строки содержат разрывы строк, которые немного усложняют ситуацию, поскольку они должны быть сохранены).

Мне нужен алгоритм, который, учитывая содержимое ячеек (обычный текст), общую ширину таблицы и среднюю ширину символа, возвращал бы ширину для каждого столбца.Я бы не хотел изобретать велосипед, если что-то уже доступно.

Конечно, это не может быть идеально, если шрифт имеет переменную ширину, но приближения было бы вполне достаточно.Или, может быть, у него могла бы быть настраиваемая таблица с шириной для каждого символа.

Любой намек был бы оценен с благодарностью.

Это было полезно?

Решение

Это непростая задача.

В PHPExcel, когда ячейке задается значение autowidth, мы используем функцию imagettfbbox() библиотеки gd

// 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top