Задачу решил обходным путём. Либре/опен офис умеют сами перебирать свои окна и можно получить доступ к любому из них. Для решения задачи было использовано это свойство офиса.
Вот тестовый скрипт, который находит нужный документ:
# -*- coding: utf-8 -*-
import win32com.client
import xlrd, urllib.parse
def get_fl(doc_nm, in_zag, koor):
""" Ищет документ, открытый calc-ом либреофиса, удовлетворяющий условиям:
1. в имени открытого файла должен содержаться фрагмент doc_nm
2. в ячейке с координатами koor должен быть фрагмент строки in_zag
koor - кортеж (индекс_колонки, индекс_строки)
-------
Возвращает ссылку на лист книги, открытой xlrd"""
smgr = win32com.client.Dispatch("com.sun.star.ServiceManager")
dct = smgr.CreateInstance("com.sun.star.frame.Desktop")
# Получаем Enumeration всех компонентов либре/опен офиса
cmpns = dct.getComponents().createEnumeration()
sheet = cmpn = False
while True:
# Есть элементы?
elem = cmpns.hasMoreElements()
if not elem:
break
# получаем один компонент из всех
cmpn = cmpns.nextElement()
# Элемент поддерживает сервис, характерный для электронной таблицы?
if cmpn.supportsService("com.sun.star.sheet.SpreadsheetDocument"):
# Получим и расшифруем имя файла
fl_nm = cmpn.URL
a = urllib.parse.urlsplit(fl_nm)
fl_nm = urllib.parse.unquote(a.path[1:])
# print(fl_nm)
if doc_nm.upper() in fl_nm.upper():
wb = xlrd.open_workbook(fl_nm)
sheet = wb.sheet_by_index(0)
zag = sheet.cell(koor[1], koor[0]).value
if in_zag.upper() in zag.upper():
break
return sheet # Вернём ссылку на лист книги, открытой xlrd
print(get_fl("Книга1", "оборот", (4, 0)))