分享一个纯 Go 实现的 Word 文档操作库 - WordZero - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
clow
V2EX    Go 编程语言

分享一个纯 Go 实现的 Word 文档操作库 - WordZero

  •  
  •   clow 180 天前 4777 次点击
    这是一个创建于 180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一个项目需要生成 Word 报告,试了几个库都不太满意,要么功能太简单,要么需要付费不完全开源。索性自己撸了一个,现在分享给大家。

    为什么又造轮子?

    市面上的 Go Word 库要么只能做简单的文本插入,要么需要安装 Office 或者 LibreOffice 。我需要的是:

    • 纯 Go 实现,无外部依赖
    • 支持复杂的表格操作
    • 能处理样式和格式
    • 性能要好,适合批量生成

    主要特性

    基础功能

    • 创建/读取/修改 .docx 文档
    • 文本格式化(字体、颜色、粗体等)
    • 18 种预定义样式,支持 Word 导航窗格
    • 段落对齐、间距、缩进

    表格功能(这个比较实用)

    // 创建表格很简单 table := doc.AddTable(&document.TableConfig{ Rows: 3, Columns: 4, }) // 设置内容和样式 table.SetCellText(0, 0, "姓名") table.MergeCells(0, 0, 0, 1) // 合并单元格 // 还有迭代器,方便批量处理 table.ForEach(func(info *document.CellInfo) { if info.Row == 0 { info.Cell.SetBackgroundColor("E6F3FF") } }) 

    模板功能

    支持模板继承,可以定义基础模板然后扩展:

    baseTemplate := `{{companyName}} 报告 {{#block "content"}}默认内容{{/block}}` salesTemplate := `{{extends "base"}} {{#block "content"}} 销售额:{{sales}} 新客户:{{customers}} {{/block}}` 

    高级功能

    • 页眉页脚、目录生成
    • 脚注尾注、列表编号
    • 页面设置( A4 、Letter 等)
    • 图片插入

    性能表现

    做了个简单的基准测试,生成同样的文档:

    • Go (WordZero): 2.62ms
    • Javascript: 9.63ms
    • Python: 55.98ms

    Go 确实快不少。

    使用体验

    API 设计比较直观,支持链式调用:

    doc := document.New() doc.AddParagraph("标题"). SetStyle(style.StyleHeading1). SetAlignment(document.AlignmentCenter) doc.AddParagraph("正文内容"). SetFontFamily("微软雅黑"). SetFontSize(12). SetColor("333333") doc.Save("report.docx") 

    项目地址

    GitHub: https://github.com/ZeroHawkeye/wordZero

    Gitee: https://gitee.com/Zmata_admin/WordZero

    有详细的文档和示例,examples 目录下有各种使用场景的 demo 。

    适用场景

    • 报表生成系统
    • 合同文档批量生成
    • 数据导出为 Word 格式
    • 文档模板填充
    • 自动化办公

    目前还在持续更新中,如果有需求或者 bug 欢迎提 issue 。


    纯 Go 实现,零依赖,开箱即用。如果对你有帮助记得给个 star

    40 条回复    2025-10-29 14:59:26 +08:00
    wangritian
        1
    wangritian  
       180 天前
    go 确实没有好用的开源 word 操作库,之前是 kotlin 接 apache 那套然后用 cgo 调用 jar 曲线救国的,star 支持一下
    jazzychai
        2
    jazzychai  
       180 天前
    star 了,刚好要做一个 word 相关的功能,本来想用 Python 曲线救国,试一下能不能满足业务需求
    sholmesian
        3
    sholmesian  
       180 天前 via iPhone
    这个正需要,已 start.
    icinessz
        4
    icinessz  
       180 天前
    太感谢了,一直在找类似的库
    tuimaochang
        5
    tuimaochang  
       180 天前
    大佬牛逼!
    body007
        6
    body007  
       180 天前
    为大佬点赞。
    bronyakaka
        7
    bronyakaka  
       180 天前
    很不错,很实用
    moell
        8
    moell  
       180 天前
    已 star
    676529483
        9
    676529483  
       180 天前   2
    支持下,以前有个项目要用 xls ,go 只支持 xlsx ,最后只能 Python 曲线救国了
    caotian
        10
    caotian  
       180 天前
    已 start, 有没有图表支持? 如果有的话, 就可以换掉 poi-tl 那套了, 那个库报了 Vulnerability 一直不更新修复, 快不敢用了.
    dbskcnc
        11
    dbskcnc  
       180 天前
    虽然基本不用 word,不过还是支持
    shengxiadiaoling
        12
    shengxiadiaoling  
       180 天前
    vfs
        13
    vfs  
       180 天前
    目前还没有需求,但是很赞
    Reficul
        14
    Reficul  
       180 天前   1
    @wangritian

    你这个转接的有点 6 啊。 kotlin -> jvm -> cgo -> go
    clow
        15
    clow  
    OP
       180 天前
    @caotian 多谢支持,图表还没实现,加到 todo 里了
    clow
        16
    clow  
    OP
       180 天前
    @dbskcnc 多谢支持~
    lexno
        17
    lexno  
       180 天前
    支不支持已有的 word 模板,然后使用这个模板来生成数据,我看现有的示例好像都是用库本身产生一个 document ,然后再进行模板填充?
    clow
        18
    clow  
    OP
       180 天前
    @lexno 支持的,使用 LoadTemplateFromDocument 加载模板文件即可
    keepfun
        20
    keepfun  
       180 天前
    厉害了
    HENQIGUAI
        21
    HENQIGUAI  
       180 天前
    虽然暂时用不到但还是点个赞
    clow
        22
    clow  
    OP
       180 天前 via Android
    @HENQIGUAI 感谢大佬,再接再厉
    wogogoing
        23
    wogogoing  
    PRO
       180 天前
    大佬可以的,感谢开源。已 star (github)。
    ace12
        24
    ace12  
       180 天前
    https://github.com/bobiverse/docxplate
    抄袭一下这里面的一些功能呢
    wangritian
        25
    wangritian  
       180 天前
    @Reficul 真正的胶水语言:C
    FightPig
        26
    FightPig  
       180 天前
    这个不错
    wzw
        27
    wzw  
       180 天前 via iPhone
    强烈支持一下,目前在用 python docx ,性能很差
    andyzhshg
        28
    strong>andyzhshg  
       180 天前
    特别需要一个输出 PDF 的功能,不过我调研一圈下来,貌似只有 C#调用微软官方的库靠谱一些,还要求是安装了 office 才能用。

    其他语言的要么是收费的,要么是要求安装 LibreOffice ,输出的格式也不太保真。
    crackidz
        29
    crackidz  
       179 天前
    赞这个之前会用到
    clow
        30
    clow  
    OP
       179 天前 via Android
    @andyzhshg 安排到待办,大佬可以提个 issue 记录下
    clow
        31
    clow  
    OP
       179 天前 via Android
    @wzw 感谢支持~ py 生态确实好,但也确定确实不适合生产
    wzw
        32
    wzw  
       179 天前 via iPhone
    @clow #30 下周就安排试试,可以的话用起来。 期待 pdf 和刷新目录的功能
    andyzhshg
        33
    andyzhshg  
       179 天前
    clow
        34
    clow  
    OP
       179 天前
    @jazzychai 大佬回复好勤快,感谢帮忙找到一堆小问题~
    jazzychai
        35
    jazzychai  
       179 天前
    @clow 你修的也超快,这个项目以后就是 go 的 word 操作第一库,哈哈
    playniuniu
        36
    playniuniu  
       178 天前
    感谢大佬,非常有用,已 Star
    wkla
        37
    wkla  
       177 天前
    这个牛逼啊。我比较好奇,不同的编辑器会乱码吗? docx 的格式是怎么分析的?
    clow
        38
    clow  
    OP
       176 天前 via Android
    @wkla 不同编辑器啥意思。Word 本质其实就是 xml ,只要符合 ooxml 规范就可以
    wkla
        39
    wkla  
       176 天前
    @clow #38 比如 wps 和 word 之间的兼容性,word 写的到 wps 格式乱了。原来是有规范的啊
    AAAmos
        40
    AAAmos  
       32 天前
    厉害厉害
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     836 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 22:33 PVG 06:33 LAX 14:33 JFK 17:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86