Skip to content

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:permEndAllowEdit 区域保持可写
水印页眉中的 VML PowerPlusWaterMarkObject斜向或平铺艺术字;图片用水印为 WordPictureWatermark
SDTw: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:size 5。
  • w:cols 使用 w:sep,不是 w:separator。

完整示例 — 经读取器往返 ​

go
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)。

sh
go run ./tests/matrix
go run tests/matrix/validate_reader.go
引擎检查内容v0.9.0 结果
word.Open / word.Read + ExtractText / ExtractImagesDOM 逆向解析,无 panic,error == nil80 PASS
word.StreamExtractText / word.StreamExtractImages流式提取,无 panic,error == nil80 PASS
Microsoft Word COM(DisplayAlerts=0、OpenNoRepairDialog)OpenXML 修复弹窗、节点顺序、解析异常80 PASS

相关 ​

Word 提示“文件损坏”时,从 FAQ 开始。图表 XSD 顺序见 图表。企业级实战案例 第 4 则组合了 SDT、跨页表头、平铺水印与 AllowEdit。

DOCX 转 HTML ​

读取器重建的 DOCX DOM 可以继续渲染为 HTML 片段或完整页面:

go
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 指南。

基于 GNU LGPL v3.0 发布。