Форум сайта python.su
27
Я могу с помощью win32gui перебрать открытые окна и даже получить заголовок окна, содержащий имя файла (без путей), открытого либреофисом. Возможно ли получить полное имя файла (с путями), открытого в окне?
Пытался решить задачу получением списка процессов с помощью консольной команды wmic, но получил облом: если либреофисом открыто несколько окон, то в списке процессов windows XP виден только первый открытый файл, а остальные не видны. Интересующий меня файл может быть открыт не обязательно первым. Мне необходимо знать откуда он открыт: из $TEMP/abcd или был сохранён в папку пользователя и открыт оттуда.
Отредактировано Rafik (Сен. 4, 2018 08:08:59)
Офлайн
27
Задачу решил обходным путём. Либре/опен офис умеют сами перебирать свои окна и можно получить доступ к любому из них. Для решения задачи было использовано это свойство офиса.
Вот тестовый скрипт, который находит нужный документ:
# -*- 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)))
Офлайн