Ошибка при вызове метода контекста loadcomponentfromurl

Ошибка при обнаружении метода

Я
   Карась

25.07.12 — 11:37

Добрый день! Заранее прошу прощения за возможно детские вопросы.

У меня стоит задача заполнения документа в open office из формы документа 1с. Я создала кнопку «Печать», после чего начала описывать процедуру.

ServiceManager = Новый COMОбъект(«com.sun.star.ServiceManager»);

   
Desktop = ServiceManager.OleFunction(«createInstance», «com.sun.star.frame.Desktop»);

   
Док = Desktop.OleFunction(«LoadComponentFromURL», «C:\…», 0 );

На этом участке кода у меня система выдает ошибку:

«Desktop = ServiceManager.OleFunction(«createInstance», «com.sun.star.frame.Desktop»);»

В режиме отладки проверяла ServiceManager заполняется, а вот Desktop остается неопределенным. Пыталась исправить ошибку, но безуспешно. Надеюсь на Вашу помощь.Заранее спасибо!

   vicof

1 — 25.07.12 — 11:38

Без фотки топлесс такие вопросы не решить.

   Карась

2 — 25.07.12 — 11:38

Ой ошибку не дописала, вот она:»Метод объекта не обнаружен (OleFunction)

   Desktop = ServiceManager.OleFunction(«createInstance», «com.sun.star.frame.Desktop»);»

   pumbaEO

3 — 25.07.12 — 11:41

фотка уже есть?

   sash-ml

4 — 25.07.12 — 12:57

(2) ничего не выйдет, 1с такое не умеет,

   EasyRider

5 — 25.07.12 — 13:10

А откуда известно,что у ServiceManager есть именно такой метод как OleFunction()?

   ЧеловекДуши

6 — 25.07.12 — 13:24

Щас, автор выдаст — «Сама я не по 1С, да и не программист вообще, даже не программистка. А всего лишь системный администратор» :)

…Без фото, солнечный офис не будет работать…

   Карась

7 — 25.07.12 — 13:33

EasyRider вот здесь вроде вычитала.

http://www.ishodniki.ru/art/art_progr/builder/236.html

А сама я начинающий программист, поэтому не пугайте пожалуйста)

   Amra

8 — 25.07.12 — 13:35

(7) Никто не пугает, но без фото не взлетит)

   Карась

9 — 25.07.12 — 13:38

Фото пока сделать не могу, не в офисе пока)

   EasyRider

10 — 25.07.12 — 13:40

(7)в ссылке написано «OpenOffice.org базируется на компонентной модели UNO»,а не на сом!Поэтому подозреваю,что после строк  ServiceManager = Новый COMОбъект(«com.sun.star.ServiceManager»); вы получаете в переменной ServiceManager не совсем то,что хотите.

   Карась

11 — 25.07.12 — 13:43

То есть ошибка получается в

ServiceManager = Новый COMОбъект(«com.sun.star.ServiceManager»);

Неправильно определила ServiceManager?

   Карась

12 — 25.07.12 — 13:43

точнее объект

   EasyRider

13 — 25.07.12 — 13:47

думаю да

   EasyRider

14 — 25.07.12 — 13:48

а теперь фото в студию!!!

   Карась

15 — 25.07.12 — 13:50

Глупый вопрос, знаю, фото на каком моменте программы нужно(еще раз повторюсь, я еще маленький программист))

   sash-ml

16 — 25.07.12 — 13:50

Desktop = ServiceManager.createInstance(«com.sun.star.frame.Desktop»); а если так?

   Карась

17 — 25.07.12 — 13:53

Оооо, ура теперь надо следующую строчку исправлять, там та же ошибка, но попробую пока сама))

   pumbaEO

18 — 25.07.12 — 13:53

не верю, что вконтакте нету фото или где-то еще.

(16) так не честно.

   EasyRider

19 — 25.07.12 — 13:54

(15)фото нужно на моменте себя перед фотоаппаратом

   Карась

20 — 25.07.12 — 13:57

Да будет  фото,я сейчас не за своим компьютером,вечером выложу)

   Карась

21 — 25.07.12 — 13:58

   pumbaEO

22 — 25.07.12 — 14:07

Конфигурация Библиотека стандартных подсистем

ОбщийМодуль.УправлениеПечатьюOOWriterКлиент — там найдешь многие ответы на свои вопросы.

   SherifSP

23 — 25.07.12 — 14:08

(1) +++

   SherifSP

24 — 25.07.12 — 14:11

(21)Как для программиста очень даже ничего

   Карась

25 — 25.07.12 — 14:16

Спасибо)

   Карась

26 — 25.07.12 — 15:03

Проверила, действительно неправильно определила переменную док,переписала.

Док=Desktop.LoadComponentFromURL(«C:\dvstmp\qqqq.odt», «_blank», 0,Параметры);

Но теперь он пишет:

«{Справочник.ДоговорыКонтрагентов.Форма.ФормаЭлемента.Форма(420)}: Ошибка при вызове метода контекста (LoadComponentFromURL)

     Док=Desktop.LoadComponentFromURL(«C:\advastmp\qqqq.odt», «_blank», 0,Параметры);

по причине:

Произошла исключительная ситуация ([automation bridge] ): [automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence

Conversion of dispatch object to Sequence failed!

Произошла исключительная ситуация ([automation bridge] ): [automation bridge] UnoConversionUtilities<T>::dispatchExObject2Sequence

Conversion of dispatch object to Sequence failed!»

и вот это я уже, честно говоря в ступоре, сначала я не указывала параметры, и он жаловался на не совпадение типов, пока пытаюсь в режиме отладки, но безуспешно…

   Карась

27 — 25.07.12 — 17:13

Посидела еще немного, посмотрела, в моем случае я в переменную FilePath передаю ссылку на уже существующий файл,то есть мне надо будет обрабатывать ее с помощью функции ConvertToUrl, но что-то мне подсказывает что я ушла далеко в сторону, плюс еще я не стала передавать вид массива, опять же не уверена, что это правильно.

   dangerouscoder

28 — 25.07.12 — 17:22

   Карась

29 — 25.07.12 — 21:37

Спасибо большое, буду пробовать)

   Карась

30 — 25.07.12 — 21:42

Фотографию, как обещала, загрузила)

   Карась

31 — 26.07.12 — 09:48

С этим вариантом пока тоже исключительная ошибка, я немного не пойму похоже дело в указании массива, я его не использую,но как поняла, что без этого никак…

   Карась

32 — 26.07.12 — 10:36

Я попыталась сделать кусок кода как в этой ссылке, но у меня пока не работает

ServiceManager = Новый COMОбъект(«com.sun.star.ServiceManager»);

   
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_какУРЛ = // «file:///» +  СтрЗаменить(«C:\dvstmp\qqqq.odt», «», «/»); // приводим путь к файлу из виндового формата в опен офисный

Document=Desktop.LoadComponentFromURL( ВременныйФайлXLS_какУРЛ, «_blank», 0,НастройкиОткрытия);

На месте определения Document он выдает ошибку:

«{Справочник.ДоговорыКонтрагентов.Форма.ФормаЭлемента.Форма(434)}: Ошибка при вызове метода контекста (LoadComponentFromURL)

     Document=Desktop.LoadComponentFromURL( ВременныйФайлXLS_какУРЛ, «_blank», 0,НастройкиОткрытия);

по причине:

Произошла исключительная ситуация ([automation bridge] ): com.sun.star.lang.IllegalArgumentException: URL seems to be an unsupported one.»

Возможно я неправильно указала URL-адрес

  

Карась

33 — 26.07.12 — 12:02

Прошла еще немного, без функции ConvertToURL работать не будет, то есть надо путь к файлу обрабатывать там, как это сделать пока не поняла, нашла, что надо использовать Стр.Заменить, опять же еще не совсем понимаю, как в данном случае ей воспользоваться, если не сложно, помогите пожалуйста.

  1. Как подключиться через COM к ОО 2.3. И какими методами там работать? У кого-нибудь есть пример?


  2. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Перем Аргументы;  // Массив аргументов для создания приложения
    
    СервисОО = Новый COMОбъект("com.sun.star.ServiceManager"); // Создаём доступ
    Десктоп = СервисОО.createInstance("com.sun.star.frame.Desktop"); // Создаём десктоп
    // Создаем документ приложения Writer
    Документ = Десктоп.LoadComponentFromURL("private:factory/swriter", "_blank", 0, Аргументы); 
    
    

    Подробно можно почитать по этой ссылке (1,5Mb), начиная с главы Введение в OpenOffice.org API, если знаком с любым яхыком программирования — будет очень просто все.

  3. Спасибо. А можно простой пример. Перебор строк и получение значений из нескольких колонок? Заранее благодарен.


  4. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Я так понимаю, разговор про Calc уже? :)
    Вот, примерно так можно:

    Листы = Документ.getSheets();
    Лист = Листы.getByIndex(0);
    Для Позиция = 0 По 10 Цикл
    Лист.getCellByPosition(0, Позиция).value = 2;
    КонецЦикла;
    
    
    

  5. minute

    Offline

    minute

    Регистрация:
    28 мар 2007
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1

    Такой вопрос: а как получить доступ к уже открытому документу Calc?


  6. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Т.е. подключиться к процессу?
    Методологически неправильно так делать.


  7. minute

    Offline

    minute

    Регистрация:
    28 мар 2007
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1

    Почему? В Exel’е, например, с этим вообще никаких проблем:

    ехель=СоздатьОбъект("Excel.Application");
    //взять контрагента и поместить его в поле комментарий  
    Если флНестандарт=0 Тогда
    Ячейка=ехель.Cells(10,2);
    иначе
    Ячейка=ехель.Cells(15,2);
    КонецЕсли;
    
    
    
    

    В ячейке будет содержаться текст открытого в данный момент документа Excel, с активного листа.
    А в Open Office? :unsure:


  8. Саша82

    Offline

    Саша82
    Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26

    А как можно сделать проверку орфографии в УТ для почтовых сообщений?
    Еще у меня при запуске вот такого кода:

    FileName= "file:///C:/Documents and SettingsСашаРабочий стол1.ods";	
    
    СервисОО = Новый COMОбъект("com.sun.star.ServiceManager"); 
    Десктоп = СервисОО.createInstance("com.sun.star.frame.Desktop"); 
    
    :unsure: Документ = Десктоп.LoadComponentFromURL(FileName, "_blank", 0, Аргументы);
    
    Листы = Документ.getSheets();
    Лист = Листы.getByIndex(0);
    Для Позиция = 0 По 10 Цикл
    Лист.getCellByPosition(0, Позиция).value = 2;
    

    Вот в этом месте выдает вот такую ошибку:
    {Обработка.BioЗагрузкаXML.Форма.Форма1(246)}: Ошибка при вызове метода контекста (LoadComponentFromURL): Типы не совпадают (1)
    Документ = Десктоп.LoadComponentFromURL(FileName, «_blank», 0, Аргументы);

    На самом деле это написано вот так: «file:///C:/Documents and SettingsСашаРабочий стол1.ods»
    При выделение здесь в код почему то неправильно показывает.


  9. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Что-то не так с именем файла :)


  10. Саша82

    Offline

    Саша82
    Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26

    Ну я в общем то тоже так подумал. Ну что же тогда может быть?
    Там есть что то типо функций ConvertToURL и ConvertToURL.
    Еще GetPathSeparator() но я не знаю как это использовать из 1С и в обще нужно ли это?
    Потом я попробовал использовать такой путь «file:///C:/1.ods» но это не помогло.
    Что в обще такое private:factory/scalc?


  11. Саша82

    Offline

    Саша82
    Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26

    Как сделать Нужно сделать массив аргументов для создания приложения? Вот так не получается:

    СервисОО = Новый COMОбъект("com.sun.star.ServiceManager"); 
    Десктоп = СервисОО.createInstance("com.sun.star.frame.Desktop"); 
    a=  СервисОО.createInstance("com.sun.star.beans.PropertyValue");
    Документ=Десктоп.LoadComponentFromURL("file:///c:/1.ods","_blank",0, a);
    

    Вот в этих: http://community.i-rs.ru/index.php/topic,9…2.html#msg59152 http://community.i-rs.ru/index.php?topic=8…w;topicseen#new
    темах написано что его можно создать с помощью MSScriptControl.


  12. Саша82

    Offline

    Саша82
    Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26

    Можно этот массив создать с помощью 1С?
    Может можно создать проверку орфографии с помощью самой 1С? В ней ведь есть вроде база слов?


  13. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    :unsure:
    Я не успеваю за тобой, автор :)


  14. nomad_irk

    Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.675
    Симпатии:
    1.011
    Баллы:
    204

    Подниму тему.

    интересует каким образом запустить Сalc невидимым?
    каким образом добавить «hidden» True в массив аргументов запуска?

    Scr = Новый COMОбъект(«MSScriptControl.ScriptControl»);
    Scr.language = «javascript»;
    Scr.eval(«Arr = new Array()»);
    Scr.AddObject(«ServiceManager», СервисОО);
    Array = Scr.eval(«Arr»);

    Array[0].Name = «Hidden»;
    Array[0].Value = Истина;

    не робит

Похожие темы

  1. Azgerd
    Ответов:
    0
    Просмотров:
    3.682


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3


Description


Shestakov Dmitriy



2012-02-27 17:36:31 MSK

1с 8.2 (8.2.14.533)
OpenOffice.org 3.3 

Конфигурация значения не имеет, думаю, что и версия платформы роли не играет.

Нужно установить OpenOffice в WINE@.

Обработка находится тут: /var/ftp/pvt/Windows/Testing/RT/23134.

Способ воспроизведения:
1. Открываете 1с в рабочем режиме.
2. Файл-Открыть и указать обработку.
3. Выбрать каталог, только не корень диска.

Все, в итоге должна создаться таблица опенофис Test_oo_via_NX.ods со
строкой "Тестовое сообщение".


Comment 1


Svetlana Zhukova



2012-02-28 12:06:51 MSK

eterhack bottle 1c82/8241
2.0.0-eter2.18/8


Установила ОО,  calc запускается,работает.
При выполнении обработки в консоли:

Usually, you can find it in the winbind package of your distribution.
fixme:file:MoveFileWithProgressW MOVEFILE_WRITE_THROUGH unimplemented
err:ole:CoInitializeEx Attempt to change threading model of this apartment from apartment threaded to multi-threaded
err:ole:marshal_object object doesn't expose interface {00000126-0000-0000-c000-000000000046}, failing with error 0x80004002
err:ole:ClientIdentity_QueryMultipleInterfaces IRemUnknown_RemQueryInterface failed with error 0x80004002
-\-\-\-повторяется
err:ole:CoGetClassObject class {6c736db1-bd94-11d0-8a23-00aa00b58e10} not registered
err:ole:CoGetClassObject no class object {6c736db1-bd94-11d0-8a23-00aa00b58e10} could be created for context 0x1


Программа зависает.


Comment 2


Svetlana Zhukova



2012-03-13 11:15:22 MSK

Установила unioffice. Теперь при выполнении обработки появляетя сообщение,что на компьютере не установлен OO, при этом открывается стартовое окно OO.


Comment 3


Константин Кондратюк



2012-04-03 18:32:24 MSK

Зачем устанавливался UniOffice, я не понял - обработка изначально работает с объектами OpenOffice.

Пересоздал бутылку:
eterhack bottle bugs/8241

1С 8.2.15.301, LibreOffice 3.5.1

На первый взгляд: запускается обработка, открывается LibreOffice, создаётся файл по указанному пути. Файл, кажется, пустой. LibreOffice, запустившись, остаётся открытым - не понятно, влияет это как-нибудь на работу обработки или нет.


Comment 4


Константин Кондратюк



2012-04-03 18:53:08 MSK

В обработке есть такой код:

ServiceManager=новый COMОбъект("com.sun.star.ServiceManager");   

Граница = ServiceManager.Bridge_GetStruct("com.sun.star.table.BorderLine");
Граница.lineDistance =  0;
Граница.innerLineWidth = 0;
Граница.outerLineWidth = 1;
	
scr = новый COMОбъект("MSScriptControl.ScriptControl");
scr.language = "javascript";
scr.eval("Массив=new Array()");
Массив = scr.eval("Массив");
scr.AddCode("function SetItem(ind,val){Массив[ind]=val}");    
scr.AddObject("ServiceManager",ServiceManager);  
		scr.eval("Массив[0]=ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
scr.eval("Массив[0].Name='Hidden'");
scr.eval("Массив[0].Value=true");


Судя по результатам построчного выполнения, работа замораживается на строчке
Массив = scr.eval("Массив");

При этом никаких ошибок выполнение непосредственно этой инструкции в консоль не валит.


Comment 5


Константин Кондратюк



2012-04-03 19:19:13 MSK

OpenOffice вообще не имеет никакого отношения к проблеме. Проблема возникает при работе с объектом MSScriptControl из Windows Scripting. С чем связано, пока не ясно.


Comment 6


Константин Кондратюк



2012-04-03 19:22:49 MSK

Created attachment 2472 [details]
простой тест

Тестовая обработка: создаём объект, создаём массив, пытаемся переменной Массив присвоить значение - в этот момент возникает ошибка.

scr = новый COMОбъект("MSScriptControl.ScriptControl");
scr.language = "javascript";
scr.eval("Массив=new Array()");
Массив = scr.eval("Массив");
scr.AddCode("function SetItem(ind,val){Массив[ind]=val}");


Comment 7


Константин Кондратюк



2012-04-03 19:36:47 MSK

Как и ожидалось, на Windows такая обработка успешно выполняется.


Comment 8


Константин Кондратюк



2012-04-03 19:43:36 MSK

И в 1.0.12 простая обработка выполняется


Comment 10


Константин Кондратюк



2012-04-03 20:08:03 MSK

Дотестировал 1.0.12 - в дальнейшем появляется ошибка при вызове LoadComponentFromURL()

То есть в качестве временного решения не подойдёт.


Comment 11


Константин Кондратюк



2012-04-03 20:09:17 MSK

Точный текст ошибки в 1.0.12:
{Форма.Форма.Форма(61)}: Ошибка при вызове метода контекста (LoadComponentFromURL)
	Document = Desktop.LoadComponentFromURL(convertToURL(ИмяФайла), "_blank", 0, Массив);
по причине:
Типы не совпадают (1)


Comment 12


Константин Кондратюк



2012-04-04 16:41:06 MSK

В 1.0.12 тоже есть ошибка. Только при выполнении проблемной строки кода валятся fixme и, по всей видимости, возвращается ошибка. В итоге результат работы такой же, как и при Массив = 0;

Не работает ни в одной из версий, но в 2.0 ведёт к зависанию, тогда как у 1.0.12 недостаточно функционала для достижения ошибки.


Comment 13


Константин Кондратюк



2012-04-04 18:21:09 MSK

Не возвращается управление из функции ITypeInfo2_fnGetContainingTypeLib()

Зависание где-то в районе выполнения строки:
    *pIndex = This->typeinfo->typekind >> 16;
(до неё трейсится, после - нет)


Comment 14


Константин Кондратюк



2012-04-04 18:22:22 MSK

Путём экспериментов с параметрами упростил запуск обработки:
$ wine 1cv8.exe enterprise /F"D:\DemoAcc" /execute "C:\SimpleTest.epf"


Comment 15


Константин Кондратюк



2012-04-04 19:11:56 MSK

(В ответ на comment #13)
> Зависание где-то в районе выполнения строки:
>     *pIndex = This->typeinfo->typekind >> 16;

Всё потому, что приходящий pIndex == NULL.
Если игнорировать нулевой указатель, то обработка выполняется, а затем успешно выполняется и большая обработка по выгрузке в OpenOffice.

В качестве экстренной меры добавил проверку на нулевой указатель - хуже точно не будет, а 1ске (как минимум) становится лучше.


Comment 17


Константин Кондратюк



2012-04-06 11:11:22 MSK

Пришёл отзыв пользователя: в новой сборке всё работает.

Помогите пожалуйста написать макрос для openoffice calc. Хочу написать макрос который мог бы в исходно открытый документ *.ods копировал значения выбранного диапазона к примеру (A1:B2) из другого файла *.ods, загвоздка еще в том что бы он копировал в определенно выбранную область т.е на пример копировал из file1.ods диапазон (A1:B2) и вставил в исходно открытый svod.ods диапазон (C3.D4). Помогите, бьюсь второй день! Хочу научится!


Добро пожаловать на форум, VEU! (А что этот ник должен означать? ФИО, что ли?)

Цитата: VEU от 16 марта 2016, 08:35Хочу научится!

Похвальное желание. Тем более — добро пожаловать!

Цитата: VEU от 16 марта 2016, 08:35
Хочу написать макрос который мог бы в исходно открытый документ *.ods копировал значения выбранного диапазона к примеру (A1:B2) из другого файла *.ods, загвоздка еще в том что бы он копировал в определенно выбранную область т.е на пример копировал из file1.ods диапазон (A1:B2) и вставил в исходно открытый svod.ods диапазон (C3.D4).

Эта задача решена уже не один раз. Там всё очень просто.
Сначала скачиваешь файл по

этой ссылке

Открываешь его и по Ctrl+F ищешь «copy sp» — попадаешь на строчку в оглавлении «5.23.1. Copy Spreadsheet Cells With The Clipboard»
Там же чуть ниже ещё и «Copy Spreadsheet Cells Without The Clipboard», и «An alternative to the clipboard – transferable content».
Зажимаешь Ctrl и кликаешь по строчке — перепрыгиваешь сразу в нужное место. Основная часть — собственно макрос. Остальные две строчки — пояснение к нему. Даже если не силён в английском — Гугль-переводчик легко объяснит, о чём пойдёт речь.
Если всё ещё не понятно — опять пишешь сюда и форумчане помогают разобраться что к чему.



Я так понял, что данный макрос переносит данные из исходно открытого документа, может я не совсем понял)) только учусь). Можно ли сделать так что бы, допустим я открыл файл Svod.ods к примеру нажал кнопку и он перенес данные из File1.ods. Просто как правильно это записать, можете помочь?

Sub CopyPasteRange()
  Dim oSourceDoc, oSourceSheet, oSourceRange
  Dim oTargetDoc, oTargetSheet, oTargetCell
  Dim oDisp, octl
  Dim sUrl As String
  Dim NoArg()

  oSourceDoc=ThisComponent
  octl = oSourcedoc.getCurrentController()
  oSourceframe = octl.getFrame()
  oSourceSheet= oSourceDoc.Sheets(0)
  oSourceRange = oSourceSheet.getCellRangeByPosition(0,0,100,10000)

    oDisp = createUnoService(«com.sun.star.frame.DispatchHelper»)

  octl.Select(oSourceRange)

  oDisp.executeDispatch(octl, «.uno:Copy», «», 0, NoArg())

    sURL = «private:factory/scalc»
  oTargetDoc = Stardesktop.loadComponentFromURL(sURL, «_blank», 0, NoArg())
  oTargetSheet = oTargetDoc.getSheets.getByIndex(0)

    oTargetCell = oTargetSheet.getCellByPosition(0,0)
  oTargetDoc.getCurrentController().Select(oTargetCell)

  oTargetframe = oTargetDoc.getCurrentController().getFrame()
  oDisp.executeDispatch(oTargetFrame, «.uno:Paste», «», 0, NoArg())
End Sub


Может быть, так будет понятнее


Большое спасибо!! форум класс!


Здравствуйте! скажите, возможно ли сделать из этого же примера, что бы он так же брал из file1.ods диапазон ячеек (A1:B2) и (A4:B4) т.е скопировал, после вставлял в svod.ods соответственно (A1:B2) в (E7:F7) а (A4:B4) в (E10:F10). Надеюсь понятно объяснил))

Sub onBtnClick(oEvent As Variant)
Dim oSheet As Variant   
Dim lastRow As Long      
Dim oCellRangeByPosition As Variant   
Dim oFileSelector As Variant   
Dim   sFileName As String   
Dim iDoc As Variant      
Dim bDisposable As Boolean   
Dim iSheet As Variant   
Dim iCursor As Variant   
Dim iData As Variant   

   GlobalScope.BasicLibraries.LoadLibrary(«Tools»)
   oSheet = ThisComponent.getCurrentController().getActiveSheet()
   sFileName = oEvent.Source.getModel().getParent().getByName(«selectFile»).Text
   iDoc = OpenDocument(ConvertToURL(sFileName), Array(), bDisposable)
   If IsNull(iDoc) Or IsEmpty(iDoc) Then
      MsgBox(«Файл с именем ‘» + sFileName + «‘ не может быть открыт», 48, «Ошибка открытия файла»)
      Exit Sub
   EndIf
   iSheet = iDoc.getSheets().getByIndex(0)
   iCursor = iSheet.createCursor()
        iCursor.gotoEndOfUsedArea(True)
   iData = iCursor.getDataArray()
   lastRow = GetLastUsedRow(oSheet)
   If lastRow>0 Then lastRow = lastRow + 1
   oCellRangeByPosition = oSheet.getCellRangeByPosition(0, lastRow, UBound(iData(0)), UBound(iData)+lastRow)
   oCellRangeByPosition.setFormulaArray(iData)
   If bDisposable Then iDoc.close(True)
End Sub


Можно, всё можно.
Дело в том, что нужно просто понять что это за зверь .getCellRangeByPosition и какие параметры ему передаются.
Там всё просто — номер левой колонки, номер верхней строки, номер правой колонки, номер нижней строки. При этом не забывать, что нумерация начинается с нуля.
То есть для диапазона (A1:B2) нужно написать .getCellRangeByPosition(0,0,1,1), для (A4:B4) — .getCellRangeByPosition(0,3,1,3). Эти методы нужно применять к листу исходных данных (в нашим примере это iSheet).
Точно так же и диапазоны выходные:

(E7:F7) -> oSheet.getCellRangeByPosition(4, 6, 5, 6),
(E10:F10)  -> oSheet.getCellRangeByPosition(4, 9, 5, 9)

Есть у листа еще и метод .getCellRangeByName(«A4:B4») — ему можно диапазон ячеек подсовывать прямо в виде текстовой строки, не заморачиваясь пересчетом колонок и столбцов. Но, что касается меня, то стараюсь все-таки использовать .getCellRangeByPosition(). Просто был у меня случай, когда скопировал диапазон из сообщения на форуме и целый день искал ошибку в коде. А оказалось, что А12:С240 было написано РУССКИМИ буквами.

Да, а копирование данных диапазон в диапазон можно записать одной длинной строкой

oSheet.getCellRangeByPosition(4, 6, 5, 6).setFormulaArray(iSheet.getCellRangeByPosition(0,0,1,1).getDataArray())
Не смотря на «ужасный», нечитаемый вид — должна работать.

PS. И не надо копировать весь текст макроса в следующее сообщение — только тот кусочек, который вызывает вопросы. И форматируй, плз, эти фрагменты как код (такая специальная кнопочка с «диезом»)


Понял, спасибо! попробуем)


Чего то я упускаю! не получается, сори только учусь))

oSheet = ThisComponent.getCurrentController().getActiveSheet()

sFileName = oEvent.Source.getModel().getParent().getByName("selectFile").Text

iDoc = OpenDocument(ConvertToURL(sFileName), Array(), bDisposable)

If IsNull(iDoc) Or IsEmpty(iDoc) Then
MsgBox("Файл с именем '" + sFileName + "' не может быть открыт", 48, "Ошибка открытия файла")
Exit Sub
EndIf

iSheet = iDoc.getSheets().getByIndex(0)

    oSheet.getCellRangeByPosition(4, 6, 5, 6).setFormulaArray(iSheet.getCellRangeByPosition(0,0,1,1).getDataArray()

If bDisposable Then iDoc.close(True)


Не переживай, это с непривычки. Смотри внимательно:

(4, 6, 5, 6).setFormula...(0,0,1,1)
Представь себе два прямоугольника с такими координатами… Видишь? Нижний — из двух ячеек в одной строке, а второй — уже квадратик 2х2.
Чтобы оператор копирования сработал, оба прямоугольника должны быть одного размера. Или первый (4, 6, 5, 7), или второй (0,0,1,0)

(И не рассказывай, что это я ошибся!
Во-первых, это у тебя было так написано «(A1:B2) в (E7:F7)», я просто перевёл.
А во-вторых, я и так знаю, что ошибся  ;D )


Здравствуйте! еще раз спасибо за помощь)
Скажите пожалуйста, есть ли команда которая копирует не только значение, а вообще все что имеется в ячейках как например в стандартных функциях Calc «Специальная вставка->выделение ->вставить всё»? Просто имеется строка на некоторых ячейках зашиты формулы, хочу написать макрос что бы он копировал строку со всем содержимым и вставлял в другую пустую строку.


Помнишь, как мы получали активный лист? Спрашивали у текущего документа «Кто у тебя сейчас контроллер?» (.getCurrentController())
Этот вот контроллер знает что выделено в данный момент. И, более того, может скопировать это выделение в переменную — всё-всё, значения, формулы, форматы.
Делается это приблизительно так

oCurrentController = ThisComponent.getCurrentController()
oCurrentController.select(<какой-то участок на листе, oCellRangeByPosition>)
oTransferable = oCurrentController.getTransferable()

А это скопированное можно вставить куда захочешь, то ли прямо в этот документ, то ли в другой — это сделает

oCurrentController.insertTransferable(oTransferable)
Это всё расписано в том самом «An alternative to the clipboard – transferable content», о котором я писал во втором сообщении этой темы



16.05.2017

    ОкноПрограммы

Файлы для самостоятельного тестирования на 1С:Профессионал распространяются в виде xls, с включенными макросами, которые нормально работают только в MS Excel. Однако у меня нет возможности использовать MS Excel, зато есть OpenOffice, но вот незадача — не «отрабатывают» эти файлы в нем… Поэтому возникла идея создать конфу, которая бы всасывала инфу с ИТС, и складывала бы удобном для тестирования виде, ну и тестировала за одно.

Конфа пустая, чтобы её заполнить, нужно загрузить файлы билетов с диска ИТС при помощи инструмента «Загрузка вопросов из файлов тестов» (на ИТС они живут в «Database1CInfoStorage») вообще система прошерстит все *.xls файлы (а также *.cab, внутри которых могуть быть *.xls), указанной папки на предмет сходства с тестами и что нужно загрузит. Конфа в качестве тренеровки написана на управляемых формах. Для загрузки на компе-клиенте требуется установка OpenOffice (тестировалось на версии 3.3.0). Для тестирования же наличие OpenOffice не обязательно. При использовании имеется проблема с отображением картинок, которые могут обрезаться — лечится увеличением окна.

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка при вызове метода контекста getcorporationrequisitesbyinn
  • Ошибка при вызове метода контекста execute 1c
  • Ошибка при вызове метода контекста converttoshape
  • Ошибка при вызове метода контекста connectagent

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии