|   |   | 
| 
 | 1С и OpenOffice Writer получить текст | ☑ | ||
|---|---|---|---|---|
| 0
    
        Zhuri 26.02.14✎ 05:51 | 
        Как получить текст документа OpenOffice?
 поиском изыскался уже, есть примеры по работе с Calc а мне нужен Writer. Сам документ открываю ... Document = Desktop.loadComponentFromURL(ПреобразоватьВURL(ИмяФайлаШаблона), "_blank", 0, Massiv); а дельше? | |||
| 1
    
        mikeA 26.02.14✎ 06:00 | 
        &НаКлиенте
 Перем xOffice, xDesktop, xWriterComponent; &НаКлиенте Функция ПолучитьСоединение() // Получаем основной объект Open Office xOffice = Новый COMObject("com.sun.star.ServiceManager"); Сообщить("Соединение с xOffice установлено"); Возврат xOffice; КонецФункции &НаКлиенте // Возвращает строки файла в массиве Функция ПолучитьТекстФайла(xOffice) // Устанавливаем соединение если оно ещё не установлено. Если xOffice = Неопределено Тогда xOffice= ПолучитьСоединение(); КонецЕсли; // Получаем рабочий стол Если xDesktop = Неопределено Тогда xDesktop= xOffice.createInstance("com.sun.star.frame.Desktop"); КонецЕсли; // Будем открывать файлы без открытия окна приложения // Получаем структуру OpenOffice для передачи параметров propHidden= xOffice.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); // Устанавливаем параметр скрытый режим propHidden.Name="Hidden"; propHidden.Value=True; // Добавляем эту структуру в массив Массив= Новый Массив; Массив.Добавить(propHidden); // Инициализируем этим массивом безопасный массив для COM Attributes= Новый COMSafeArray(Массив, "VT_VARIANT", 1); // Открываем файл не открывая окна приложения xWriterComponent= xDesktop.loadComponentFromURL("file:///" + ИмяФайла, "_blank", 0, Attributes); // Получаем объект текст этого файла xText= xWriterComponent.getText(); // Получаем текст файла в виде массива строк ТекстФайла= Новый Массив; // Перебираем параграфы, непустые строки записываем в массив // потому что getText для всего файла разбивает на строки // по концу параграфа и ПЕРЕНОСУ СТРОКИ, параграфы типа // Текст // - уровень 1 // - уровень 2 // будут разбиты при получении всего текста на НЕСКОЛЬКО строк, // Получаем итератор по параграфам текста документа xTextEnumeration= xText.createEnumeration(); // порядковый номер параграфа в списке НомерПараграфа= 1; // то что будем писать перед началом параграфа // для параграфов вне списка это пустая строка // для списка формируется из порядкового номера параграфа ПрефиксПараграфа= ""; // Перебираем коллекцию параграфов текста с помощью итератора Пока xTextEnumeration.hasMoreElements() Цикл // Получаем следующий параграф xParagraph= xTextEnumeration.nextElement(); // Получаем номер из нумерованного списка и записываем его в начало строки Если ПустаяСтрока(xParagraph.NumberingStyleName) Тогда ПрефиксПараграфа= ""; Иначе Если xParagraph.ParaIsNumberingRestart Тогда Если xParagraph.NumberingStartValue > 0 Тогда НомерПараграфа= НомерПараграфа + xParagraph.NumberingStartValue; Иначе НомерПараграфа= 1; КонецЕсли; КонецЕсли; ПрефиксПараграфа= Строка(НомерПараграфа) + ". "; НомерПараграфа= НомерПараграфа + 1; КонецЕсли; // Получаем итератор по элементам параграфа // В простейшем случае там будет одна часть текста xParagraphEnumeration= xParagraph.createEnumeration(); ТекстПараграфа= ""; Пока xParagraphEnumeration.hasMoreElements() Цикл // Получаем очередной элемент параграфа xTextPortion= xParagraphEnumeration.nextElement(); ТекстПараграфа= ТекстПараграфа + xTextPortion.getString(); КонецЦикла; Если НЕ ПустаяСтрока(ТекстПараграфа) Тогда ТекстФайла.Добавить(ПрефиксПараграфа + ТекстПараграфа); КонецЕсли; КонецЦикла; // Закрываем файл xWriterComponent.close(False); Возврат ТекстФайла; КонецФункции | |||
| 2
    
        Zhuri 26.02.14✎ 06:13 | 
        (1) Спасибо! Пробую.     | |||
| 3
    
        Zhuri 26.02.14✎ 06:57 | 
        Спотыкается на xParagraph.createEnumeration();
 из таблицы. | |||
| 4
    
        mikeA 26.02.14✎ 07:32 | 
        (3) у меня просто текст был и нумерованные списки. таблицы в тексте может по-другому надо обрабатывать     | |||
| 5
    
        mikeA 26.02.14✎ 07:41 | 
        (4)+
 вот здесь посмотри http://giampow.blogspot.ru/2009/11/openoffice-api-generic-document.html private void enumerateTables | |||
| 6
    
        Zhuri 26.02.14✎ 08:05 | 
        (5) Ваще спасибо. Буду ковырятся     | |||
| 7
    
        Zhuri 27.02.14✎ 02:57 | 
        Сделал так:
 Попытка xOffice = Новый COMObject("com.sun.star.ServiceManager"); Исключение Сообщить("Ошибка создания объекта com.sun.star.ServiceManager"); Сообщить(ОписаниеОшибки()); Возврат ""; КонецПопытки; xDesktop= xOffice.createInstance("com.sun.star.frame.Desktop"); // Получаем структуру OpenOffice для передачи параметров propHidden= xOffice.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); // Устанавливаем параметр скрытый режим propHidden.Name="Hidden"; propHidden.Value=True; // Добавляем эту структуру в массив Массив= Новый Массив; Массив.Добавить(propHidden); // Инициализируем этим массивом безопасный массив для COM Attributes= Новый COMSafeArray(Массив, "VT_VARIANT", 1); // Открываем файл не открывая окна приложения xWriterComponent= xDesktop.loadComponentFromURL(ПреобразоватьВURL(ИмяФайлаШаблона), "_blank", 0, Attributes); //прочитаем все таблицы xNamedTables= xWriterComponent.getTextTables(); Для Сч=0 По xNamedTables.getCount()-1 Цикл table = xNamedTables.getByIndex(Сч); rows = table.getRows(); columns = table.getColumns(); Для Стр=0 По rows.getCount()-1 Цикл Для Кол=0 По columns.getCount()-1 Цикл Cell = table.getCellByPosition(Кол, Стр); ТекстЯчейки = Cell.getText().getString(); НайтиШаблоны(ТекстЯчейки); //Сообщить(ТекстЯчейки); КонецЦикла; КонецЦикла; КонецЦикла; // Получаем объект текст этого файла xText = xWriterComponent.getText(); xTextEnumeration= xText.createEnumeration(); Пока xTextEnumeration.hasMoreElements() Цикл // Получаем следующий параграф xParagraph= xTextEnumeration.nextElement(); //проверим текстовый ли это параграф Если xParagraph.supportsService("com.sun.star.text.Paragraph") Тогда //наш Иначе Продолжить; КонецЕсли; Anchor = xParagraph.getAnchor(); // Получаем номер из нумерованного списка и записываем его в начало строки AnchorEnumeration = Anchor.createEnumeration(); Пока AnchorEnumeration.hasMoreElements() Цикл xTextPortion = AnchorEnumeration.nextElement(); ТекстСтр = xTextPortion.getString(); НайтиШаблоны(ТекстСтр); КонецЦикла; КонецЦикла; // Закрываем файл xWriterComponent.close(False); | |||
| 8
    
        mikeA 27.02.14✎ 06:53 | 
        (7) спасибо, добавлю себе на всякий случай     | |||
| 9
    
        Zhuri 27.02.14✎ 07:55 | 
        (8) это тебе спасибо     | |||
| 10
    
        Зойч 18.03.14✎ 22:26 | 
        может лучше извлечениетекста использовать?     | |||
| 11
    
        mikeA 19.03.14✎ 06:05 | 
        (10) оно параграфы как-то по-своему понимает, а нумерованные списки - тем более     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |