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