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(); } }
关键细节说明
- 表格布局的必要性:Word的流式文档结构中,纯段落和Run无法精准固定图片的左右位置,表格能提供稳定的容器实现分栏布局
- 边框隐藏:通过设置表格各边边框为NONE,让表格成为隐形容器,不影响整体视觉
- 图片尺寸控制:使用
Units.toEMU()将像素转换为Word内部的度量单位(EMU),确保图片大小符合预期 - 对齐设置:每个单元格内的段落设置居中对齐,让图片和标题在单元格内居中显示
替代方案(仅左右并排图片)
如果不需要中间标题,也可通过段落制表位实现,但稳定性不如表格:
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
相关产品推荐
相关产品推荐

