Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

31 Июль 2021, 17:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Ошибка при работе с OpenOffice Calc  (Прочитано 7712 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ryan
Участник
**
Offline Offline

Пол: Мужской
Расположение: Краснодар
Сообщений: 16


« Стартовое сообщение: 8 Октябрь 2011, 13:50 »

при запуске кода возникает ошибка:
"Ошибка при вызове метода контекста (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
Участник
**
Offline Offline

Пол: Мужской
Расположение: Краснодар
Сообщений: 16


« Ответ #1: 9 Октябрь 2011, 16:53 »

ошибка исправлена, тема закрыта
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
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #2: 9 Октябрь 2011, 19:40 »

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

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

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

[вложение удалено Администратором]
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!