使用Apache POI 5.2.5的XMLSlideShow无法创建气球与标注形状求助
解决Apache POI 5.2.5中无法创建气球、标注类形状的问题
标注类(如ACCENT_CALLOUT_1、BALLOON)和基础形状的核心区别在于:这类形状包含可调整的特殊结构(比如标注的尾巴、气球的弧度),必须手动设置**调整参数(adjustments)**才能正确渲染。默认情况下POI不会为这类形状自动生成调整值,导致形状无法正常显示。
修改后的Kotlin代码
import org.apache.poi.sl.usermodel.* import org.apache.poi.xslf.usermodel.XMLSlideShow import java.awt.Color import java.awt.Rectangle fun main() { val slideShow: SlideShow<*, *> = XMLSlideShow() val slide = slideShow.createSlide() // 带调整值的标注形状 var autoShape = slide.createAutoShape() autoShape.shapeType = ShapeType.ACCENT_CALLOUT_1 autoShape.fillColor = Color.BLUE autoShape.anchor = Rectangle(100, 400, 150, 100) // 设置标注尾巴的位置偏移(参数取值0-1,对应控制点相对形状的比例) autoShape.adjustments = doubleArrayOf(0.2, 0.8) // 带调整值的气球形状 autoShape = slide.createAutoShape() autoShape.shapeType = ShapeType.BALLOON autoShape.fillColor = Color.GREEN autoShape.anchor = Rectangle(300, 400, 150, 100) // 气球调整值:第一个控制尾巴位置,第二个控制气球弧度 autoShape.adjustments = doubleArrayOf(0.3, 0.5) // 带调整值的弯曲箭头 autoShape = slide.createAutoShape() autoShape.shapeType = ShapeType.BENT_ARROW autoShape.fillColor = Color.YELLOW autoShape.anchor = Rectangle(500, 400, 100, 100) // 调整值控制箭头弯曲程度 autoShape.adjustments = doubleArrayOf(0.4) // 正常工作的基础形状 autoShape = slide.createAutoShape() autoShape.shapeType = ShapeType.ROUND_1_RECT autoShape.fillColor = Color.CYAN autoShape.anchor = Rectangle(100, 550, 100, 50) val line = slide.createAutoShape() line.shapeType = ShapeType.LINE line.anchor = Rectangle(250, 250, 100, 200) line.fillColor = Color(0, 128, 0) // 写入输出文件 slideShow.write(java.io.FileOutputStream("test-shapes.pptx")) slideShow.close() }
关键细节说明
- 调整值的作用:不同标注类形状需要的调整参数数量和含义不同,参数取值通常在0-1之间,对应形状可编辑控制点的相对位置:
- 标注类(
ACCENT_CALLOUT_*系列):一般需要2个参数,分别控制标注尾巴的水平、垂直偏移比例 - 气球形状(
BALLOON):2个参数分别控制尾巴位置和气球弧度 - 弯曲箭头(
BENT_ARROW):1个参数控制箭头的弯曲程度
- 标注类(
- 锚点尺寸:标注类形状需要足够的宽高(anchor参数),过小的尺寸可能导致形状显示异常
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

