如何修改LibreOffice Python宏仅获取选中区域内的公式代码?
解决LibreOffice Writer宏仅输出选中区域内公式代码的问题
修改后的代码
import uno from com.sun.star.container import XIndexAccess from com.sun.star.drawing import ShapeType def explore_objects_in_selection(): doc = XSCRIPTCONTEXT.getDocument() selection = doc.getCurrentSelection() # 把选中对象转换成可遍历的集合 if not isinstance(selection, XIndexAccess): # 单个选中对象包装成数组 selection = uno.Any("[]com.sun.star.uno.XInterface", [selection]) # 先处理直接选中的公式形状 for i in range(selection.getCount()): obj = selection.getByIndex(i) # 检查是不是公式所在的框架形状 if hasattr(obj, "getShapeType") and obj.getShapeType() == ShapeType.FRAME: embedded_obj = obj.getEmbeddedObject() if hasattr(embedded_obj, "Formula"): print(embedded_obj.Formula) # 再处理选中文本区域内的公式 text_cursor = doc.getCurrentController().getViewCursor() # 选中区域非空时才处理 if text_cursor.getText().getString().strip() != "": for draw_page in doc.getDrawPages(): for shape in draw_page: if shape.getShapeType() == ShapeType.FRAME: embedded_obj = shape.getEmbeddedObject() if hasattr(embedded_obj, "Formula"): # 获取公式在文本中的锚点范围 anchor_range = shape.getAnchor() # 判断锚点是否落在选中的文本范围内 if anchor_range.compareRegionStart(text_cursor.getStart()) >= 0 and \ anchor_range.compareRegionEnd(text_cursor.getEnd()) <= 0: print(embedded_obj.Formula)
修改要点
- 直接处理选中的公式:遍历选中集合里的每个对象,判断是否是公式的容器
FrameShape,如果是则直接提取内部公式代码,对应直接选中公式的场景。 - 筛选文本区域内的公式:如果选中的是文本范围,通过公式的文本锚点判断它是否处于选中区域内。公式在Writer里是锚定到文本位置的,只要锚点落在选中的文本区间内,就认为是区域内的公式。
关键逻辑说明
getShapeType():确认形状是公式所在的框架类型。getEmbeddedObject().Formula:获取Math公式的内部代码。getAnchor()+范围比较:判断公式的锚点是否在选中的文本区域内,实现文本区域内公式的筛选。
内容的提问来源于stack exchange,提问作者jmg74
相关产品推荐
相关产品推荐

