百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Java操作Office:POI之word生成

liuian 2025-02-15 00:06 45 浏览

程序员架构进阶

一 背景

最近在项目开发中,有数据导出到word的需求。这就涉及代码生成word文档的操作,且有格式要求。大家用word做过简历的都有了解,做简历时,会使用表格、图片、文字等元素。而且表格也可能有嵌套、合并单元格,以及插入图片到单元格的操作。该怎么做?

二 Java操作Office方案

百度一下Java Office操作,或者再直接一点搜索Java word,就比较容易搜到iText、POI等组件。在文章 Java导出word的几种方式 这篇文章中,提到了包括Jacob、Apache POI、Java2word、iText、FreeMarker五种方式。

通过对比,结合需求要求,最终选择了Apache POI来实现,所以这里先详细介绍POI,以及一个可用的demo,供参考。

三 ApachePOI

Apache POI(官网)是基于Office Open XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)处理各种文件格式的开源项目。简而言之,您可以使用Java读写MS Excel文件,可以使用Java读写MS Word和MS PowerPoint文件。

poi的gitee地址:gitee。入门教程可以参考 Apache POI Word(docx) 入门示例教程。

四 版本信息

poi的最新版本已经到了5.0.0,不过可以找到的大部分demo都是基于3.x版本或4.1版本。为了尽快搭建demo并运行起来,我们也没有使用最新版本,而是选择了4.1.0进行开发。

4.1 引用依赖


    8
    8
    4.1.0






    
        org.apache.poi
        poi
        ${poi.version}
    


    
    
        org.apache.poi
        poi-ooxml
        ${poi.version}
    
    
        org.apache.poi
        poi-excelant
        ${poi.version}
    


    
    
        com.deepoove
        poi-tl
        1.5.0
    


    
        org.projectlombok
        lombok
        1.18.20
    

4.2 创建word示例代码

4.2.1 创建新的文档

创建word文档比较简单,直接使用new XWPFDocument即可,XWPFDocument是对 .docx 文档操作的高级封装API:

XWPFDocument doc = new XWPFDocument();

4.2.2 表格

即Word文档中的表格。API创建时需要指定行数和列数,示例如下:

//创建一个表格,并指定宽度
XWPFTable table = doc.createTable(4, 4);
TableTools.widthTable(table, MiniTableRenderData.WIDTH_A4_FULL, 4);


//设置第0行数据
List row0 = table.getRow(0).getTableCells();
row0.get(0).setText("xxxx"); //为第0行第0列设置内容
row0.get(0).setWidth("200");
row0.get(1).setText("aaaa");
row0.get(2).setText("bbbb");
row0.get(3).setText("cccc");

常规的简单表格,我们只要按照上述代码逐行操作即可;但现实中不会这么容易。通常会涉及在单元格插入图片、合并行、合并列,甚至表格嵌套。目前表格嵌套暂未实现,先介绍其他三种情况。

4.2.3 列合并

有两种方法,一种是使用addNewHMerge方法,通过设置合并的起始列和结束列,逐个列进行合并:

List row2_1 = table.getRow(2).getTableCells();
row2_1.get(0).setText("合并表格"); //为第0行第0列设置内容
//将第一列到第四列合并
for (int i = 1; i <= 3; i++) {
    //对单元格进行合并的时候,要标志单元格是否为起点,或者是否为继续合并
    if (i == 1)
        row2_1.get(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);//这是起点
    else
        row2_1.get(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);//继续合并
}

在业务代码中这样的写法稍显繁琐,我们也可以直接使用
TableTools.mergeCellsHorizonal()函数来执行合并:

// 合并第一行的第0列到第8列单元格
TableTools.mergeCellsHorizonal(table, 1, 0, 8);

4.2.4 行合并

如果是要合并某几行,也可以使用TableTools提供的方法:

// 合并第0列的第一行到第九行的单元格
TableTools.mergeCellsVertically(table, 0, 1, 9);

我们看一下TableTools的源码:

public static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        if (toRow > fromRow) {
            for(int rowIndex = fromRow; rowIndex <= toRow; ++rowIndex) {
                XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
                CTTcPr tcPr = getTcPr(cell);
                CTVMerge vMerge = tcPr.addNewVMerge();
                if (rowIndex == fromRow) {
                    vMerge.setVal(STMerge.RESTART);
                } else {
                    vMerge.setVal(STMerge.CONTINUE);
                }
            }


        }
    }

可以发现,底层还是使用addNewVMerge等方法,也设置了起始和结束位置,只是做了一层封装。

4.2.5 图片插入表格

图片插入表格要麻烦一些,如果大家在百度上搜索过插入图片到表格方法,大概率会找到这样的操作:

大部分对应的都是3.9以前的版本,写起来比较复杂,而且在4.x之后,图中super.getRelationId()方法也发生了变化,代码报错。

通过调研,发现XWPFRun中提供了addPicture方法,写起来也简单了很多。一个示例如下:

String imageFile = "/Users/xxx/Downloads/图片 1.png";
InputStream stream = new FileInputStream(imageFile);


//表格中创建段落
XWPFParagraph paragraph = row2_1.get(1).getParagraphs().get(0);
XWPFRun run = paragraph.createRun();
run.addPicture(stream, XWPFDocument.PICTURE_TYPE_PNG, "Generated",
    Units.toEMU(364), Units.toEMU(256));

run.addPicture接收的参数依次为:图片的InputStream流,图片类型,图片名称(非文件名),图片宽度、图片高度。通过这个方法,我们就可以把图片插入到指定的表格中,并设置图片的宽高属性。

五 总结

通过上述介绍,大家应该可以简单实现一个表格了。本文的方式还是偏向于硬编码的方式,在很多场景(例如简历、报表等典型场景)可以采用模板的方式,创建word模板,然后用模板内容替换来生成复杂样式的表格。这个在后续文章中再做介绍,大家也可以先搜索相关的实现来学习了解。

相关推荐

驱动网卡(怎么从新驱动网卡)
驱动网卡(怎么从新驱动网卡)

网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...

2026-01-30 00:37 liuian

win10更新助手装系统(微软win10更新助手)

1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...

windows11专业版密钥最新(windows11专业版激活码永久)

 Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...

手机删过的软件恢复(手机删除过的软件怎么恢复)
手机删过的软件恢复(手机删除过的软件怎么恢复)

操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...

2026-01-29 23:55 liuian

一键ghost手动备份系统步骤(一键ghost 备份)

  步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。  步骤...

怎么创建局域网(怎么创建局域网打游戏)

  1、购买路由器一台。进入路由器把dhcp功能打开  2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。  3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...

精灵驱动器官方下载(精灵驱动手机版下载)

是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...

一键还原系统步骤(一键还原系统有哪些)

1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。  2、在弹出的“准备安装”窗口中,可...

电脑加速器哪个好(电脑加速器哪款好)

我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...

任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)

是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...

u盘怎么恢复文件(u盘文件恢复的方法)

开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...

系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)

1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...

剪贴板权限设置方法(剪贴板访问权限)
剪贴板权限设置方法(剪贴板访问权限)

1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...

2026-01-29 21:37 liuian

平板系统重装大师(平板重装win系统)

如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...

联想官网售后服务网点(联想官网售后服务热线)

联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...