[РЕШЕНО]Почему аналог сreateUnoService не работает в макросе python?

Автор Rafik, 11 сентября 2015, 10:37

0 Пользователи и 1 гость просматривают эту тему.

Rafik

import uno
import pyuno
import unohelper
def PropertyValueArray(num):
   l = []
   for x in range(num):
       _p = serviceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
       _p.Name = ''
       _p.Value = ''
       l.append(_p)
   return l

def opendoc1(self):
   ctx = uno.getComponentContext()
   smgr = ctx.ServiceManager
   # Диалог выбора файла
   oFileDlg = smgr.createInstanceWithContext("com.sun.star.ui.dialogs.FilePicker",ctx)
   # Зададим фильтры
   oFileDlg.AppendFilter("Все файлы (*.*)", "*.*")
   oFileDlg.AppendFilter("Таблицы (*.htm)", "*.htm")
   oFileDlg.SetCurrentFilter("Таблицы (*.htm)")
   oFileDlg.setMultiSelectionMode(uno.bool(0))
   #Выполнить диалог выбора файла.
   status = oFileDlg.execute


Выдает ошибку:

com.sun.star.uno.RuntimeExceptionError during invoking function opendoc1 in module vnd.sun.star.tdoc:/19/Scripts/python/conv/conv.py (<class 'AttributeError'>: AppendFilter
 vnd.sun.star.tdoc:/19/Scripts/python/conv/conv.py:22 in function opendoc1() [None]
 C:\Program Files\LibreOffice 4\program\pythonscript.py:869 in function invoke() [ret = self.func( *args )])


ОС WinXP
LibreOffice 4.2.2.1

Не могу понять почему  FilePicker перестал принимать настройки фильтров? Криво сформировался объект? Как правильно сформировать его?
Везде, во всех примерах, бейсиковский createUnoService сделан через createInstance или через  createInstanceWithContext. Оба варианта дают эту же ошибку.
Если попытаться сделать запуск с фильтрами по умолчанию — диалог не открывается, execute не срабатывает и никакую ошибку не выдает.

Для интересующихся зачем мне надо открывать файл таким извращенным способом.

Есть файл *.htm, созданный в excel. Хочу открыть его с фильтром calc_HTML_WebQuery и сохранить с фильтром calc8. Потом открыть этот же *.htm через open(), собрать информацию форматировании (из секции style) в словарь. Затем, дойдя до секции tbody, брать из *.htm инфу о формате каждой ячейки и   форматировать соответствующую ячейку в документе *.ods. Таким образом можно будет конвертировать документ *.htm в *.ods за один цикл чтения файла *.htm.

Загрузка *.htm напрямую в calc с фильтром  calc_HTML_WebQuery приводит к тому, что форматирование  (шрифты, обрамление, ширина колонок, объединение ячеек)  игнорируется LO. Другой фильтр, HTML (StarCalc), тоже не отрабатывает форматирование и, в качестве бонуса кривизны, грузит таблицу со смещением: во второй строке содержимое А в колонке В, на третьей — в С и т.д. Соответственно, содержимое других колонок тоже смещены вправо.

rami

Цитата: Rafik от 11 сентября 2015, 08:37Для интересующихся зачем мне надо открывать файл таким извращенным способом.
Э, батенька, вы не знаете, что такое "извращённые способы", вот попробуйте для начала открыть файл с помощью маслянного фильтра ;D

FilePicker предназначен только для выбора файла, результат его действия — адрес URL выбранного файла в виде строки. Никакого влияния на импорт файла он не оказывает и никак с фильтрами импорта не связан.

Попробуйте заново задать параметры для FilePicker

# Зададим фильтры
oFileDlg.AppendFilter("Таблица HTM", "*.htm") 'фильтр отбора файлов
oFileDlg.SetCurrentFilter("Таблица HTM") 'имя фильтра
sFileURL="file:///Users/путь к папке в которой ищем"
oFilePicker.setDisplayDirectory(sFileURL)
#Выполнить диалог выбора файла.
oFileDlg.execute()
sURL=oFileDlg.getFiles() 'получаем URL выбранного файла

Rafik

#2
Этот фрагмент прекрасно работает в бейсике. Единственное, что я здесь изменил - это вместо createUnoService поставил его аналог для питона.
В питоне суть сообщения об ошибке: <class 'AttributeError'>: AppendFilter говорит о том, что атрибута AppendFilter как бы не существует для этого объекта, хотя в бейсике он есть. Если спросить у скрипта тип переменной oFileDlg, то показывает, кажется, <PyUno object>, т.е. как всё нормально.
Не открывается - имеется в виду - не открывается сам диалог выбора файла. Если закоментить задание фильтра для выбора файлов, то диалог должен открыться с фильтром по умолчанию, т.е. с перечислением расширений заданых приложением из которого он запущен.

Rafik

Наконец-то ответ найден. В питоне всё регистрозависимое. Поэтому AppendFilter и appendFilter это две разные вещи! Это не бейсик, которому фиолетово в каком регистре свойство/метод.