Ошибка при работе с OpenOffice Calc

Автор Ryan, 8 октября 2011, 14:50

0 Пользователи и 1 гость просматривают эту тему.

Ryan

при запуске кода возникает ошибка:
"Ошибка при вызове метода контекста (ParseStrict): Произошла исключительная ситуация ([automation bridge] ): [automation bridge] unexpected exception in UnoConversionUtilities<T>::variantToAny !
   transf.ParseStrict(URL);"
кто сталкивался с такой проблемой, напишите в чем причина плиз

// ---------------------------------------------------------
Procedure dispatchURL(Docum, aUrl, scr)                                     
scr.eval("URL=new Array()");
scr.eval("URL[0]=OpenOffice.Bridge_GetStruct('com.sun.star.util.URL')");
scr.eval("URL[0].Complete='" + aURL + "'");
scr.eval("noProps=new Array()");
scr.eval("noProps[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
noProps=scr.eval("noProps");

URL = scr.eval("URL");
transf = OpenOffice.CreateInstance("com.sun.star.util.URLTransformer");
transf.ParseStrict(URL);
URL1 = scr.eval("URL[0]");
frame = Docum.getCurrentController().getFrame();
disp =    Frame.queryDispatch(URL1,"",0); 
disp.dispatch(URL1,noProps);
EndProcedure

// ---------------------------------------------------------
Процедура перебросить()   
ВременныйПуть = "D:\";

Попытка
OpenOffice = Новый ComObject("com.sun.star.ServiceManager");
Исключение
Сообщить(ОписаниеОшибки() + "; OpenOffice не установлен на данном компьютере!");
Возврат;
КонецПопытки;

scr= Новый ComObject("MSScriptControl.ScriptControl");

scr.language="javascript";
scr.eval("Массив=new Array()");
Массив=scr.eval("Массив");
scr.AddObject("OpenOffice",OpenOffice);
scr.eval("Массив[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
scr.eval("Массив[0].Name='Hidden'");
scr.eval("Массив[0].Value=true");

DeskTop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop"); 


Excel1 = DeskTop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив);

Excel1.lockControllers();
Excel1.addActionLock();

БазКнига = Excel1.getSheets();

Временныйпуть1 = СтрЗаменить(ВременныйПуть, "\", "/");
Временныйпуть1 = СтрЗаменить(ВременныйПуть1, " ", "%20");

Для Сч = 2 по 5 Цикл                                                   
Попытка   
Excel2= DeskTop.LoadComponentFromURL("file:///" + ВременныйПуть1 + Строка(Сч) + ".xls", "_blank", 0, Массив);
Книга = Excel2.getSheets();
Исключение
Продолжить;
КонецПопытки;

Лист = Книга.getByIndex(0);//getByName("Sheet1");
БазКнига.InsertNewByName(Строка(Сч), 0); 
БазЛист = БазКнига.getByName(Строка(Сч));
Excel2.getCurrentController().Select(Лист); 
dispatchURL(Excel2, ".uno:SelectAll", scr);
dispatchURL(Excel2, ".uno:Copy", scr);
Excel1.getCurrentController().Select(БазЛист);
dispatchURL(Excel1, ".uno:Paste", scr);

Excel2.Close(-1);
КонецЦикла;

SaveParam=Excel1.setPropertyValue("FilterName","MS Excel 97");
scr.eval("Массив[0].Name='FilterName'");
scr.eval("Массив[0].Value='MS Excel 97'");
Excel1.storeToURL("file:///" + ВременныйПуть1+"Отчет.xls",Массив);   
Excel1.unLockControllers();
Excel1.removeActionLock();

Excel1.close(-1);


Вложения = ВременныйПуть+"Отчет.xls";
Сообщить("Отчет сохранен - " + Вложения);   
Excel1 = "";
Excel2 = "";
КонецПроцедуры

Ryan

ошибка исправлена, тема закрыта
P.S. судя по всему ошибка возникала, потому что в процедуре
dispatchURL использовались устаревшие методы,
работающий код:

// ---------------------------------------------------------
Procedure dispatchURL(Docum, aUrl, scr)                                     
scr.eval("noProps=new Array()");
noProps=scr.eval("noProps");
frame = Docum.getCurrentController().getFrame();
oDisp = OpenOffice.CreateInstance("com.sun.star.frame.DispatchHelper");
oDisp.executeDispatch(frame,aUrl, "", 0, noProps);
EndProcedure

// ---------------------------------------------------------
Процедура перебросить()   
ВременныйПуть = "D:\";

Попытка
OpenOffice = Новый ComObject("com.sun.star.ServiceManager");
Исключение
Сообщить(ОписаниеОшибки() + "; OpenOffice не установлен на данном компьютере!");
Возврат;
КонецПопытки;

scr= Новый ComObject("MSScriptControl.ScriptControl");

scr.language="javascript";
scr.eval("Массив=new Array()");
Массив=scr.eval("Массив");
scr.AddObject("OpenOffice",OpenOffice);
scr.eval("Массив[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
scr.eval("Массив[0].Name='Hidden'");
scr.eval("Массив[0].Value=true");

DeskTop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop"); 


Excel1 = DeskTop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив);

Excel1.lockControllers();
Excel1.addActionLock();

БазКнига = Excel1.getSheets();

Временныйпуть1 = СтрЗаменить(ВременныйПуть, "\", "/");
Временныйпуть1 = СтрЗаменить(ВременныйПуть1, " ", "%20");

Для Сч = 2 по 5 Цикл                                                   
Попытка   
Excel2= DeskTop.LoadComponentFromURL("file:///" + ВременныйПуть1 + Строка(Сч) + ".xls", "_blank", 0, Массив);
Книга = Excel2.getSheets();
Исключение
Продолжить;
КонецПопытки;

Лист = Книга.getByIndex(0);//getByName("Sheet1");
БазКнига.InsertNewByName(Строка(Сч), 0); 
БазЛист = БазКнига.getByName(Строка(Сч));
Excel2.getCurrentController().Select(Лист); 
dispatchURL(Excel2, ".uno:SelectAll", scr);
dispatchURL(Excel2, ".uno:Copy", scr);
Excel1.getCurrentController().Select(БазЛист);
dispatchURL(Excel1, ".uno:Paste", scr);

Excel2.Close(-1);
КонецЦикла;

SaveParam=Excel1.setPropertyValue("FilterName","MS Excel 97");
scr.eval("Массив[0].Name='FilterName'");
scr.eval("Массив[0].Value='MS Excel 97'");
Excel1.storeToURL("file:///" + ВременныйПуть1+"Отчет.xls",Массив);   
Excel1.unLockControllers();
Excel1.removeActionLock();

Excel1.close(-1);


Вложения = ВременныйПуть+"Отчет.xls";
Сообщить("Отчет сохранен - " + Вложения);   
Excel1 = "";
Excel2 = "";
КонецПроцедуры

JohnSUN

Красиво получилось!

Слушай, я тут подумал... Управление офисом из 1С штука хорошая, но вот именно в этой задаче... как-то шибко навороченно получается.
А может всё-таки развалить процессы? В смысле, пусть 1С работает над отчетом и нарезает его на отдельные файлы, а вот собирание этих "маленьких" листов в одну книгу переложить на офис? И пусть работают параллельно...

В приложении примерчик отчета и макроса для собирательства.

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне