Skip to content

GoWord工业级 Word(.docx)引擎

100% 纯 Go 标准库、零第三方依赖的 Microsoft Word (.docx) 工业级处理引擎。

Go ReferenceCILicense: LGPL v3Go 1.21+v0.13.0

读取与模板 API ​

读取器现在恢复 section 页面属性、常用页眉页脚、脚注尾注、批注、修订和列表编号。模板替换支持跨相邻 Word 文本 run 的宏。NewWithOptions 提供隔离的文档默认值,ValidatePackage 提供包诊断。详见读取与诊断。

v0.13.0 更新 ​

  • 带内置 CSS 的完整 HTML 按分节纸张尺寸、方向与页边距显示居中纸张预览,窄屏也保留 DOCX 版心宽度。
  • 保留段落分页提示、分节页眉页脚、重复表头、固定表格布局、图片环绕元数据及常见主题字体/颜色引用。
  • 通过具名打印页面规则设置分节纸张属性,超链接明确指定的颜色与下划线设置直接应用到链接元素。
  • 屏幕预览向下延伸,不复现 Word 自动分页;片段和不带内置 CSS 的完整页面保持流式布局。
  • 完整指南与升级说明 包含选项、兼容性及保真边界;同时包含 v0.12.1 的 DOCX 样式还原修复。

查看 v0.13.0 发行版 与 更新日志。

核心优势 ​

生产环境的 Word 流水线通常卡在四件事:把二进制送进隔离网络、在数百页提取时把内存压平、写出 Word 能双击编辑的公式、以及在不引入第二套模板栈的前提下填充合同。

约束GoWord典型 PHP / Python 栈其他 Go .docx 写出器
语言与依赖Go 1.21+ 仅标准库运行时 + XML / ZIP 附加库多为标准库,但表面是只写
提取内存StreamExtractText O(1) 额外堆整包 / DOM 载入整棵文档树
公式LaTeX → 原生 OMML(m:oMathPara)图片、OLE 或省略省略
模板${var | pipe} + ${block} / ${if}PHPWord 宏或 Jinja→docx省略或字符串替换
合并隔离AppendDocument 重映射样式、书签、rIdZIP 拷贝,image1.png 互相覆盖省略
协议LGPL v3混杂AGPL 或 MIT 只写

GoWord 把 PHPWord 的名字(AddSection、AddText、IOFactory、TemplateProcessor)落到纯 Go 的 OpenXML 写出器上。把这些优势拼在一起的四份可复制程序见 企业级实战案例。

性能基准 ​

数字来自 Intel Core i7-10870H、Windows amd64 上的 go test -benchmem。分配次数是较稳的信号;墙钟时间随磁盘与 CPU 波动。完整表格、硬件说明与流式提取占用示例见 性能基准。

工作负载ns/opB/opallocs/op
BenchmarkSaveDocx — 30 段 + 20×5 表1.88e6163 KiB949
BenchmarkTableRender — 50×8 表2.76e6180 KiB1820
BenchmarkTemplateProcess — 两处 ${} 替换1.43e6238 KiB703
BenchmarkStreamWriter — 增量 ZIP1.55e6142 KiB627

B/op 是每次迭代的额外堆,不是 .docx 体积。流式提取在回调后丢弃段落缓冲,额外内存相对文件大小保持 O(1)。

特性对比 ​

GoWord 把 PHPWord 的公开 API(AddSection、AddText、IOFactory、TemplateProcessor)落到纯 Go 的 OpenXML 写出器上。下表覆盖生产环境 Word 流水线最常问到的能力。

能力GoWordPHPWorduniofficefumiama/go-docxgingfrederik/docx
语言Go 1.21+PHPGo(商业)GoGo
协议LGPL v3LGPL v3商业授权AGPL-3.0MIT
Go 第三方依赖无不适用无(付费 SDK)无无
创建 .docx✓✓✓✓✓
读取 / 往返 .docx✓✓✓✓
LaTeX 生成原生 OMML✓✓
DrawingML 图表(柱 / 折 / 饼 / 面积 / 组合)✓✓✓
矢量形状 wps:wsp✓✓✓✓
多栏 w:cols✓✓✓
嵌套表 + vMerge / gridSpan✓✓✓✓
跨页 tblHeader / cantSplit / textDirection✓✓✓
SDT 内容控件(w:sdt)✓✓✓
模板 ${var | pipe} + ${block} / ${if}✓✓模板
O(1) 流式提取✓
样式 / 书签 / rId 隔离合并✓✓
平铺 / 图片水印 + w:permStart 例外✓✓✓

PHPWord 是 API 祖先。unioffice 是付费的多格式 Office SDK。两款轻量 Go 写出器覆盖段落(go-docx 另含图片与表格),没有 OMML、图表、流式提取与标识符安全合并。

快速开始 ​

go
package main

import (
	"log"

	"github.com/yunkeweb/go-word"
)

func main() {
	doc := word.New()
	doc.SetDefaultFontName("Calibri")
	sec := doc.AddSection()
	sec.AddTitle("GoWord v0.13.0", 1)
	sec.AddSDTText("Full name", "full_name", "Enter full name")
	sec.AddMath(`\frac{a}{b}`)
	doc.SetTextWatermark("CONFIDENTIAL", word.WatermarkOptions{Tile: true, Angle: -45})
	if err := doc.Save("hello.docx"); err != nil {
		log.Fatal(err)
	}
}
sh
go get github.com/yunkeweb/go-word@v0.13.0

接着阅读 安装、快速开始、SDT、表格、水印与保护,以及四份 企业级实战案例。完整签名见 pkg.go.dev。

基于 GNU LGPL v3.0 发布。