Java 导出 word 解决方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
t202201
V2EX    Java

Java 导出 word 解决方案

  •  
  •   t202201 2023-01-09 23:16:11 +08:00 5039 次点击
    这是一个创建于 1008 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前有一个需求,需要导出 word ,word 里除了普通文字,还有表格,表格不定长度,且有图片。<br><br>有大佬知道有什么简单的方案可以实现吗?
    第 1 条附言    2023-01-11 08:40:57 +08:00
    最终决定用了 poi-tl ,http://deepoove.com/poi-tl ,确实很强大,满足了所有需求。按照这个框架,基本上一天就做完了需求。
    32 条回复    2023-01-10 23:15:35 +08:00
    wangsongyan
        1
    wangsongyan  
       2023-01-09 23:21:47 +08:00 via iPhone
    freemarker+word xml
    blankmiss
        2
    blankmiss  
       2023-01-09 23:25:10 +08:00
    定义个模版 然后用 库去进行填充?
    hhjswf
        3
    hhjswf  
       2023-01-09 23:36:46 +08:00 via Android
    我的看法是数据给前端,前端渲染 html 转 word
    Akitora
        4
    Akitora  
       2023-01-09 23:40:12 +08:00
    freemarker+word xml
    kwh
        5
    kwh  
       2023-01-09 23:40:48 +08:00
    好像安装了 word 的 Windows 上可以通过命令调用转换成其他格式
    ElegantOfKing
        6
    ElegantOfKing  
       2023-01-09 23:45:27 +08:00
    我恰好在公司做这块的。结论直接告诉你:没有简单的。
    调研过很多方案,没有一个合适的,最终只能自研。
    建议不要接这个项目。如果真的要接的话,去看看 word 的组成 xml 如何组装,以及 poi jar 包下的一些工具。
    Naccl
        7
    Naccl  
       2023-01-09 23:55:40 +08:00
    freemarker+word xml
    先用 word 写个模板导出 xml ,用 freemarker 填充
    可以看看 https://github.com/pingfangushi/screw
    曾经也做过类似的小玩具 https://github.com/Naccl/Java2Doc
    nodejx
        8
    nodejx  
       2023-01-10 00:02:07 +08:00
    Suaxi
        9
    Suaxi  
       2023-01-10 00:06:01 +08:00 via Android
    用 poi-tools 做过文字 + 不定长表格的导出,还行,不过可以试试楼上说的 freemaker + word xml ,以前组长用 jasper 做过按模板导出,也还行
    Naccl
        10
    Naccl  
       2023-01-10 00:10:03 +08:00
    @nodejx markdown 是其中一种输出,也支持 word ,核心思想就是按模板填充文本,导出对应格式的文件
    lyonbrown4ddd
        11
    lyonbrown4ddd  
       2023-01-10 00:13:49 +08:00 via iPhone
    了解一下 pandoc ? 我记得好像可以 html 转 word 如果不行就先 makrdown 再 word
    Jirajine
        12
    Jirajine  
       2023-01-10 01:49:08 +08:00
    如果要打印,那就渲染成 pdf ;如果要展示,那就渲染成 HTML 。转成 word 很简单,但是对效果有任何要求的,不拥抱开放格式那就踩坑去吧。
    Z0dVmSoDcLSO49S4
        13
    Z0dVmSoDcLSO49S4  
       2023-01-10 06:29:54 +08:00 via Android
    t202201
        14
    t202201  
    OP
       2023-01-10 08:08:44 +08:00
    @lyonbrown4ddd 我之前浅浅地用过 pandoc ,当时还是用命令行,不知道有没有 java 的 api
    inrmsYu
        15
    inrmsYu  
       2023-01-10 08:41:52 +08:00
    easyPOI 映射实现
    tedzhou1221
        16
    tedzhou1221  
       2023-01-10 08:49:19 +08:00
    poi-tl ,用 freemarker 太难维护了。用了 poi-tl 之后真爽。
    luoyonghao
        17
    luoyonghao  
       2023-01-10 09:18:45 +08:00
    用 poi-tl 吧,我最近做的公司报表就是基于 poi-tl 做的,你的需求很容易实现,目前我的报告实现了普通文本、表格、有序列表、图表( word 图表),合并单元格,还可编写自定义插件实现别的样式,甚至还有代码高亮
    Hyakutake
        18
    Hyakutake  
       2023-01-10 09:21:46 +08:00
    不懂原始需求,如果可以用模板优先关键字加模板,这种最简单。
    如果不可以用模板实现,我建议直接 POI ,楼上说的那些基本都是用 POI ,封装一些接口出来方便使用的,我不建议用。更倾向直接 POI ,可以研究一下。另外 注意 office 版本。要兼容。
    weijiagege
        19
    weijiagege  
       2023-01-10 09:36:11 +08:00
    做过类似的需求,也一样是文字,表格,以及 echart 图片等,另外模板内容不固定随时变换,当时讨论后最终选择让前端来导出。前端做的就是将数据拼装成对应的 html 字符串,后面转 blob 然后调插件导出 docx 文件。坑略多但总体效果还可以。
    ql562482472
        20
    ql562482472  
       2023-01-10 09:41:36 +08:00
    有开发能力就用 poi 没有就用 poitl 或者 easypoi 很容易。
    lwc645089781
        21
    lwc645089781  
       2023-01-10 10:06:05 +08:00
    aspose word 非常简单,效果也是最好的。只是不免费
    Mandelo
        22
    Mandelo  
       2023-01-10 10:08:55 +08:00
    用模板填充的路过,表格头像都可以
    nyar
        23
    nyar  
       2023-01-10 10:16:02 +08:00
    aspose word 来做很简单,aspose 网上也有破解版,可以先试试效果。
    Gavin666
        24
    Gavin666  
       2023-01-10 10:40:47 +08:00
    关键词:libreoffice
    OrangeAdd
        25
    OrangeAdd  
       2023-01-10 10:43:32 +08:00
    楼主可以看看这个 http://deepoove.com/poi-tl ,亲测挺好用的。
    LovelornOwl
        26
    LovelornOwl  
       2023-01-10 10:54:12 +08:00
    java 导 word 用 docx4j
    nitmali
        27
    nitmali  
       2023-01-10 11:08:43 +08:00
    jxls
    YvenChang
        28
    YvenChang  
       2023-01-10 11:11:22 +08:00
    我司一开始用的最简单直接的方法就是组装一个 html 然后输出成 docx 后缀的文件,office 可以直接打开 html 文件,但是问题是对他做任何修改都会在本地生成一个 html 资源目录。
    解决方案就是组装成 mhtml 格式就能让这些资源都保存在一个文件里。
    但是...emmm 就是会有各种奇奇怪怪的问题。
    最好的方案当然还是找个成熟的框架,不过这个方法应急还是可以的。
    xuanbg
        29
    xuanbg  
       2023-01-10 11:19:19 +08:00
    POI
    gg1025
        30
    gg1025  
       2023-01-10 11:23:31 +08:00
    poi-tl 神器
    lyonbrown4ddd
        31
    lyonbrown4ddd  
       2023-01-10 14:12:50 +08:00
    @t202201 pandoc 我记得没有 java api 拿 command 方式调用么 我觉得这个是最简单的方式了 只是需要集成一下 pandoc
    b1gCi
        32
    b1gCi  
       2023-01-10 23:15:35 +08:00 via Android
    原来做过几年相关的开发,推荐 docx4j ,不行就自己 freemarker 生成 word xml
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1423 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 16:55 PVG 00:55 LAX 09:55 JFK 12:55
    Do have faith in what you're doing.
    ubao 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