php无法原生生成.docx文件,需用phpoffice/phpword库;安装后通过引入类、新建实例、添加section、addtext写内容、save输出(参数为'word2007')即可;注意utf-8编码、显式设中文字体、图片用绝对路径、表格单位用twips、调大memory_limit、避免循环addtext、清除输出缓冲、正确设置header及用readfile输出。

PHP 不能原生生成 .docx 文件,必须依赖第三方库;直接写 XML 或二进制格式极易出错,不推荐。
用 phpoffice/phpword 写基础 Word 文档
这是目前最稳定、文档较全的 PHP Word 生成库,支持 .docx(不支持老式 .doc),基于 OpenXML 标准。
- 安装:运行
composer require phpoffice/phpword,别手动下载 ZIP - 生成最小可用文档只需 4 步:引入类、新建
PhpWord实例、添加Section、用addText()写内容、调用save() - 注意
save()的第二个参数:传'Word2007'才输出 .docx;传'ODText'会输出 .odt,不是 Word - 中文乱码?确保 PHP 文件本身是 UTF-8 编码,且在
addText()中显式指定字体:['name' => 'Microsoft YaHei', 'size' => 12]
导出含表格/图片的 Word,要注意路径和临时文件
表格和图片不是“直接塞进去”就能显示的——PhpWord 会把图片复制到生成包的 word/media/ 子目录下,所以原始路径必须可读。
- 图片路径必须是服务端本地绝对路径(如
/var/www/html/uploads/logo.png),URL 地址(https://...)会失败并静默跳过 - 表格行高、列宽单位是 Twips(1 英寸 = 1440 Twips),别直接写像素值;设宽度用
914400表示 6 英寸(常用 A4 宽度) - 生成大文件时,
memory_limit容易爆:建议在脚本开头加ini_set('memory_limit', '256M');,而不是靠默认值 - 不要在循环里反复
addText()上千次——改用addListItem()或批量写入段落数组,性能差 3 倍以上
生成后无法下载?检查 Content-Type 和输出缓冲
常见现象:浏览器打开空白页、弹出损坏的文件、或直接显示 XML 报错文本。
立即学习“PHP免费学习笔记(深入)”;
- 务必在
save()前清除所有输出缓冲:ob_end_clean();,否则 HTML 输出或空格会污染 .docx 二进制流 - Header 必须完整设置三项:
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document、Content-Disposition: attachment; filename="report.docx"、Cache-Control: max-age=0 - 别用
echo file_get_contents($filename)输出——大文件会内存溢出;要用readfile($filename)+exit; - 如果用 Nginx,确认没开启
fastcgi_buffering off;类似配置,否则可能截断响应体
OpenXML 结构比看上去复杂得多,哪怕只是合并两个段落样式,也可能因 style.xml 引用错位导致 Word 提示“文件已损坏”。真要深度定制,别硬改 XML,优先查 PhpWord 的 setStyleName() 和 addTitleStyle() 接口。











