LibreCalc使用Macro VBA创建图表时如何调整标题、图例及绘图区位置
核心错误原因
你对Position、Size属性的赋值方式无效:在LibreOffice UNO API中,Position和Size是值传递的结构体,你直接修改返回的结构体的X/Y/Width/Height属性不会影响原对象,必须调用XShape接口的setPosition()和setSize()方法才能生效。
三个需求的实现方法
- 调整图表内部标题位置:标题对象本身实现了XShape接口,关闭自动定位后,构造
com.sun.star.awt.Point结构体传入setPosition方法即可 - 调整图例自定义位置:和标题逻辑一致,关闭AutomaticPosition后调用XShape的位置、尺寸设置方法即可,不需要设置Alignment参数
- 调整绘图区位置及尺寸:绘图区对应oDiagram对象,同样实现了XShape接口,先关闭
AutomaticPosition和AutomaticSize属性,再调用对应的位置、尺寸设置方法即可
修正后的关键代码片段
' 先引入需要用到的结构体构造方法 Dim oPoint As New com.sun.star.awt.Point Dim oSize As New com.sun.star.awt.Size ' ------------------------------ ' a) 调整标题位置 ' ------------------------------ oTitle = oChartDoc.getTitle() oTitle.String = "My title" ' 关闭标题自动定位 oTitle.AutomaticPosition = False ' 设置标题位置(单位是1/100毫米) oPoint.X = 1000 oPoint.Y = 500 oTitle.setPosition(oPoint) ' 也可以自定义标题尺寸 oSize.Width = 8000 oSize.Height = 1500 oTitle.setSize(oSize) ' ------------------------------ ' b) 调整图例自定义位置 ' ------------------------------ oLegend = oChartDoc.getLegend() oLegend.AutomaticPosition = False ' 不需要设置Alignment,直接自定义位置 oPoint.X = 12000 oPoint.Y = 3000 oLegend.setPosition(oPoint) oSize.Width = 2000 oSize.Height = 4000 oLegend.setSize(oSize) ' ------------------------------ ' c) 调整绘图区位置和尺寸 ' ------------------------------ ' 关闭绘图区自动位置和自动尺寸 oDiagram.AutomaticPosition = False oDiagram.AutomaticSize = False ' 设置绘图区在图表内的位置 oPoint.X = 2000 oPoint.Y = 2000 oDiagram.setPosition(oPoint) ' 设置绘图区尺寸 oSize.Width = 15000 oSize.Height = 7000 oDiagram.setSize(oSize)
注意事项
所有位置、尺寸的单位都是1/100毫米,比如1000对应的就是1厘米,你可以根据实际需求调整数值。另外你原来代码里直接修改oLegend.Position.X的写法是无效的,必须构造新的Point/Size结构体传入set方法才能生效。
内容的提问来源于stack exchange,提问作者Estatistics
相关产品推荐
相关产品推荐

