Имя: Пароль:
1C
 
Выгрузка в OpenOffice
0 ЯЧайник
 
17.07.18
11:55
Добрый день! платформа 8.3.10.2772 толстый клиент. Пробую писать выгрузку в openOffice так как Excel не установлен. Взяла из интернета примерный алгоритм. Выдает следующую ошибку:
Ошибка при вызове метода контекста (LoadComponentFromURL)
Doc=Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ("D:\Антонина\ВыгрузкиМатериалы\123.ods"), "_blank", 0, Args);
по причине:
Произошла исключительная ситуация ([automation bridge] ): com.sun.star.lang.IllegalArgumentException: Unsupported URL <file://localhost/D:/Антонина/ВыгрузкиМатериалы/123.ods>: "type detection failed"
1 ЯЧайник
 
17.07.18
11:59
мой код
Попытка
        OpenOffice = Новый ComОбъект("com.sun.star.ServiceManager"); // Создаем СОМ-объект
    Исключение
        Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!");
        Возврат;
    КонецПопытки;
    Desktop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop"); // Создаем Desktop
Args = Новый COMSafeArray("VT_VARIANT", 3);
    Свойства = OpenOffice.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства.Name = "AsTemplate";
    Свойства.Value = Истина;
    Args.SetValue(0, Свойства);
    
    Свойства1 = OpenOffice.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства1.Name = "Hidden";
    Свойства1.Value = Истина;
    Args.SetValue(1, Свойства1);
Doc = Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ("D:\Антонина\ВыгрузкиМатериалы\123.ods"), "_blank", 0, Args);
    Sheets = Doc.getSheets();
    Sheet = Sheets.getByIndex(0); // Открываем первый лист по индексу

    мИтКол = 0;
Для каждого кол из ТЗ.Колонки Цикл
        Sheet.getCellByPosition(мИтКол,0).setString(кол.Имя);
        
        мИтКол = мИтКол + 1;
    КонецЦикла;
ВсегоСтрок = ТЗ.Количество();
    ВсегоКолонок = ТЗ.Колонки.Количество();
    МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоСтрок,ВсегоКолонок);
    
    иткол = 0;
    итстр = 0;
Для каждого стр из ТЗ Цикл
        Для каждого кол из ТЗ.Колонки Цикл
            стрРез = СокрЛП(стр[кол.Имя]);
            МассивКОМ.SetValue(итстр,иткол,стрРез);
            
            иткол = иткол+1;
         КонецЦикла;
        
        иткол = 0;
        итстр = ?(итстр=ВсегоСтрок,0,итстр+1);
    КонецЦикла;
begCol = 0;
    begRow = 1;
    endCol = ВсегоКолонок-1;
    endRow = ВсегоСтрок;
    Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
    Range.setDataArray(МассивКОМ);
    
    Doc.storeToURL(ПривестиФайлКУРЛ("D:\Антонина\ВыгрузкиМатериалы\123.odt"),Args);
Свойства2 = OpenOffice.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства2.Name = "FilterName";
    Свойства2.Value = "MS Excel 97";
    Args.SetValue(2,Свойства2);
Doc.storeToURL(ПривестиФайлКУРЛ("D:\Антонина\ВыгрузкиМатериалы\123.odt"),Args);
Doc.close(true);
    Desktop.terminate();
2 ЯЧайник
 
17.07.18
12:00
Функция ПривестиФайлКУРЛ(ПутьКФайлу)

    ПутьКФайлу = СтрЗаменить(ПутьКФайлу," ","%20");
    ПутьКФайлу = СтрЗаменить(ПутьКФайлу,"\","/");
    Возврат "file:/" + "/localhost/" + ПутьКФайлу;

Конецфункции
3 ЯЧайник
 
17.07.18
12:01
Подскажите,пожалуйста,умные люди, в чём может быть причина данной ошибки?
4 ЯЧайник
 
17.07.18
12:03
Данный код пишу в обычных формах (УПП), в модуле объекта (Обработки)
5 don_Rumata
 
17.07.18
12:03
У меня функция преобразования выглядит так:

// Функция преобразует Windows имя файла в URL OpenOffice                      
Функция ПреобразоватьВURL(ИмяФайла)  
    
    Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
    
КонецФункции
6 spectre1978
 
17.07.18
12:04
ну вроде почти по-русски же пишет что урл кривой. Попробуйте написать путь к файлу как-то по-другому.
7 ЯЧайник
 
17.07.18
12:06
Попробую еще раз другие варианты формата УРЛ,но,мне кажется,что я уже как только не пробовала его писать...
8 spectre1978
 
17.07.18
12:09
может не дружить с кириллицей, например
9 spectre1978
 
17.07.18
12:09
попробуйте использовать в пути и имени файла только латинские буквы
10 ЯЧайник
 
17.07.18
12:20
(5) не меняет ситуацию
11 ЯЧайник
 
17.07.18
12:20
(9) да,тоже думала, а потом забыла попробовать. сейчас попробую
12 spectre1978
 
17.07.18
12:23
что-то отличное от латиницы в URLах - это вообще очень специфическая и непростая тема. Непонятно как ее опенофис разруливает и разруливает ли вообще.
13 ЯЧайник
 
17.07.18
12:28
com.sun.star.lang.IllegalArgumentException: Unsupported URL <file://localhost/D:/123.ods>: "type detection failed"
14 Черный маклер
 
17.07.18
12:32
(0) простых путей как сохранить ТабличныйДокумент в ods совсем не признаешь ?
15 ПегийЛунь
 
17.07.18
12:32
16 ЯЧайник
 
17.07.18
12:32
com.sun.star.lang.IllegalArgumentException: Unsupported URL <file://localhost/D:/upps.xls>: "type detection failed"
17 ЯЧайник
 
17.07.18
12:41
(15) у меня в (2) такая же функция точь в точь, как в решении проблемы по ссылке из (15)
18 spectre1978
 
17.07.18
13:06
(16) попробуйте localhost/ убрать из латинского пути
19 ЯЧайник
 
17.07.18
13:17
пробовала как в (5), не получается
20 spectre1978
 
17.07.18
13:33
(19) а с правами проблем не может быть? В (15) очень похожая проблема описана, используют временный файл, потом переносят
21 ЯЧайник
 
17.07.18
13:34
возможно. сейчас рассматриваю запись во временный файл
22 ЯЧайник
 
17.07.18
14:42
ТабДокумент = Новый ТабличныйДокумент;
    
    Макет = ЭтотОбъект.ПолучитьМакет("Материалы");
    Заголовок = Макет.ПолучитьОбласть("Заголовок");
    ТабДокумент.Вывести(Заголовок);
    
    Для каждого стр из ТЗ Цикл
        СтрокаМатериал = Макет.ПолучитьОбласть("Строка");
        ЗаполнитьЗначенияСвойств(СтрокаМатериал.Параметры,Стр);
        ТабДокумент.Вывести(СтрокаМатериал);
        
    КонецЦикла;

    // Открыть OpenOffice
    Попытка
        ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
    Исключение
        Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!");
        Возврат;    
    КонецПопытки;
    
    ВременныйФайл =ПолучитьИмяВременногоФайла();
    ВременныйФайлXLS = ПолучитьИмяВременногоФайла("xls");
    ВременныйФайлXLS1 = СтрЗаменить(ВременныйФайлXLS,".xls","")+"1.xls";
    
    ТабДокумент.Записать(ВременныйФайлXLS,ТипФайлаТабличногоДокумента.XLS97);
      
    Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");    

    НастройкиОткрытия = Новый COMSafeArray("VT_VARIANT", 1);
    PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");  
    PropertyValue.Name = "Hidden";
    PropertyValue.Value = Истина;
    НастройкиОткрытия.SetValue(0, PropertyValue);
  
    ВременныйФайлXLS_какУРЛ = ПривестиФайлКУРЛ(ВременныйФайлXLS);
    //"file:///" + СтрЗаменить(ВременныйФайлXLS, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный
    ВременныйФайлXLS1_какУРЛ = ПривестиФайлКУРЛ(ВременныйФайлXLS1);
    //"file:///" + СтрЗаменить(ВременныйФайлXLS1, "\", "/");  
    // Откроем файл в опене офисе
    ОпенОфис = Desktop.LoadComponentFromURL(ВременныйФайлXLS_какУРЛ, "_blank", 0, НастройкиОткрытия);
    
    НастройкиСохранения = Новый COMSafeArray("VT_VARIANT", 1);
    Свойства2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства2.Name = "FilterName";
    Свойства2.Value = "MS Excel 97";
    НастройкиСохранения.SetValue(0,Свойства2);
      
    //ВременныйФайлPDF_какУРЛ = "file:///" + СтрЗаменить(ВременныйФайлPDF, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный
    ОпенОфис.storeToURL(ВременныйФайлXLS1_какУРЛ, НастройкиСохранения); // сохранили PDF файл
    ОпенОфис.close(-1);
    ОпенОфис = Неопределено;
23 ЯЧайник
 
17.07.18
14:43
ну,вроде, как-то так
24 ЯЧайник
 
17.07.18
14:51
спасибо за подсказки
25 ЯЧайник
 
17.07.18
15:03
хотя,наверное,можно было ограничиться
ТабДокумент = Новый ТабличныйДокумент;
    
    Макет = ЭтотОбъект.ПолучитьМакет("Материалы");
    Заголовок = Макет.ПолучитьОбласть("Заголовок");
    ТабДокумент.Вывести(Заголовок);
    
    Для каждого стр из ТЗ Цикл
        СтрокаМатериал = Макет.ПолучитьОбласть("Строка");
        ЗаполнитьЗначенияСвойств(СтрокаМатериал.Параметры,Стр);
        ТабДокумент.Вывести(СтрокаМатериал);
        
    КонецЦикла;

    ТабДокумент.Записать("D:\Антонина\ВыгрузкиМатериалы\123.xls",ТипФайлаТабличногоДокумента.XLS97);

и не парить себе мозг...
26 spectre1978
 
17.07.18
15:12
(25) вам решать. Мы же не знаем, зачем вам именно OOo. Возможно, у вас что-то не сохраняется средствами 1С, она не все и не всегда корректно может сохранить в XLS.
27 ЯЧайник
 
17.07.18
15:34
(26) согласна