|
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) оно параграфы как-то по-своему понимает, а нумерованные списки - тем более
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |