news 2026/9/28 3:14:06

PHPWord 文本元素实战指南:addText 与 addTextRun 的完整用法与样式解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHPWord 文本元素实战指南:addText 与 addTextRun 的完整用法与样式解析
  • 后端

【免费下载链接】PHPWord

A pure PHP library for reading and writing word processing documents

项目地址:https://gitcode.com/gh_mirrors/ph/PHPWord
点击查看免费下载

本文围绕 PHPWord(纯 PHP 读写 Word 文档的开源库)中最基础的文本写入能力展开,系统讲解addText与addTextRun两种文本添加方式的适用场景、参数约定、字体与段落样式配置,并结合仓库源码与官方示例深入解析底层实现与修订跟踪(Track Changes)用法。读完本文,你将掌握在 Section、Cell、Header/Footer 等任意容器中写入格式化文本的完整方案,并能直接复用可运行代码。

一、两种文本添加方式:addText 与 addTextRun

在 PHPWord 中,文本通过addText与addTextRun两个方法写入。二者的选择标准是段落内部样式的复杂度:

  • addText:用于创建只包含同一样式的简单段落。一段文字整体使用一套字体样式和段落样式,一行代码即可完成。
  • addTextRun:用于创建包含多种样式的复杂段落——同一段落内既有加粗、又有斜体、还有不同颜色、甚至嵌入图片或链接等元素时使用。

两者的基础语法如下(摘自 docs/usage/elements/text.md):

<?php $section->addText($text, [$fontStyle], [$paragraphStyle]); $textrun = $section->addTextRun([$paragraphStyle]);

三个参数的含义:

  • $text:要显示在文档中的文本内容。
  • $fontStyle:字体样式。既可以是命名样式名,也可以是样式数组,可选项参见 Styles > Font。
  • $paragraphStyle:段落样式。同样可以是命名样式名或样式数组,可选项参见 Styles > Paragraph。

从源码看,addText和addTextRun均声明在抽象容器类 AbstractContainer.php 的@method注释中,实际调用由__call魔术方法统一分派(AbstractContainer.php),并通过checkValidity校验当前容器是否允许添加该元素(AbstractContainer.php)。因此这两个方法在 Section、Header、Footer、Cell、TextBox 等几乎所有容器内都可用。

二、addText:简单段落文本

addText适合整段文字使用统一字体的场景。官方示例 Sample_01_SimpleText.php 展示了最基础与最常用的调用形式:

<?php $phpWord = new PhpOffice\PhpWord\PhpWord(); $section = $phpWord->addSection(); // 最简形式:仅文本 $section->addText('Hello World!'); // 使用命名字体样式 $fontStyleName = 'rStyle'; $phpWord->addFontStyle($fontStyleName, [ 'bold' => true, 'italic' => true, 'size' => 16, 'allCaps' => true, 'doubleStrikethrough' => true, ]); $section->addText('I am styled by a font style definition.', $fontStyleName); // 使用命名段落样式 $paragraphStyleName = 'pStyle'; $phpWord->addParagraphStyle($paragraphStyleName, [ 'alignment' => PhpOffice\PhpWord\SimpleType\Jc::CENTER, 'spaceAfter' => 100, ]); $section->addText('I am styled by a paragraph style definition.', null, $paragraphStyleName); // 同时应用字体与段落样式 $section->addText('I am styled by both font and paragraph style.', $fontStyleName, $paragraphStyleName); // 指定语言(法语示例) $section->addText('Ce texte-ci est en français.', ['lang' => PhpOffice\PhpWord\Style\Language::FR_BE]);

可以看到,addText的三个参数可以按需省略:只传文本时不带任何样式;需要字体样式时传第二个参数并把段落样式置为null;只设置段落样式时第二个参数传null。

在 Text.php 的构造函数中,$fontStyle与$paragraphStyle可以是Font/Paragraph样式对象、样式名(字符串)或样式数组。传入数组时,源码会创建对应的样式对象并调用setStyleByArray批量赋值(Text.php、Text.php)。另外,文本内容在存储前会经过SharedText::toUTF8统一转码(Text.php),因此传入非 UTF-8 编码的中文、法语等文本也能被正确处理。

三、addTextRun:复杂段落文本

当一段文字内部需要混排多种字体样式(部分加粗、部分斜体、部分带下划线),或需要嵌入链接、图片、公式等其他元素时,应使用addTextRun。它返回一个TextRun容器对象,之后通过该对象上的一系列add*方法持续追加内容,所有追加的元素最终落在同一个段落内,由可选的段落样式统一控制布局。

官方示例 Sample_04_Textrun.php 给出了完整演示:

<?php $phpWord = new PhpOffice\PhpWord\PhpWord(); // 先定义命名样式 $paragraphStyleName = 'pStyle'; $phpWord->addParagraphStyle($paragraphStyleName, ['spacing' => 100]); $boldFontStyleName = 'BoldText'; $phpWord->addFontStyle($boldFontStyleName, ['bold' => true]); $coloredFontStyleName = 'ColoredText'; $phpWord->addFontStyle($coloredFontStyleName, ['color' => 'FF8080', 'bgColor' => 'FFFFCC']); $linkFontStyleName = 'NLink'; $phpWord->addLinkStyle($linkFontStyleName, [ 'color' => '0000FF', 'underline' => PhpOffice\PhpWord\Style\Font::UNDERLINE_SINGLE, ]); $section = $phpWord->addSection(); // 带段落样式的 TextRun:内部混排多种字体,并嵌入链接与图片 $textrun = $section->addTextRun($paragraphStyleName); $textrun->addText('Each textrun can contain native text, link elements or an image.'); $textrun->addText(' No break is placed after adding an element.', $boldFontStyleName); $textrun->addText(' Both '); $textrun->addText('superscript', ['superScript' => true]); $textrun->addText(' and '); $textrun->addText('subscript', ['subScript' => true]); $textrun->addText(' are also available.'); $textrun->addText(' All elements are placed inside a paragraph with the optionally given paragraph style.', $coloredFontStyleName); $textrun->addText(' Sample Link: '); $textrun->addLink('https://github.com/PHPOffice/PHPWord', 'PHPWord on GitHub', $linkFontStyleName); $textrun->addText(' Sample Image: '); $textrun->addImage(__DIR__ . '/resources/_earth.jpg', ['width' => 18, 'height' => 18]);

要点:

  • 每次addText都会生成一个独立的Text元素,元素之间不会自动插入换行,需要换行时使用addTextBreak。
  • 字体样式既可以用命名样式名,也可以用内联样式数组(如['bold' => true]),后者只影响当前这一个Text元素。
  • TextRun内部还可以追加链接(addLink)、图片(addImage)、OLE 对象(addObject)、脚注(addFootnote)、表单域(addFormField)、公式(addFormula)等丰富元素,详见容器类的方法清单(AbstractContainer.php)。
  • 在TextRun内追加纯文本时,段落样式参数会被容器内部强制移除(AbstractContainer.php),因为段落级样式已由addTextRun统一指定,避免重复设置。

TextRun类本身继承自AbstractContainer(TextRun.php),其getText()方法会遍历内部所有元素,将普通文本与 Ruby 注音文本拼接为纯字符串(TextRun.php),方便在读取回写或校验时提取段落全文。

四、字体样式(Font)完整选项

addText的第二个参数与TextRun内addText的样式参数均支持以下字体属性,完整清单出自 docs/usage/styles/font.md:

样式键说明取值示例
allCaps全大写true/false
bgColor文字背景色FF0000(十六进制色值)
bold加粗true/false
color文字颜色FF0000
doubleStrikethrough双删除线true/false
fgColor文字高亮色yellow、green、blue;可取值见\PhpOffice\PhpWord\Style\Font::FGCOLOR_...类常量
hint字体内容类型default、eastAsia、cs
italic斜体true/false
name字体名称Arial、Times New Roman
rtl从右到左语言true/false
size字号20、22(半角点)
smallCaps小型大写字母true/false
strikethrough删除线true/false
subScript下标true/false
superScript上标true/false
underline下划线类型single、dash、dotted等;可取值见\PhpOffice\PhpWord\Style\Font::UNDERLINE_...类常量
lang语言语言代码如en-US、fr-BE,或需设置东亚/双向语言时的Language对象/数组;部分语言代码见\PhpOffice\PhpWord\Style\Language类
position文字位置(提升/降低)以半角点为单位
hidden隐藏文字true/false
whiteSpace生成 HTML/PDF 时空白处理方式pre-wrap、normal(其他 CSS 值可接受,但一般无实际意义)
fallbackFontHTML/PDF 的通用回退字体sans-serif、serif、monospace(其他通用字体系列亦可)

其中underline与fgColor的合法取值定义在 Font.php 的UNDERLINE_*与FGCOLOR_*类常量中;lang的常用语言代码(如EN_GB、FR_BE)定义在 Language.php。示例 Sample_01_SimpleText.php 对color、bold、italic、underline、strikethrough、superScript、subScript、smallCaps、allCaps、fgColor、spacing、kerning等内联样式均有实际调用,可直接参考。

提示:字体样式也可预先通过$phpWord->addFontStyle('样式名', [...])注册为命名样式,然后在addText中直接传样式名复用,见 Sample_01_SimpleText.php。

五、段落样式(Paragraph)完整选项

addText的第三个参数与addTextRun的参数支持以下段落属性,完整清单出自 docs/usage/styles/paragraph.md:

样式键说明取值/单位
alignment对齐方式,支持 ECMA-376 第一版至 ISO/IEC 29500:2012 的所有对齐模式见\PhpOffice\PhpWord\SimpleType\Jc类常量(如Jc::CENTER)
basedOn父样式样式名
hanging悬挂缩进半英寸
indent左缩进半英寸
indentation缩进键值对数组以 twip 为单位,支持left、right、firstLine、firstLineChars、hanging,类型见\PhpOffice\PhpWord\Style\Indentation
keepLines保持整段在同一页true/false
keepNext与下一段保持同页true/false
lineHeight行高倍数1.0、1.5等
next下一段样式样式名
pageBreakBefore从新页开始本段true/false
spaceBefore段前间距twip
spaceAfter段后间距twip
spacing行间距twip;当spacingLineRule为auto时基准值 240(一行高度)会被自动加入,如需双倍行距请设为 240
spacingLineRule行距规则auto、exact、atLeast,见\PhpOffice\PhpWord\SimpleType\LineSpacingRule类常量
suppressAutoHyphens段落自动断字true/false
tabs自定义制表位集合制表位数组
widowControl允许首/末行单独显示于页面true/false
contextualSpacing相同样式段落间忽略上下间距true/false
bidi从右到左段落布局true/false
shading段落底纹着色样式
textAlignment行内垂直字符对齐见\PhpOffice\PhpWord\SimpleType\TextAlignment类常量

对齐取值常量Jc定义于 Jc.php,行距规则LineSpacingRule定义于 LineSpacingRule.php,垂直对齐TextAlignment定义于 TextAlignment.php。与字体样式一样,段落样式既可以在调用处以内联数组给出,也可以通过$phpWord->addParagraphStyle()注册为命名样式后引用。

六、修订跟踪:将文本标记为插入或删除

如果要让新增文本在 Word 中体现"修订/审阅"标记,可以将其标记为INSERTED(插入)或DELETED(删除),并指定修订作者与时间。原文档 docs/usage/elements/text.md 给出了如下写法:

<?php $text = $section->addText('Hello World!'); $text->setChanged(\PhpOffice\PhpWord\Element\ChangedElement::TYPE_INSERTED, 'Fred', (new \DateTime()));

需要说明的是:当前仓库源码中,修订标记的实际 API 位于 AbstractElement.php,名为setTrackChange与setChangeInfo,修订类型常量定义在 TrackChange.php(TrackChange::INSERTED/TrackChange::DELETED)。官方示例 Sample_39_TrackChanges.php 给出了当前推荐的完整写法:

<?php use PhpOffice\PhpWord\Element\TrackChange; $phpWord = new PhpOffice\PhpWord\PhpWord(); $section = $phpWord->addSection(); $textRun = $section->addTextRun(); // 方式一:setChangeInfo —— 传入类型、作者、时间 $text = $textRun->addText('wake ', ['bold' => true]); $text->setChangeInfo(TrackChange::INSERTED, 'Fred', time() - 1800); // 方式二:setTrackChange —— 传入 TrackChange 对象 $text = $textRun->addText('up'); $text->setTrackChange(new TrackChange(TrackChange::INSERTED, 'Fred')); // 标记为删除:指定作者与更早的时间戳 $text = $textRun->addText('go to sleep'); $text->setChangeInfo(TrackChange::DELETED, 'Barney', new DateTime('@' . (time() - 3600)));

setChangeInfo($type, $author, $date)的三个参数中,$date既可以是DateTime对象,也可以是 Unix 时间戳整数,且统一按 UTC 处理(AbstractElement.php);TrackChange构造函数对传入的整数时间戳会转换为DateTime('@' . $date)(TrackChange.php)。生成文档后,被标记的文字在 Word 中会显示为带修订记录的插入或删除内容,作者名与时间会出现在审阅窗格中。更多细节可参阅修订功能示例与 docs/usage/elements/trackchanges.md。

七、完整可运行示例

将以上内容组合为一个完整的脚本,即可生成一份同时包含简单文本、混排样式文本与修订标记的 Word 文档:

<?php require_once 'vendor/autoload.php'; use PhpOffice\PhpWord\Element\TrackChange; use PhpOffice\PhpWord\PhpWord; use PhpOffice\PhpWord\SimpleType\Jc; $phpWord = new PhpWord(); // 注册命名样式 $phpWord->addFontStyle('titleFont', ['bold' => true, 'size' => 22, 'color' => '333333']); $phpWord->addParagraphStyle('centerPara', ['alignment' => Jc::CENTER, 'spaceAfter' => 240]); $section = $phpWord->addSection(); // 简单文本:同时应用字体与段落样式 $section->addText('PHPWord Text Guide', 'titleFont', 'centerPara'); // 复杂段落:混排多种字体 $textrun = $section->addTextRun(['spaceAfter' => 200]); $textrun->addText('This is '); $textrun->addText('bold', ['bold' => true]); $textrun->addText(' and '); $textrun->addText('underlined', ['underline' => 'single']); $textrun->addText(' text in one paragraph.'); // 修订标记:插入一段文字 $text = $section->addText('Newly reviewed content.'); $text->setChangeInfo(TrackChange::INSERTED, 'Reviewer', new \DateTime()); // 写出为 Word 2007 文档 $writer = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007'); $writer->save('text-guide.docx');

生成文档后可用 Word 或 LibreOffice 打开验证:第一段居中加粗标题、第二段内部混排样式、末段带修订插入标记。若需其他输出格式(HTML、ODText、RTF、PDF 等),可参阅 docs/usage/writers.md;若需从模板克隆行或替换变量,可参阅 docs/usage/template.md。

小结

  • 简单段落选addText,混排段落选addTextRun,二者的样式参数均可用命名样式名或内联数组,具体键值对照 字体样式 与 段落样式。
  • 底层由 AbstractContainer.php 统一分派元素创建,Text与TextRun元素分别定义在 Text.php 与 TextRun.php。
  • 需要审阅修订时,使用setChangeInfo()/setTrackChange()配合TrackChange::INSERTED/TrackChange::DELETED标记文字。
  • 更多组合用法(列表、表格、页眉页脚、脚注等)可查阅 docs/usage/containers.md 与 samples 目录下的官方示例。
  • 后端

【免费下载链接】PHPWord

A pure PHP library for reading and writing word processing documents

项目地址:https://gitcode.com/gh_mirrors/ph/PHPWord
点击查看免费下载

相关推荐

上一篇:用 Metrics Servlets 为 JVM 应用搭建 HTTP 运维端点:健康检查、线程转储、指标导出与 CPU Profiling 实战指南
下一篇:3步开启单机游戏分屏多人模式:Nucleus Co-Op完全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 3:12:05

脑肿瘤分割与生存预测:基于BraTS数据集的2D/3D-UNet与VNet实现

简介&#xff1a;这套毕设项目围绕脑肿瘤分割与生存预测展开&#xff0c;提供完整的多模型对比研究源码。项目整合了二维U型网络、三维U型网络与三维V型网络三种经典分割架构&#xff0c;并额外加入基于临床数据的生存预测模型&#xff0c;内容覆盖数据预处理、模型搭建、训练评…

作者头像 李华
网站建设 2026/9/28 3:11:34

计算机行业高质量知识网站推荐(2026版)

计算机行业高质量知识网站推荐&#xff08;2026版&#xff09; 按访问难度和内容类型分类&#xff0c;优先推荐国内可直接访问的优质资源一、国内可直接访问的优质网站 系统学习类网站网址核心价值适合场景菜鸟教程runoob.com基础语法在线实例&#xff0c;覆盖主流语言快速入门…

作者头像 李华
网站建设 2026/9/28 3:10:20

this指针的认识+使用

关于C的this指针学习总结需要回答的问题this指针的认识this指针的本质&#xff08;一句话总结&#xff09;this的类型this的存储位置this指针的作用1.区分同名变量2.链式调用/连续赋值/连续调用(return *this)3.访问当前对象的地址或成员this指针的使用&#xff08;this指针与c…

作者头像 李华
网站建设 2026/9/28 3:09:41

Sphinx 集成 Markdown:基于 MyST-Parser 的 Markdown 文档构建实战指南

文档开发工具 【免费下载链接】sphinx The Sphinx documentation generator 项目地址&#xff1a; https://gitcode.com/gh_mirrors/sp/sphinx 点击查看 免费下载 本篇指南围绕 Sphinx 项目中的 Markdown 支持展开&#xff0c;讲解如何通过 MyST-Parser 扩展让 Sphinx 直接解析…

作者头像 李华
网站建设 2026/9/28 3:09:27

Jetson Orin实战:为宇树Go2部署YOLOv5目标检测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华