Имя: Пароль:
1C
1С v8
Чтение данных из OpenOffice Calc в v8
0 Никулин Леонид
 
26.02.14
12:38
Здравствуйте!

Есть задача из файла OpenOffice Calc считать данные и записать их в таблицу значений. Нашел несколько статей с кусками кода как это делается. Но запустить все это добро не хватает ума. Мой мозг слишком слаб с COMОбъектами:(

Ниже покажу заготовку с кодом. Подправьте, пожалуйста

Спасибо!
1 Никулин Леонид
 
26.02.14
12:41
Процедура ЗагрузитьПрайс()
    ПутьКПрайсу = "D:\Задачи\0225_Чтение_автомобилей_из_файла_Excel\sample.xls";
    
    Попытка    
        ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager");    
        МетодЗагрузки = "ОО";    
    Исключение    
        Сообщить("Отсутствует приложение для загрузки файла");    
    КонецПопытки;
    
    Если МетодЗагрузки = "ОО" Тогда
        
        scr = Новый ComОбъект("MSScriptControl.ScriptControl");         
        scr.language = "javascript";        
        scr.eval("MassivParametrov = new Array()");
        MassivParametrov = scr.eval("MassivParametrov");
        scr.AddObject("OpenOffice", ServiceManager);        
        scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
        scr.eval("MassivParametrov[0].Name='Hidden'");
        scr.eval("MassivParametrov[0].Value=true");
        
        Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");        
        URL = ConvertToURL(ПутьКПрайсу);
        Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov);
        
        Doc.lockControllers();        
        Doc.addActionLock();
        
        Sheets = Doc.GetSheets();;    
        Документ = Sheets.GetByIndex(0);
        
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("Артикул");    
        ТЗ.Колонки.Добавить( "Цена");
        Дальше = 1;    
        ТекСтрокаДок = НачальнаяСтрока;     // тут ругается. Говорит, что не знает что такое НачальнаяСтрока
        Пока Дальше = 1 Цикл
            Проверка = СокрЛП(""+Документ.getCellByPosition(0, ТекСтрокаДок).getString());
            Если ПустаяСтрока(Проверка) Тогда                
                Прервать;            
            КонецЕсли;             
            Артикул = СокрЛП(""+Документ.getCellByPosition(КолонкаАртикула-1, ТекСтрокаДок).getString());    // не знает что такое КолонкаАртикула    
            Попытка                            
                Цена = Число(СокрЛП(""+Документ.getCellByPosition(КолонкаЦены-1 , ТекСтрокаДок).getString()));    // не знает что такое КолонкаЦены                            
            Исключение
                Цена = 0;
            КонецПопытки;                        
            Если (НЕ ПустаяСтрока(СокрЛП(Артикул))) и (НЕ Цена = 0) Тогда             
                НоваяСтрока = ТЗ.Добавить();
                НоваяСтрока.Артикул = Артикул;
                НоваяСтрока.Цена = Цена;
            КонецЕсли;            
            Состояние("Обрабатываем - "+ТекСтрокаДок);
            ТекСтрокаДок = ТекСтрокаДок+1;
        КонецЦикла;
        
        
        
        Если ТЗ.Количество() > 0 Тогда        
            Док = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();    
            Док.Дата = ДатаУстановкиЦен;     // не знает что такое ДатаУстановкиЦен
            ДобавитьТипЦен = Док.ТипыЦен.Добавить();            
            ДобавитьТипЦен.ТипЦен = ТипЦены;
            
            Для Каждого ТекСтрока из ТЗ Цикл
                Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ТекСтрока.Артикул);
                Если НЕ Номенклатура.Пустая() Тогда
                    НоваяСтрока = Док.Товары.Добавить();
                    НоваяСтрока.Номенклатура = Номенклатура;
                    НоваяСтрока.ТипЦен = ТипЦены;
                    НоваяСтрока.Цена = ТекСтрока.Цена;                    
                    НоваяСтрока.Валюта = Валюта;
                    НоваяСтрока.ЕдиницаИзмерения = Номенклатура.ЕдиницаХраненияОстатков;                    
                КонецЕсли;
            КонецЦикла;
            
            Если Док.Товары.Количество() > 0 Тогда            
                Док.Записать();            
            КонецЕсли;
            
            
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры
        

функция ConvertToURL(FileName)  
     ИмяФайла = СтрЗаменить(FileName," ","%20" );
     ИмяФайла = СтрЗаменить(ИмяФайла,"\","/");    
     Возврат "file:/" + "/localhost/" + ИмяФайла;
Конецфункции
2 Никулин Леонид
 
26.02.14
12:44
Буду рад чудотворным комментариям
3 Naumov
 
26.02.14
12:44
Ну присвой начальной строке номер информативной строки в твоем шаблоне эксель-файла.
Если не знаешь, то ставь 1
4 Никулин Леонид
 
26.02.14
12:48
Добавил

НачальнаяСтрока = 1;        
ТекСтрокаДок = НачальнаяСтрока;

А что придумать с колонкойЦены, КолонкойНоменклатуры? Их где брать?
5 Naumov
 
26.02.14
12:49
(4) Посмотри в шаблоне их номера и поставь
6 Никулин Леонид
 
26.02.14
12:52
В моем xls есть колонки "A" "B" "C". Как это правильно нужно написать в коде?
7 Naumov
 
26.02.14
12:52
А, В,С это 1,2,3.
8 Никулин Леонид
 
26.02.14
12:53
ок. спс сейчас попробую...
9 Никулин Леонид
 
26.02.14
13:01
А самый нижний кусок мне вообще не нужен. Там документ создается. Я его убрал. вот что получилось:
10 Никулин Леонид
 
26.02.14
13:01
Процедура ЗагрузитьПрайс()
    ПутьКПрайсу = "D:\Задачи\0225_Чтение_автомобилей_из_файла_Excel\sample.xls";
    
    Попытка    
        ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager");    
        МетодЗагрузки = "ОО";    
    Исключение    
        Сообщить("Отсутствует приложение для загрузки файла");    
    КонецПопытки;
    
    Если МетодЗагрузки = "ОО" Тогда
        
        scr = Новый ComОбъект("MSScriptControl.ScriptControl");         
        scr.language = "javascript";        
        scr.eval("MassivParametrov = new Array()");
        MassivParametrov = scr.eval("MassivParametrov");
        scr.AddObject("OpenOffice", ServiceManager);        
        scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
        scr.eval("MassivParametrov[0].Name='Hidden'");
        scr.eval("MassivParametrov[0].Value=true");
        
        Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");        
        URL = ConvertToURL(ПутьКПрайсу);
        Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov);    // вот тут спотыкается. Говорит, что нет такого метода
        
        Doc.lockControllers();        
        Doc.addActionLock();
        
        Sheets = Doc.GetSheets();;    
        Документ = Sheets.GetByIndex(0);
        
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("Артикул");    
        ТЗ.Колонки.Добавить( "Цена");
        Дальше = 1;    
        НачальнаяСтрока = 1;        
        ТекСтрокаДок = НачальнаяСтрока;     // тут ругается. Говорит, что не знает что такое НачальнаяСтрока
        Пока Дальше = 1 Цикл
            Проверка = СокрЛП(""+Документ.getCellByPosition(0, ТекСтрокаДок).getString());
            Если ПустаяСтрока(Проверка) Тогда                
                Прервать;            
            КонецЕсли;             
            //Артикул = СокрЛП(""+Документ.getCellByPosition(КолонкаАртикула-1, ТекСтрокаДок).getString());    // не знает что такое КолонкаАртикула    
            Артикул = СокрЛП(""+Документ.getCellByPosition(1-1, ТекСтрокаДок).getString());    // не знает что такое КолонкаАртикула    
            Попытка                            
                //Цена = Число(СокрЛП(""+Документ.getCellByPosition(КолонкаЦены-1 , ТекСтрокаДок).getString()));    // не знает что такое КолонкаЦены                            
                  Цена = Число(СокрЛП(""+Документ.getCellByPosition(2-1 , ТекСтрокаДок).getString()));    // не знает что такое КолонкаЦены                            
            Исключение
                Цена = 0;
            КонецПопытки;                        
            Если (НЕ ПустаяСтрока(СокрЛП(Артикул))) и (НЕ Цена = 0) Тогда             
                НоваяСтрока = ТЗ.Добавить();
                НоваяСтрока.Артикул = Артикул;
                НоваяСтрока.Цена = Цена;
            КонецЕсли;            
            Состояние("Обрабатываем - "+ТекСтрокаДок);
            ТекСтрокаДок = ТекСтрокаДок+1;
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры
      
  

функция ConvertToURL(FileName)    
     ИмяФайла = СтрЗаменить(FileName," ","%20" );    
     ИмяФайла = СтрЗаменить(ИмяФайла,"\","/");    
    Возврат "file:/" + "/localhost/" + ИмяФайла;
Конецфункции
11 Naumov
 
26.02.14
13:03
и?
12 Никулин Леонид
 
26.02.14
13:07
блин. синтаксических ошибок нет, но при исполнении спотыкается на строчке

Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov);  

переделал на

Doc = Desktop.LoadComponentFromURL(ПутьКПрайсу, "_blank", 0, MassivParametrov);

не помогло:(
13 Никулин Леонид
 
26.02.14
13:08
Подскажите, а могу ли в синтакс помощнике почитать о методах ком объектов?
14 Naumov
 
26.02.14
13:08
с самим методом чтения через ОО ничего не могу сказать, таким макаром не делал никогда.
в давние времена компонента была какая-то. ее использовал.
15 Никулин Леонид
 
26.02.14
17:43
Гуру скорее всего скажут что это г*вн*код, но тем не менее вот что получилось и работает. Может кому пригодится

Попытка    
        ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager");    
        МетодЗагрузки = "ОО";    
    Исключение    
        Сообщить("Отсутствует приложение для загрузки файла");    
    КонецПопытки;
    
    Если МетодЗагрузки = "ОО" Тогда        
        scr = Новый ComОбъект("MSScriptControl.ScriptControl");         
        scr.language = "javascript";        
        scr.eval("MassivParametrov = new Array()");
        MassivParametrov = scr.eval("MassivParametrov");
        scr.AddObject("OpenOffice", ServiceManager);        
        scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
        scr.eval("MassivParametrov[0].Name='Hidden'");
        scr.eval("MassivParametrov[0].Value=true");
        
        Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");        
        Doc = Desktop.LoadComponentFromURL("file:///"+ИмяФайла, "_blank", 0, MassivParametrov);    
        
        Doc.lockControllers();        
        //Doc.addActionLock();   блокировка документа калк
        
        Sheets = Doc.GetSheets();;    
        Документ = Sheets.GetByIndex(0);
        
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("ГосНомер");
        
        ЕстьДанные = Истина;    
        НачальнаяСтрока = 1;        
        ТекСтрокаДок = НачальнаяСтрока;     
        
        Пока ЕстьДанные Цикл
            ГосНомер = СокрЛП(""+Документ.getCellByPosition(1-1, ТекСтрокаДок).getString());
            Если (НЕ ПустаяСтрока(СокрЛП(ГосНомер))) Тогда             
                НоваяСтрока = ТЗ.Добавить();
                НоваяСтрока.ГосНомер = ГосНомер;             
                ТекСтрокаДок = ТекСтрокаДок + 1;    
            Иначе
                ЕстьДанные = Ложь;        
            КонецЕсли;            
        КонецЦикла;        
    КонецЕсли;
16 z80a
 
26.02.14
17:55
(0)

// Подключаемся к OO
    Попытка
        ServiceManager  = Новый COMОбъект("com.sun.star.ServiceManager");
        Desktop         = ServiceManager.createInstance("com.sun.star.frame.Desktop");
    Исключение
        ОбщегоНазначения.СообщитьОбОшибке("Ошибка при подключении к LibreOffice!"); Возврат Ложь;
    КонецПопытки;
    
    // Создаем массив для передачи параметров
    Параметры = Новый COMSafeArray("VT_DISPATCH", 1);
    
    // Если надо скроем
    Если Скрыть Тогда
        Параметры.SetValue(0, СвойствоЗначение(ServiceManager, "Hidden", Истина));
    КонецЕсли;
    
    КаталогОтчета = СтрЗаменить(ПутьКФайлу, "\", "/");
    
    // Загрузка документа
    Документ = Desktop.LoadComponentFromURL("file://localhost/" + КаталогОтчета, "_blank", 0, Параметры);