Книга знаний

1С:Предприятие / Объекты конфигурации / Отчеты

OpenOffice. Writer. Способ поиска на основе свойств символов.

Вместо конструкций [ФИОРуководителя] - просто выделяем цветом, то, что считаем параметрами поиска и
замены. Позволяет, в частности, из неизвестного документа вытащить список всех параметров замены.
Заодно, разобраны варианты работы как через скрипты, так и через массивы COMSafeArray
Автор статьи: stran06 | Редакторы:
Последняя редакция №2 от 23.02.14 | История
URL: http://kb.mista.ru/article.php?id=929

Ключевые слова: OpenOffice, поиск и замена, шаблоны поиска



&НаСервере
//Вытаскивает из Документа ОпенОфиса все выделенные (цветом фона, обводкой и пр.) куски текста в
СпискеЗначений
//Если ничего не найдено, то возвращает неопределено
//Альтернатива надоевшим конструкциям типа [ФИОРуководителя], которые нужно заменить на Василь
Василич Пупкин.
//Рекомендую в качестве шаблонов использовать конструкции типа ФИОРуководителя.Род (так, чтоб потом
можно было просклонять
Функция ПолучитьПараметрыИзШаблонаСервер()
   //Документ ОпенОфиса лежит в реквизите с типом ХранилищеЗначения.
   О=РеквизитФормыВЗначение("Объект");
   ТемпИмя=ПолучитьИмяВременногоФайла("odt");
   Макет = О.ШаблонДокумента.Получить();
   Если Макет=Неопределено тогда
       Сообщить("Нет шаблона");
       Возврат (Неопределено);
   КонецЕсли;    
   Макет.Записать(ТемпИмя);

   // Открываем OpenOffic
   ТемпИмяЮрл="file:///" + СтрЗаменить(ТемпИмя, "\", "/");
   //Создаем объекты
   Попытка
       ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
       Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
   Исключение
       Инф=ИнформацияОбОшибке();
       Возврат(неопределено) // какая-то хрень :(
   КонецПопытки;

////{=============Начало. Открываем файл odt создавая заполняя аргументы открытия через джаву
(массив с параметрами)
//    scr = Новый ComОбъект("MSScriptControl.ScriptControl");
//    scr.language = "javascript";
//    scr.eval("Args=new Array()");
//    Args = scr.eval("Args");
//    scr.AddCode("function SetItem(ind,val){Args[ind]=val}");
//    scr.AddObject("ServiceManager", ServiceManager);

//    //{Начало. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
//    //"БезИмени1, БезИмени2...)
//    scr.eval("Args[0]=ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
//    scr.eval("Args[0].Name='AsTemplate'");
//    scr.eval("Args[0].Value=true");
//    //}Конец. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
//    //"БезИмени1, БезИмени2...)
////}=============Конец. Открываем файл odt создавая параметры открытия через джаву (массив с
параметрами)


   //Более предпочтительный вариант, без использования сторонних объектов.
//=============Начало. Открываем файл odt создавая заполняя аргументы открытия через 1С (юзаем
COMSafeArray с параметрами)
   Args = Новый COMSafeArray("VT_DISPATCH", 1);
   //Начало. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
   //"БезИмени1, БезИмени2...)
   Param=ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   Param.Name = "AsTemplate";
   Param.Value = True;
   Args.SetValue(0,Param);
   //Конец. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
   //"БезИмени1, БезИмени2...)
//=============Конец. Открываем файл odt создавая заполняя аргументы открытия через 1С (юзаем
COMSafeArray с параметрами)
   
   //Все готово, открываем док
   ООДок = Desktop.LoadComponentFromURL(ТемпИмяЮрл, "_blank", 0, Args);
   
   //Создаем объект поиска
   Find = ООДок.CreateReplaceDescriptor();
   
   //Что ищем, Если нужно просто найти все с определенными атрибутами символов, то пусто
   //Если нужно найти ФИОРуководителя.Род, подчеркнутое Желтым, то ФИОРуководителя.Род
   Find.SearchString="";
   
   //САМОЕ ИНТЕРЕСНОЕ
   //Заполняем атрибуты поиска (в морде поиска это Детали/Атрибуты), по сути, это атрибуты
символов,
   //там стандартный тип  VT_VARIANT
   //Создаем массив с параметрами подходящего типа. Нам достаточно одного элемента
   Ar=Новый COMSafeArray("VT_VARIANT",1);
   //Вытаскиваем из объекта поиска (Find) тип параметров и заполняем
   Par=Find.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   Par.Name = "CharBackColor";
   Par.Value = 16777113;
   //Устанавливаем значения массива
   Ar.SetValue(0,Par);
   //Устанавливаем атрибуты поиска
   Find.SetSearchAttributes(Ar);

   //Список других параметров символов
   //CharBackColor - цвет фона. Если нет фона, то -1, для фона по умолчанию (желтый) 16777113
   //CharBackTransparent - прозрачный фон. Он Истина для обычного текста, Ложь для выделенного
цветом. Увы, по нему, почему-то поиск не пашет
   //CharShadowed - символы с тенью
   //Можно еще мигающий текст, текст с обводкой, рельефный и т.д. Остальные варианты ищем у
Эндрю Питоньяк в пдф-ке.
   //http://hghltd.yandex.net/yandbtm?
lang=ru&fmode=inject&tld=ru&text=openoffice%20CharBackTransparent&url=http%3A%2F%2Fwww.admin-
smolensk.ru%2F~websprav%2Ffreesoft%2Ffreesoft%2FOpenOffice.org%2520Macros%2520Explained.Master.pdf&n
oconv=1&l10n=ru&mime=pdf&sign=2c67b4ced57530cec3c5f989bd40557b&keyno=0
   //там поиск "CharBackTransparent" и выбираем по вкусу
   
   //Собственно сам поиск всех нужных параметров (у нас, всего подчеркнутого желтым
   Рез = ООДОк.findAll(Find);
   
   //Количество найденных -1 (чтоб не лезло в цикл, если ничего не нашли)
   ВсегоНашли=Рез.getCount()-1;
   
   //Цикл по результатам поиска (собираем в СЗ)
   СЗ=Новый СписокЗначений;
   Для Н=0 по ВсегоНашли Цикл
       СЗ.Добавить(Рез.getByIndex(Н).String);
   КонецЦикла;
   //Тут имеем СЗ в которой есть все выделенные строчки из документа. Закругляемся.
   Если СЗ.Количество()>0 тогда
       Возврат(СЗ);
   Иначе
       Возврат(Неопределено);
   КонецЕсли;    
КонецФункции

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика