如何通过 pyuno 提取 LibreOffice calc 中当前选定的单元格范围?

Posted

技术标签:

【中文标题】如何通过 pyuno 提取 LibreOffice calc 中当前选定的单元格范围?【英文标题】:How can you extract the currently-selected range of cells in LibreOffice calc via pyuno? 【发布时间】:2015-02-18 20:28:50 【问题描述】:

在 LibreOffice / OpenOffice calc python 宏中使用 pyuno 时,我希望能够选择一系列单元格,并且在运行宏时,对于所有单元格数据(例如,作为一些可迭代对象)能够在 python 脚本中检索,以便可以对其进行操作。我几乎找不到任何关于此的文档,并且欢迎一些示例代码来演示如何执行此操作。

【问题讨论】:

【参考方案1】:

经过一段非常痛苦的试验和错误时间(感谢任何地方关于 pyuno 使用的文档和示例很少——如果我忽略了某些内容,请纠正我),我最终得到了以下代码,它似乎可以完成我的工作'我之后:

import uno
doc = XSCRIPTCONTEXT.getDocument()

def mymodule():
    ctrlr = doc.CurrentController
    sel = ctrlr.getSelection()
    x = sel.getDataArray()
    # now the data is available as nested tuples in x, so do something with it
    file('/tmp/out', 'w').write(repr(x))

这可以放入一个 python 文件,并存储在~/.config/libreoffice/4/user/Scripts/python 目录中(至少在 Ubuntu 14.04 中),然后只要安装了libreoffice-script-provider-python 包,就可以在 LibreOffice Calc 中通过以下方式运行它工具->宏->运行宏菜单选项。或者可以使用 Tools->Customize->Keyboard 对话框将其绑定到键盘快捷键。

有关允许将数据从 LibreOffice Calc 加载到 Octave 以进行进一步分析的更完整示例,请参阅this pyuno script。

【讨论】:

API 参考:api.libreoffice.org/docs/idl/ref/…【参考方案2】:

或者你可以试试这样的东西,我认为这更容易理解。

    desktop = XSCRIPTCONTEXT.getDesktop()
    model = desktop.getCurrentComponent()
    try:
        sheets = model.getSheets()
    except AttributeError:
        raise Exception("This script is for Calc Spreadsheets only")
    #sheet = sheets.getByName('Sheet1')
    sheet = model.CurrentController.getActiveSheet()
    oSelection = model.getCurrentSelection()
    oArea = oSelection.getRangeAddress()
    first_row = oArea.StartRow
    last_row = oArea.EndRow
    first_col = oArea.StartColumn
    last_col = oArea.EndColumn

【讨论】:

以上是关于如何通过 pyuno 提取 LibreOffice calc 中当前选定的单元格范围?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LibreOffice Calc 中使用 PyUNO 更改单元格边框的 LineWidth?

使用 pyuno 在 LibreOffice writer 文档中搜索正则表达式非常贪婪

Python 2.7 与 pyuno

优化 PyUno 中的公式复制

让 python 导入 uno / pyuno

将 LibreOffice Impress 导出的 flash 文件转换为 mp4 格式?