Apache POI XSLF如何获取连接器两端关联的形状?
解决Apache POI获取PPT连接器关联形状的问题
明确结论:XSLFConnectorShape(连接器对象)本身存储了两端关联形状的引用,不需要通过遍历顺序推断,可直接通过API方法获取。
具体实现步骤
- 遍历形状时,先判断当前形状是否为
XSLFConnectorShape类型 - 若是连接器,调用
getStartShape()和getEndShape()方法直接获取两端关联的形状对象 - 这两个方法返回
XSLFShape,可根据需求转换为具体形状类型(如XSLFAutoShape、XSLFTextBox等)
修改后的代码示例
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(file)); List<XSLFSlide> slides = ppt.getSlides(); System.out.println("幻灯片中的形状及连接器关联信息: "); for (XSLFSlide slide : slides) { List<XSLFShape> shapes = slide.getShapes(); for (XSLFShape shape : shapes) { String shapeName = shape.getShapeName(); int shapeId = shape.getShapeId(); Rectangle2D anchor = shape.getAnchor(); // 打印通用形状信息 System.out.printf("名称: %s | ID: %d | 位置: %s%n", shapeName, shapeId, anchor.toString()); // 处理连接器形状 if (shape instanceof XSLFConnectorShape) { XSLFConnectorShape connector = (XSLFConnectorShape) shape; XSLFShape startShape = connector.getStartShape(); XSLFShape endShape = connector.getEndShape(); if (startShape != null) { System.out.printf(" 连接器起点: %s (ID: %d)%n", startShape.getShapeName(), startShape.getShapeId()); } if (endShape != null) { System.out.printf(" 连接器终点: %s (ID: %d)%n", endShape.getShapeName(), endShape.getShapeId()); } } // 修正原代码中的文本获取错误(仅针对文本形状) if (shape instanceof XSLFTextShape) { XSLFTextShape textShape = (XSLFTextShape) shape; String textBody = textShape.getText(); System.out.printf(" 文本内容: %s%n", textBody); } } } ppt.close();
关键说明
getStartShape()和getEndShape()直接返回连接器绑定的形状对象,无需额外遍历匹配- 需做空值判断:若连接器未绑定形状,两个方法会返回
null - 原代码中
String textBody = thisShape.;是语法错误,需根据形状类型调用对应文本获取方法
内容的提问来源于stack exchange,提问作者Rasputin
相关产品推荐
相关产品推荐

