OpenXML 兼容性
GoWord 写出 Office Open XML WordprocessingML 2007 包(ECMA-376 / ISO/IEC 29500 transitional)。Microsoft Word 2007 至 Microsoft 365 均可打开。WPS 与 LibreOffice 打开常见子集(段落、表格、图片);DrawingML 图表与 wps:wsp 形状以 Word 为准。
包布局
| 部件 | 必需 | 说明 |
|---|---|---|
[Content_Types].xml | 是 | document.xml、页眉、图表、媒体的 Override |
_rels/.rels | 是 | 指向 word/document.xml |
word/document.xml | 是 | 正文 + 最后一段 w:sectPr |
word/_rels/document.xml.rels | 是 | 图片、页眉页脚、图表、编号 |
word/styles.xml | 是 | 命名样式与默认 Normal |
word/media/imageN.* | 有图时 | 名称在写出时分配 |
word/charts/chartN.xml | 有图时 | 每个 AddChart 一个部件 |
word/headerN.xml / footerN.xml | 有页眉时 | 由 w:sectPr 经 r:id 引用 |
写出器对准的 schema
| 功能 | 命名空间 / 节点 | Word 行为 |
|---|---|---|
| 正文 | w: WordprocessingML | 段落、表格、sectPr |
| 原生公式 | m: Office Math(m:oMathPara、m:oMath) | 双击打开公式编辑器 |
| 图表 | c: ECMA-376 Chart | 系列顺序为 idx → order → tx → spPr |
| Word 2010 形状 | wps:wsp / a:prstGeom | 矩形、圆角矩形、箭头、文本框 |
| 域 | w:instrText(PAGE、TOC、NUMPAGES) | 用“更新域”刷新 |
| 保护 | w:documentProtection | 只读 / 批注 / 修订 / 窗体 |
| 编辑例外 | w:permStart / w:permEnd | AllowEdit 区域保持可写 |
| 水印 | 页眉中的 VML PowerPlusWaterMarkObject | 斜向或平铺艺术字;图片用水印为 WordPictureWatermark |
| SDT | w:sdt / w:sdtPr / w:sdtContent | 纯文本、下拉、日期、w14:checkbox |
| 表格行 / 单元格 | w:tblHeader、w:cantSplit、w:vAlign、w:textDirection | 跨页表头、禁止断行、竖排文字 |
测试套件强制的严格规则
openxml_strict_test.go 会拒绝 Word 将要提示修复的输出:
- 每个
w:tc至少包含一个w:p。 - 模板替换不会在
w:t中写出裸&(普通 ASCII 不用P这类数字实体)。 - 组合图使用两个不同的
c:axId;次系列指向第二条数值轴。 - 面积图省略
c:dLblPos(面积图 XSD 不允许)。 c:legend在c:plotArea之后,绝不在其内部。- 折线标记同时写出
c:symbol与c:size5。 w:cols使用w:sep,不是w:separator。
完整示例 — 经读取器往返
package main
import (
"fmt"
"log"
"os"
"github.com/yunkeweb/go-word"
)
func main() {
doc := word.New()
sec := doc.AddSection()
sec.AddTitle("Compatibility", 1)
sec.AddText("Round-trip through CreateReader.")
sec.AddMath(`x^{2}`)
if err := doc.Save("compat.docx"); err != nil {
log.Fatal(err)
}
r, err := word.CreateReader("Word2007")
if err != nil {
log.Fatal(err)
}
loaded, err := r.Load("compat.docx")
if err != nil {
log.Fatal(err)
}
fmt.Println(loaded.ExtractText())
_ = os.Remove("compat.docx")
}ExtractText 遍历重建后的 DOM。文件太大不宜整树加载时,使用 StreamExtractText。库中没有 word.ReadDOM;DOM 加载入口是 word.Open、word.Read 与 word.Load。
全要素矩阵(v0.9.0)
tests/matrix 会写出 80 份随机组合文档,覆盖 v0.1.0 至 v0.9.0 的全部导出模块:排版、多节、页眉页脚、表格、图片/形状、TOC/书签/批注、OMML、图表、SDT、水印/保护。产物落在 ./test_output_docs(已 gitignore)。
go run ./tests/matrix
go run tests/matrix/validate_reader.go| 引擎 | 检查内容 | v0.9.0 结果 |
|---|---|---|
word.Open / word.Read + ExtractText / ExtractImages | DOM 逆向解析,无 panic,error == nil | 80 PASS |
word.StreamExtractText / word.StreamExtractImages | 流式提取,无 panic,error == nil | 80 PASS |
Microsoft Word COM(DisplayAlerts=0、OpenNoRepairDialog) | OpenXML 修复弹窗、节点顺序、解析异常 | 80 PASS |
相关
Word 提示“文件损坏”时,从 FAQ 开始。图表 XSD 顺序见 图表。企业级实战案例 第 4 则组合了 SDT、跨页表头、平铺水印与 AllowEdit。
DOCX 转 HTML
读取器重建的 DOCX DOM 可以继续渲染为 HTML 片段或完整页面:
html, err := doc.RenderHTML(word.HTMLOptions{
Standalone: true,
IncludeCSS: true,
})输入仍是文件或 Reader 时,可使用 word.RenderHTMLFile 或 word.RenderHTMLWithOptions,返回字节由调用方保存。图片默认嵌入 data URI;ImageURL 回调负责保存资源并返回公开 URL,HTMLImageURL 则复用已有 URL,均不会自动托管媒体文件。RenderHTMLWithDiagnostics 报告保留在 DOM 中的未支持元素;Strict: true 将这些诊断转为错误。读取阶段遗漏的内容无法由渲染器诊断,严格模式成功不代表无损转换。完整程序、支持范围和读取限制见 DOCX 转 HTML 指南。