You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache POI操作Docx文件:图片左右布局及标题放置问题求助

使用Apache POI实现Word文档中图片左右布局并插入中间标题

要实现两张图片分放左右、中间插入标题的布局,最可靠的方式是借助表格容器来控制位置(纯XWPFRun/XWPFParagraph难以精确实现这种对齐)。以下是具体实现代码及关键说明:

核心实现步骤

  • 创建1行3列的表格,分别承载左图、标题、右图
  • 隐藏表格边框,避免影响视觉效果
  • 分别在左右单元格插入图片并调整大小
  • 在中间单元格添加标题并设置对齐样式

完整代码示例

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;

public class WordImageLayout {
    public static void main(String[] args) throws IOException {
        // 创建Word文档对象
        XWPFDocument document = new XWPFDocument();
        
        // 创建1行3列的表格
        XWPFTable table = document.createTable(1, 3);
        // 隐藏表格所有边框
        table.setInsideHBorder(XWPFBorderType.NONE, 0, 0, "FFFFFF");
        table.setInsideVBorder(XWPFBorderType.NONE, 0, 0, "FFFFFF");
        table.setTopBorder(XWPFBorderType.NONE, 0, 0, "FFFFFF");
        table.setBottomBorder(XWPFBorderType.NONE, 0, 0, "FFFFFF");
        table.setLeftBorder(XWPFBorderType.NONE, 0, 0, "FFFFFF");
        table.setRightBorder(XWPFBorderType.NONE, 0, 0, "FFFFFF");
        
        // 设置表格总宽度与列宽(单位:twentieths of a point,可按需调整)
        CTTblWidth tblWidth = CTTblWidth.Factory.newInstance();
        tblWidth.setW(BigInteger.valueOf(9000));
        table.getCTTbl().getTblPr().setTblW(tblWidth);
        
        // 左单元格:插入图片
        XWPFTableCell leftCell = table.getRow(0).getCell(0);
        leftCell.setWidth("3000");
        XWPFParagraph leftPara = leftCell.addParagraph();
        leftPara.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun leftRun = leftPara.createRun();
        // 替换为你的本地图片路径
        try (FileInputStream fis = new FileInputStream("left-image.jpg")) {
            leftRun.addPicture(fis, XWPFDocument.PICTURE_TYPE_JPEG, "left-image.jpg", Units.toEMU(150), Units.toEMU(100));
        }
        
        // 中间单元格:添加标题
        XWPFTableCell middleCell = table.getRow(0).getCell(1);
        middleCell.setWidth("3000");
        XWPFParagraph middlePara = middleCell.addParagraph();
        middlePara.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun middleRun = middlePara.createRun();
        middleRun.setText("图片对比标题");
        middleRun.setFontSize(14);
        middleRun.setBold(true);
        
        // 右单元格:插入图片
        XWPFTableCell rightCell = table.getRow(0).getCell(2);
        rightCell.setWidth("3000");
        XWPFParagraph rightPara = rightCell.addParagraph();
        rightPara.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun rightRun = rightPara.createRun();
        // 替换为你的本地图片路径
        try (FileInputStream fis = new FileInputStream("right-image.jpg")) {
            rightRun.addPicture(fis, XWPFDocument.PICTURE_TYPE_JPEG, "right-image.jpg", Units.toEMU(150), Units.toEMU(100));
        }
        
        // 保存文档
        try (FileOutputStream out = new FileOutputStream("image-layout.docx")) {
            document.write(out);
        }
        document.close();
    }
}

关键细节说明

  1. 表格布局的必要性:Word的流式文档结构中,纯段落和Run无法精准固定图片的左右位置,表格能提供稳定的容器实现分栏布局
  2. 边框隐藏:通过设置表格各边边框为NONE,让表格成为隐形容器,不影响整体视觉
  3. 图片尺寸控制:使用Units.toEMU()将像素转换为Word内部的度量单位(EMU),确保图片大小符合预期
  4. 对齐设置:每个单元格内的段落设置居中对齐,让图片和标题在单元格内居中显示

替代方案(仅左右并排图片)

如果不需要中间标题,也可通过段落制表位实现,但稳定性不如表格:

XWPFParagraph para = document.createParagraph();
para.setAlignment(ParagraphAlignment.BOTH);
// 添加左、右对齐制表位
CTTabs tabs = para.getCTP().addNewPPr().addNewTabs();
CTTabStop leftTab = tabs.addNewTab();
leftTab.setVal(STTabJc.LEFT);
leftTab.setPos(BigInteger.valueOf(3000));
CTTabStop rightTab = tabs.addNewTab();
rightTab.setVal(STTabJc.RIGHT);
rightTab.setPos(BigInteger.valueOf(6000));

XWPFRun run1 = para.createRun();
run1.addPicture(new FileInputStream("left.jpg"), XWPFDocument.PICTURE_TYPE_JPEG, "left.jpg", Units.toEMU(150), Units.toEMU(100));
run1.addTab(); // 跳转到右制表位
XWPFRun run2 = para.createRun();
run2.addPicture(new FileInputStream("right.jpg"), XWPFDocument.PICTURE_TYPE_JPEG, "right.jpg", Units.toEMU(150), Units.toEMU(100));

内容的提问来源于stack exchange,提问作者Azizjon Malikov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:20:16