Имя: Пароль:
1C
1С v8
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) оно параграфы как-то по-своему понимает, а нумерованные списки - тем более