Имя: Пароль:
1C
 
Выгрузка данных в Оpen Office
0 ikustow
 
06.09.17
23:22
Приветствую, подскажите, пишу выгрузку в OpenCalc и столкнулся с тем, что значение которое я задаю не записывается в ячейку, хотя код выполняется без ошибок. Может кто знает какую особенность? до этого писал выгрузку для Excel подобных проблем не было. Код привожу ниже. Спасибо!

&НаСервере
Функция ПрочитатьНаСервере(ПутьКФайлу,текЛист)
    
    
       Попытка
                ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
       Исключение
                //Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice\LibreOffice не установлена на данном компьютере!");
       Возврат Неопределено;
       КонецПопытки;
       Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
       Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
       Свойства.Name = "AsTemplate";
       Свойства.Value = Истина;
       Args = Новый COMSafeArray("VT_VARIANT", 2);
       Args.SetValue(0, Свойства);
       Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
       Свойства1.Name = "Hidden";
       Свойства1.Value = Истина;
       Args.SetValue(1,Свойства1);
       Document = Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ(ПутьКФайлу), "_blank", 0, Args);
       Sheets = Document.getSheets();
       Sheet = Sheets.getByIndex(текЛист);
      
       begCol = 0;
       begRow = 0;
       endCol = Sheet.Data.GetLength(6) - 1;
       endRow = Sheet.Data.GetLength() - 1;
       нКол = 0;
      
       Значение = "Значение";
       Sheet.getCellByPosition(2,2).SetString(Значение);


    
       Document.close(true);
       Desktop.terminate();
КонецФункции
1 Мэс33
 
06.09.17
23:25
А сохранять документ не нужно? (опыта с OO нет).
2 Мэс33
 
06.09.17
23:25
Или close(true) - это и есть сохранение?
3 ikustow
 
06.09.17
23:27
(1) Пробовал  перед Document.close(true); писать Document.Save(); дает ошибку. сейчас ищу материалы по работе с ОО, но в примерах, что нахожу везде Document.close(true) думаю это и есть сохранение
4 Мэс33
 
06.09.17
23:30
5 Мэс33
 
06.09.17
23:30
Document.store() - похоже это нужно
6 ikustow
 
06.09.17
23:38
(5) выдает ошибку : Ошибка при вызове метода контекста (Store)
         Document.Store();
по причине:
Произошла исключительная ситуация ([automation bridge] ): com.sun.star.task.ErrorCodeIOException:

причем на одном форуме нашел пост с такой же ошибкой и там ему помог такой код

Document.Store();
Document.Close(1);

он тоже в итоге с ошибкой) ну в принципе проблема ясна, он просто не сохраняет, осталось теперь победить это)
7 h-sp
 
06.09.17
23:50
(6) а если так  

ТабДок.Записать("тратата.ods");

??
8 ikustow
 
07.09.17
00:43
(5) (7)  В общем вот рабочий вариант(может кому пригодится). В пути латинские буквы

scr = новый COMОбъект("MSScriptControl.ScriptControl");
    scr.language = "javascript";
    scr.eval("Massiv=new Array()");
    Массив = scr.eval("Massiv");
    
    ServiceManager = новый COMОбъект("com.sun.star.ServiceManager");
    
    scr.AddObject("ServiceManager",ServiceManager);
    scr.eval("Massiv[0]=ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
    scr.eval("Massiv[0].Name='Hidden'");
    scr.eval("Massiv[0].Value=true");
    
    Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
    //ИмяФайла = "file://"+СтрЗаменить(ПутьКФайлу, "/", "\");
    
    Document = Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ(ПутьКФайлу), "_blank", 0, Массив);    
    Листы = Document.getSheets();
    Лист = Листы.getByIndex(0);    
    //Реквизиты        
    Лист.getCellByPosition(4,1).setString("Vendor:");
    Лист.getCellByPosition(5,1).setString("Date of order:");
    Лист.getCellByPosition(6,1).setString("Order No:");
    Лист.getCellByPosition(7,1).setString("Reference No:");
    Лист.getCellByPosition(8,1).setString("Currency:");
    Лист.getCellByPosition(9,1).setString("Factory ship date:");
    Document.store();
    Document.close(true);