You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP Spreadsheet在Excel中并排显示两个HTML表格?

PHP Spreadsheet 并排显示HTML表格问题解决方案

问题

尝试使用PHP Spreadsheet在Excel工作表中并排显示两个HTML表格,但表格却上下排列。该HTML表格在浏览器中显示正常,请问针对PHP Spreadsheet编写HTML代码时是否需要遵循特定格式?

用户提供的代码如下:

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Reader\Html;

$spreadsheet = new Spreadsheet();
$reader = new Html();

$HtmlString = '
    <table><tr><td>
<table border="1">
<tr><td>Hello World 1</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
<tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
<tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
<tr><td>Hello World</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
<tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
<tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
</table></td>
<td>
<table border="1">
<tr><td>Hello World 2</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
<tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
<tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
<tr><td>Hello World</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
<tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
<tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
</table></td></tr></table>';
$spreadsheet = $reader->loadFromString($firstHtmlString);
$sheet = $spreadsheet->getActiveSheet();

$sheet->getStyle('A1:D10')->applyFromArray([
    'borders' => [
        'allborders' => [
            'borderStyle' => Border::BORDER_THICK,
        ],
    ],
    'alignment' => [
        'horizontal' => Alignment::HORIZONTAL_CENTER,
        'vertical' => Alignment::VERTICAL_CENTER,
    ],
    'font' => [
        'name' => 'Arial',
        'size' => 12,
        'italic' => true,
    ],
]);

$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="data.xlsx"');
header('Cache-Control: max-age=0');

$writer->save('php://output');

原因与解决方法

1. 变量名错误

代码中定义了$HtmlString,但加载时调用的是$firstHtmlString,这会导致加载失败,直接使用默认空表格,需先修正这个变量名。

2. HTML结构适配PHP Spreadsheet解析规则

PHP Spreadsheet的HTML读取器对嵌套表格的解析逻辑和浏览器不同,外层表格的单元格需要明确设置垂直对齐方式,避免内部表格默认的垂直对齐导致布局错乱。同时要尽量减少无关的空白字符,避免解析时产生额外的单元格或换行。

修正后的HTML结构需要给外层表格的单元格添加valign="top"属性,确保两个表格在同一行内显示。

3. 样式范围调整

原代码中样式只应用到A1:D10,但并排后第二个表格会占用E到H列,需要扩展样式范围到A1:H10。

修正后的完整代码

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Reader\Html;

$spreadsheet = new Spreadsheet();
$reader = new Html();

// 修正HTML结构,添加valign="top"确保并排显示
$HtmlString = '
<table><tr>
<td valign="top">
    <table border="1">
        <tr><td>Hello World 1</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
        <tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
        <tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
        <tr><td>Hello World</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
        <tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
        <tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
    </table>
</td>
<td valign="top">
    <table border="1">
        <tr><td>Hello World 2</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
        <tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
        <tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
        <tr><td>Hello World</td><td>Hello World</td><td>Hello World</td><td>Hello World</td></tr>
        <tr><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td><td>Hello<br />World</td></tr>
        <tr><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td><td>Hello<br>World</td></tr>
    </table>
</td>
</tr></table>';

// 修正变量名
$spreadsheet = $reader->loadFromString($HtmlString);
$sheet = $spreadsheet->getActiveSheet();

// 扩展样式范围到A1:H10,覆盖两个表格
$sheet->getStyle('A1:H10')->applyFromArray([
    'borders' => [
        'allborders' => [
            'borderStyle' => Border::BORDER_THICK,
        ],
    ],
    'alignment' => [
        'horizontal' => Alignment::HORIZONTAL_CENTER,
        'vertical' => Alignment::VERTICAL_CENTER,
    ],
    'font' => [
        'name' => 'Arial',
        'size' => 12,
        'italic' => true,
    ],
]);

$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="data.xlsx"');
header('Cache-Control: max-age=0');

$writer->save('php://output');

关键总结

  • PHP Spreadsheet的HTML解析器仅支持基础HTML表格语法,复杂CSS布局或嵌套表格需要简化结构,用表格原生属性(如valign)控制布局。
  • 确保变量名一致,避免加载空内容导致布局异常。
  • 样式应用范围要覆盖所有表格区域,避免部分单元格样式缺失。

内容的提问来源于stack exchange,提问作者Aryan Chachra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:10:55