DOCX 转 HTML
支持片段、完整页面和 io.Writer 流式输出,提供图片 URL、ZIP 读取限制及转换诊断,无需 cgo 或外部 Office 软件。
100% 纯 Go 标准库、零第三方依赖的 Microsoft Word (.docx) 工业级处理引擎。
读取器现在恢复 section 页面属性、常用页眉页脚、脚注尾注、批注、修订和列表编号。模板替换支持跨相邻 Word 文本 run 的宏。NewWithOptions 提供隔离的文档默认值,ValidatePackage 提供包诊断。详见读取与诊断。
查看 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 重映射样式、书签、rId | ZIP 拷贝,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/op | B/op | allocs/op |
|---|---|---|---|
BenchmarkSaveDocx — 30 段 + 20×5 表 | 1.88e6 | 163 KiB | 949 |
BenchmarkTableRender — 50×8 表 | 2.76e6 | 180 KiB | 1820 |
BenchmarkTemplateProcess — 两处 ${} 替换 | 1.43e6 | 238 KiB | 703 |
BenchmarkStreamWriter — 增量 ZIP | 1.55e6 | 142 KiB | 627 |
B/op 是每次迭代的额外堆,不是 .docx 体积。流式提取在回调后丢弃段落缓冲,额外内存相对文件大小保持 O(1)。
GoWord 把 PHPWord 的公开 API(AddSection、AddText、IOFactory、TemplateProcessor)落到纯 Go 的 OpenXML 写出器上。下表覆盖生产环境 Word 流水线最常问到的能力。
| 能力 | GoWord | PHPWord | unioffice | fumiama/go-docx | gingfrederik/docx |
|---|---|---|---|---|---|
| 语言 | Go 1.21+ | PHP | Go(商业) | Go | Go |
| 协议 | LGPL v3 | LGPL v3 | 商业授权 | AGPL-3.0 | MIT |
| 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、图表、流式提取与标识符安全合并。
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)
}
}go get github.com/yunkeweb/go-word@v0.13.0