phpword踩过的那些坑

年前就开始接手公司的导出word需求了,前前后后做了很多修改,局部、整体的,今天在这儿把所有踩过的坑记录一下。

1.在word中添加一条线

// PHP CODE

$section->addLine([
'width' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(17.15),
'height' => \PhpOffice\PhpWord\Shared\Converter::cmToTwip(0),
'color' => '82B4FF',
'positioning' => 'absolute',
]);

这个没什么好说的,这就是一条带颜色的直线,如果这条直线没有任何style的话就是一条斜线。

2.页眉页脚添加图片

// PHP CODE

$logo = 'songyichao.png';
$header = $section->addHeader();
if ($logo && file_exists(base_path() . '/public/assets/image/' . $logo)) {
<pre><code>$header->addImage(base_path() . '/public/assets/image/' . $logo, ['height' => 22]);
</code></pre>
}
$footer = $section->addFooter();
$footer_style = [];
if ($GLOBALS['platform'] === 'win') {
$footer_style = [
'width' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(17.09),
];
}
$footer->addImage(base_path() . '/public/assets/image/' . $GLOBALS['platform'] . '_footer.png', $footer_style);

这段代码是添加页眉页脚,及在页眉页脚中添加图片的实现,这段代码可以放在创建section之后,保存文件之前的任意位置。这块的style很的简单,页脚指控制了宽度,页眉只控制了高度。

3.wps中的颜色识别和微软office有所区别

office中可以识别“#82B4FF”这样的颜色定义方式,最开始我的颜色就是这么设置的,但是在wps中全部都成为了黑色,当时导出来看到的东西简直无法直视,此处的处理有点主观带入了,后来看了一下phpword的文档中eg.是另一种样子“82B4FF”,改成这个样子,颜色就不存在平台兼容问题了。这个问题不可以说是wps的兼容又问题,只能说office的兼容更好。

4.mac和Windows中对于图片尺寸的区别

phpword处理图片需要用像素这个单位(px),但是Windows和mac还不是同样的像素识别,Windows的图片尺寸较mac而言比较大。最开始的处理方式不不同的版本用不同的大小一个一个去试,在后来一次改版中,组长(@Tccbest)在查阅源码后告诉我可以用同样的厘米,不同的换算方式。具体mac使用Point,Windows使用cmToPixel。具体调用:

// PHP CODE

$style = [
'width' => \PhpOffice\PhpWord\Shared\Converter::cmToPoint(17.15), //Windows
'height' => \PhpOffice\PhpWord\Shared\Converter::cmToPixel(12), //mac
'color' => '82B4FF',
'positioning' => 'absolute',
];

5.wps和office的表格识别

当时为了兼容一个单元格中文字较长避免换行的问题,做了单元格合并的处理,但是在wps上的展示是最后一个单元格直接跑到了整个表格外,这样的处理导致整个word的展示都出现了问题,就像是一块臭肉坏了整锅汤。这儿有问题的地方就是上下两个单元格的合并不统一和在一行的第一个单元格的宽度值设置的有问题。

// PHP CODE

$table->addRow();
$table->addCell('1134', self::getStyle('cell_row_continue')); //此处最开始给的值是null
$table->addCell('4252.5', self::getStyle('cell_bg_color'))->addText('你猜:' . $item['eat'] ?? '-', self::getStyle('font_style_12'),
self::getStyle('paragraph_style_20'));
$real_hotel = in_array(3, $this->tag) ? ('我不猜:' . $item['realHotel'] ?? ' ' ) : ' ';
$table->addCell('4252.5', self::getStyle('cell_bg_color'))->addText($real_hotel, self::getStyle('font_style_12'),
self::getStyle('paragraph_style_20'));

后两个单元格原来的大小是不一样的,第二个4252.5单元格是要合并两个单元格的。现在改成了这个样子。已经解决了wps的兼容问题。
其实是 不存在兼容的问题的,只是使用的方法不对,而产生了兼容问题,以后的插件使用要严格按照文档的来。目前还存在的一个问题,就是Windows和mac的图片尺寸大小问题。

6.文字过多表格会被撑开导致的样式问题

这个问题是由于table的行数过多导致的,我经过测试,目前的效果是15行以内可以保证table的样式没有问题,如果超过的话就会导致表格变形,目前我的处理方式是通过多个table来解决行数过多的问题