
本文介绍在 go 中解析 office open xml 格式(.docx)文档并提取全部纯文本的实用方法,重点基于 zip 解压与 xml 解析,不依赖外部二进制或 com 组件。
本文介绍在 go 中解析 office open xml 格式(.docx)文档并提取全部纯文本的实用方法,重点基于 zip 解压与 xml 解析,不依赖外部二进制或 com 组件。
Microsoft Word 的 .docx 文件本质上是一个遵循 OOXML(Office Open XML)标准的 ZIP 归档包,内部包含多个 XML 文件,其中主体文本内容主要存储在 word/document.xml 中。与传统二进制 .doc 格式不同,.docx 可直接通过标准 Go 库(如 archive/zip 和 encoding/xml)进行解析,无需调用 Windows COM 或 LibreOffice 等外部服务。
以下是一个轻量、无依赖的完整示例,用于读取 .docx 并提取所有段落文本:
package main
import (
"archive/zip"
"encoding/xml"
"fmt"
"io"
"log"
"strings"
)
type Document struct {
Body struct {
Ps []Paragraph `xml:"body>p"`
} `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main body"`
}
type Paragraph struct {
Runs []Run `xml:"r"`
Text string `xml:",chardata"`
}
type Run struct {
Text string `xml:"t"`
}
// extractTextFromDocx 从 .docx 文件中提取所有纯文本(忽略样式、注释、页眉页脚等)
func extractTextFromDocx(filename string) (string, error) {
r, err := zip.OpenReader(filename)
if err != nil {
return "", fmt.Errorf("failed to open zip: %w", err)
}
defer r.Close()
var docXML io.ReadCloser
for _, f := range r.File {
if f.Name == "word/document.xml" {
docXML, err = f.Open()
if err != nil {
return "", fmt.Errorf("failed to open document.xml: %w", err)
}
break
}
}
if docXML == nil {
return "", fmt.Errorf("document.xml not found in .docx")
}
defer docXML.Close()
var doc Document
if err := xml.NewDecoder(docXML).Decode(&doc); err != nil {
return "", fmt.Errorf("failed to decode XML: %w", err)
}
var texts []string
for _, p := range doc.Body.Ps {
if len(p.Runs) > 0 {
for _, r := range p.Runs {
if strings.TrimSpace(r.Text) != "" {
texts = append(texts, strings.TrimSpace(r.Text))
}
}
} else if strings.TrimSpace(p.Text) != "" {
texts = append(texts, strings.TrimSpace(p.Text))
}
}
return strings.Join(texts, "\n"), nil
}
func main() {
text, err := extractTextFromDocx("example.docx")
if err != nil {
log.Fatal(err)
}
fmt.Println(text)
}
✅ 注意事项与说明:
- 该方案仅支持
.docx(OOXML),不支持旧版二进制.doc格式;若需处理.doc,建议先用 LibreOffice 命令行工具转换为.docx,或集成antiword等 C 工具(需 CGO)。 - 示例未处理
的深层嵌套、超链接、表格、页眉/页脚(位于header.xml/footer.xml)、注释等复杂结构;生产环境推荐使用成熟库如github.com/nguyenthenguyen/docx,它已封装 XML 路径解析、样式跳过、多部分合并等逻辑。 - 实际应用中应添加错误恢复(如 XML 解析失败时降级为正则提取
)、编码兼容性(确保 UTF-8)、大文件流式处理(避免全量加载 XML 到内存)等增强措施。.*?
综上,Go 处理 .docx 文本提取的核心路径是:解压 ZIP → 定位 word/document.xml → 解析 XML 中 段落与 文本节点 → 合并为纯文本。简洁、可控、可维护,是构建文档预处理管道的理想起点。










