如何用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
相关产品推荐
相关产品推荐

