php输出单元格的宽度,php – 以类似HTML的方式计算列宽(基于单元格内容)

我有一个数据网格,我想使用各种(而不是完美的)PHP转换器/生成器导出到RTF,PDF等.

我最缺少的是HTML表格根据单元格中字符串的长度自动调整列宽(字符串包含换行符,因为它们应该被保留).

我需要一种算法,给定单元格的内容(纯文本),表格的总宽度和字符的平均宽度将返回每列的宽度.如果已有的东西,我不想重新发明轮子.

当然,如果字体是可变宽度,它可能不是完美的,但近似可以做得很好.或者它可能有一个可配置的表格,每个字符的宽度.

任何提示都将不胜感激.

解决方法:

这不是一件容易的事.

在PHPExcel中,当一个单元格设置为autowidth时,我们使用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;

标签:php,algorithm,html-table,autosize,column-width

来源: https://codeday.me/bug/20190705/1384317.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值