【问题标题】:PHPWord HTML to Word design issuePHPWord HTML to Word 设计问题
【发布时间】:2025-12-16 17:05:02
【问题描述】:

我正在使用 PHPWord 库将我的 HTML 模板转换为 Word。

Library link

我将 HTML 转换为 Word 文件的代码如下:

$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();
\PhpOffice\PhpWord\Shared\Html::addHtml($section, $htmlTemplate);
$targetFile = __DIR__ . "/1.docx";
$phpWord->save($targetFile, 'HTML');

我面临以下问题:

  1. 我正在使用内联样式应用背景颜色和字体颜色,但字体颜色仅起作用,而背景颜色不起作用。
 <p style="background-color:#FFFF00;color:#FF0000;">Some text</p>
  1. 我正在使用下面的 HTML 代码来允许 HTML 模板部分中的分页符。但它不适用于导出的 Word 文件。
<div style="page-break-after:always"><span style="display:none">&nbsp;</span></div>
  1. 我正在使用 span 标签将某些单词标记为粗体或更改段落中单词的颜色。但是当我导出到 Word 文件时,span 标记后的内容会移动到单词下方的新行。我尝试在 span 标签中使用 display:inline css 属性。但它不起作用。
<p>some text before span tag <span style="color:#FF0000;display:inline">XXXXX</span> Text after span tag.</p>

编辑:

如果上面提到的问题不能用 PHPWord 解决,请推荐任何其他库,我可以使用它来将带有内联 css 的 HTML 转换为 Word!

【问题讨论】:

  • 正如您在Official Page 上看到的,您不能使用背景颜色。
  • 此处列出的样式适用于我们使用 PHPWord 语法在 Word 中添加内容时。但是我有 HTML 模板,我正在将其转换为 word。所以我不能使用这些样式!
  • 是的,抱歉,请参阅here,样式列表。
  • 是的,我看到了这个文件,并且在调试时,在函数 parseStyle 中,当我在返回之前在函数末尾打印 $styles 时,样式属性在那里正确打印。但不知道之后会发生什么错误并且它没有反映在文档中
  • 我注意到的一点是 background-color 与 标签一起使用,但不适用于

    标签!

标签: php phpword


【解决方案1】:

我刚刚进行了一个非常简单的测试,它工作正常。我的代码与您的代码几乎完全相同,只是我告诉系统将其编写为 Word 文档,而不是 HTML。

use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\Shared\Html;

require_once __DIR__ . '/vendor/autoload.php';

$htmlTemplate = ' <p style="background-color:#FFFF00;color:#FF0000;">Some text</p>';

$phpWord = new PhpWord();
$section = $phpWord->addSection();
Html::addHtml($section, $htmlTemplate);
$targetFile = __DIR__ . "/1.docx";
$phpWord->save($targetFile, 'Word2007');

产生:

如果您将保存模式更改为HTML,背景颜色确实会消失,但无论如何它不再是 Word 文档,只是原始 HTML,所以我认为这并不重要。

$targetFile = __DIR__ . "/1.html";
$phpWord->save($targetFile, 'HTML');

【讨论】:

  • 谢谢克里斯!它解决了我的第一个和第三个问题。仍然分页符在我生成的文档中不起作用。如果您对此有任何想法,请指导我。
  • 我也通过 phpword 中的一些自定义解决了分页问题。所以没必要再看这个问题了!!
【解决方案2】:

你在一个问题/主题中有很多东西。因此,我将根据您列举的设计问题来回答:

背景颜色

您可以像这样通过styling a table 渲染背景颜色:

$table_style = array( 'bgColor' => '#FFFF00' );
$section = $phpWord->addSection();
$table = $section->addTable($table_style);
$table->addRow();
$cell = $table->addCell();
\PhpOffice\PhpWord\Shared\Html::addHtml($cell, $htmlTemplate);

分页符

文档中的 sample html 似乎不支持 html 代码中的分页符。但是,您可以通过隐式调用 addPageBreak() 来呈现分页符,如下所示:

$section = $phpWord->addSection();
\PhpOffice\PhpWord\Shared\Html::addHtml($section, $someHTMLcode);
$section->addPageBreak();
$section->addText("some plain text");
$section->addPageBreak();

意外的内联文本中断

也许您可以尝试用&amp;nbsp; 替换一些spaces,如下所示:

<p>some text before span tag&nbsp;<span style="color:#FF0000;">XXXXX</span> Text after span tag.</p>

我希望其中一些(如果不是全部的话)对您有用。祝你好运!

【讨论】: