unioffice生成docx需用v0.0.0-20230719150428-1c5e6a123b6a或更新版,旧版仅支持只读;必须调用doc.Build()后才能doc.Save();中文需设SetLanguage("zh-CN")和SetFontFamily;表格须用AddGridCol()设EMU宽度;合并单元格要配对调用SetVerticalMerge()与SetHorizontalMerge()。

unioffice 生成 docx 的基本流程走不通?先确认你用的是 v0.0.0-20230719150428-1c5e6a123b6a 或更新版
旧版 unioffice(比如 v0.0.0-20210809152124-33d5f5793817)根本不支持写入 docx,只读;调用 document.New() 后直接 panic 或静默失败是常见现象。新版才把 document.Build() 和 doc.Save() 补全。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 删掉
go.mod里旧的github.com/unidoc/unioffice记录,执行go get github.com/unidoc/unioffice@latest - 检查
go list -m all | grep unioffice输出是否含 2023 年后的 commit 时间戳 - 别用
go get github.com/unidoc/unioffice/v3—— 它不存在,v3 是假版本号,官方没发过
写入中文内容乱码或不显示?核心在字体和段落样式初始化
unioffice 默认不嵌入中文字体,也不自动设置 lang 属性,中文会渲染成空白或方块。这不是编码问题,是 Word 渲染链路缺失关键元信息。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 创建段落前,必须显式调用
para.Properties().SetLanguage("zh-CN") - 用
run.Properties().SetFontFamily("SimSun")或"Microsoft YaHei",不能只设run.Text("你好") - 如果目标环境无中文字体,得提前用
doc.AddFont()加载 ttf 文件(注意:仅企业版支持嵌入字体,开源版只能依赖系统已有字体)
表格插入后格式错乱、列宽崩塌?table.GridCol 必须手动设宽度
unioffice 不像 Excel 库那样自动计算列宽。不设 GridCol,Word 打开时会按默认 0.5 英寸撑开,内容挤成一团或换行异常。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 创建表格后立刻调用
table.AddGridCol(2000)(单位是 EMU,2000 ≈ 0.7cm) - 每列都要加,哪怕只有一列;
table.AddGridCol(0)无效,会被忽略 - 合并单元格时,
cell.SetVerticalMerge()和cell.SetHorizontalMerge()必须配对使用,漏一个就整行错位
保存文件打不开,提示“文件已损坏”?检查 Save() 前是否调用了 Build()
这是最隐蔽的坑:doc.Save() 不会自动触发文档结构组装。漏掉 doc.Build(),生成的 .docx 实际上是空壳 ZIP,缺少 [Content_Types].xml 和 word/document.xml 等必需项。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 顺序必须是:
doc.Build()→doc.Save(),不能颠倒,也不能省略前者 -
Build()是耗时操作,含 XML 序列化和关系映射,大文档要几毫秒,别在循环里反复调用 - 保存路径需确保父目录存在,
os.OpenFile()用os.O_CREATE|os.O_WRONLY即可,不用手动os.MkdirAll
真正卡住的地方往往不是语法,而是 unioffice 把 Word 的底层约束暴露给了 Go 层——比如语言属性、EMU 单位、Build 时机。这些点不手动补全,生成的 docx 就算能保存成功,也大概率被 Word 拒绝打开或显示异常。


















