Меню

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

   ЯЧайник

17.07.18 — 11:55

Добрый день! платформа 8.3.10.2772 толстый клиент. Пробую писать выгрузку в openOffice так как Excel не установлен. Взяла из интернета примерный алгоритм. Выдает следующую ошибку:

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

Doc=Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ(«D:АнтонинаВыгрузкиМатериалы123.ods»), «_blank», 0, Args);

по причине:

Произошла исключительная ситуация ([automation bridge] ): com.sun.star.lang.IllegalArgumentException: Unsupported URL <file://localhost/D:/Антонина/ВыгрузкиМатериалы/123.ods>: «type detection failed»

   ЯЧайник

1 — 17.07.18 — 11:59

мой код

Попытка

        OpenOffice = Новый ComОбъект(«com.sun.star.ServiceManager»); // Создаем СОМ-объект

    Исключение

        Предупреждение(ОписаниеОшибки() + Символы.ПС + «программа OpenOffice не установлена на данном компьютере!»);

        Возврат;

    КонецПопытки;

    Desktop = OpenOffice.CreateInstance(«com.sun.star.frame.Desktop»); // Создаем Desktop

Args = Новый COMSafeArray(«VT_VARIANT», 3);

    Свойства = OpenOffice.Bridge_GetStruct(«com.sun.star.beans.PropertyValue»);

    Свойства.Name = «AsTemplate»;

    Свойства.Value = Истина;

    Args.SetValue(0, Свойства);

    
    Свойства1 = OpenOffice.Bridge_GetStruct(«com.sun.star.beans.PropertyValue»);

    Свойства1.Name = «Hidden»;

    Свойства1.Value = Истина;

    Args.SetValue(1, Свойства1);

Doc = Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ(«D:АнтонинаВыгрузкиМатериалы123.ods»), «_blank», 0, Args);

    Sheets = Doc.getSheets();

    Sheet = Sheets.getByIndex(0); // Открываем первый лист по индексу

    мИтКол = 0;

Для каждого кол из ТЗ.Колонки Цикл

        Sheet.getCellByPosition(мИтКол,0).setString(кол.Имя);

        
        мИтКол = мИтКол + 1;

    КонецЦикла;

ВсегоСтрок = ТЗ.Количество();

    ВсегоКолонок = ТЗ.Колонки.Количество();

    МассивКОМ = Новый COMSafeArray(«VT_VARIANT», ВсегоСтрок,ВсегоКолонок);

    
    иткол = 0;

    итстр = 0;

Для каждого стр из ТЗ Цикл

        Для каждого кол из ТЗ.Колонки Цикл

            стрРез = СокрЛП(стр[кол.Имя]);

            МассивКОМ.SetValue(итстр,иткол,стрРез);

            
            иткол = иткол+1;

         КонецЦикла;

        
        иткол = 0;

        итстр = ?(итстр=ВсегоСтрок,0,итстр+1);

    КонецЦикла;

begCol = 0;

    begRow = 1;

    endCol = ВсегоКолонок-1;

    endRow = ВсегоСтрок;

    Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);

    Range.setDataArray(МассивКОМ);

    
    Doc.storeToURL(ПривестиФайлКУРЛ(«D:АнтонинаВыгрузкиМатериалы123.odt»),Args);

Свойства2 = OpenOffice.Bridge_GetStruct(«com.sun.star.beans.PropertyValue»);

    Свойства2.Name = «FilterName»;

    Свойства2.Value = «MS Excel 97»;

    Args.SetValue(2,Свойства2);

Doc.storeToURL(ПривестиФайлКУРЛ(«D:АнтонинаВыгрузкиМатериалы123.odt»),Args);

Doc.close(true);

    Desktop.terminate();

   ЯЧайник

2 — 17.07.18 — 12:00

Функция ПривестиФайлКУРЛ(ПутьКФайлу)

    ПутьКФайлу = СтрЗаменить(ПутьКФайлу,» «,»%20»);

    ПутьКФайлу = СтрЗаменить(ПутьКФайлу,»»,»/»);

    Возврат «file:/» + «/localhost/» + ПутьКФайлу;

Конецфункции

   ЯЧайник

3 — 17.07.18 — 12:01

Подскажите,пожалуйста,умные люди, в чём может быть причина данной ошибки?

   ЯЧайник

4 — 17.07.18 — 12:03

Данный код пишу в обычных формах (УПП), в модуле объекта (Обработки)

   don_Rumata

5 — 17.07.18 — 12:03

У меня функция преобразования выглядит так:

// Функция преобразует Windows имя файла в URL OpenOffice                      

Функция ПреобразоватьВURL(ИмяФайла)  

    
    Возврат «file:///» + СтрЗаменить(ИмяФайла, «», «/»);

    
КонецФункции

   spectre1978

6 — 17.07.18 — 12:04

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

   ЯЧайник

7 — 17.07.18 — 12:06

Попробую еще раз другие варианты формата УРЛ,но,мне кажется,что я уже как только не пробовала его писать…

   spectre1978

8 — 17.07.18 — 12:09

может не дружить с кириллицей, например

   spectre1978

9 — 17.07.18 — 12:09

попробуйте использовать в пути и имени файла только латинские буквы

   ЯЧайник

10 — 17.07.18 — 12:20

(5) не меняет ситуацию

   ЯЧайник

11 — 17.07.18 — 12:20

(9) да,тоже думала, а потом забыла попробовать. сейчас попробую

   spectre1978

12 — 17.07.18 — 12:23

что-то отличное от латиницы в URLах — это вообще очень специфическая и непростая тема. Непонятно как ее опенофис разруливает и разруливает ли вообще.

   ЯЧайник

13 — 17.07.18 — 12:28

com.sun.star.lang.IllegalArgumentException: Unsupported URL <file://localhost/D:/123.ods>: «type detection failed»

   Черный маклер

14 — 17.07.18 — 12:32

(0) простых путей как сохранить ТабличныйДокумент в ods совсем не признаешь ?

   ПегийЛунь

15 — 17.07.18 — 12:32

   ЯЧайник

16 — 17.07.18 — 12:32

com.sun.star.lang.IllegalArgumentException: Unsupported URL <file://localhost/D:/upps.xls>: «type detection failed»

   ЯЧайник

17 — 17.07.18 — 12:41

(15) у меня в (2) такая же функция точь в точь, как в решении проблемы по ссылке из (15)

   spectre1978

18 — 17.07.18 — 13:06

(16) попробуйте localhost/ убрать из латинского пути

   ЯЧайник

19 — 17.07.18 — 13:17

пробовала как в (5), не получается

   spectre1978

20 — 17.07.18 — 13:33

(19) а с правами проблем не может быть? В (15) очень похожая проблема описана, используют временный файл, потом переносят

   ЯЧайник

21 — 17.07.18 — 13:34

возможно. сейчас рассматриваю запись во временный файл

   ЯЧайник

22 — 17.07.18 — 14:42

ТабДокумент = Новый ТабличныйДокумент;

    
    Макет = ЭтотОбъект.ПолучитьМакет(«Материалы»);

    Заголовок = Макет.ПолучитьОбласть(«Заголовок»);

    ТабДокумент.Вывести(Заголовок);

    
    Для каждого стр из ТЗ Цикл

        СтрокаМатериал = Макет.ПолучитьОбласть(«Строка»);

        ЗаполнитьЗначенияСвойств(СтрокаМатериал.Параметры,Стр);

        ТабДокумент.Вывести(СтрокаМатериал);

        
    КонецЦикла;

    // Открыть OpenOffice

    Попытка

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

    Исключение

        Предупреждение(ОписаниеОшибки() + Символы.ПС + «программа OpenOffice не установлена на данном компьютере!»);

        Возврат;    

    КонецПопытки;

    
    ВременныйФайл =ПолучитьИмяВременногоФайла();

    ВременныйФайлXLS = ПолучитьИмяВременногоФайла(«xls»);

    ВременныйФайлXLS1 = СтрЗаменить(ВременныйФайлXLS,».xls»,»»)+»1.xls»;

    
    ТабДокумент.Записать(ВременныйФайлXLS,ТипФайлаТабличногоДокумента.XLS97);

      
    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_какУРЛ = ПривестиФайлКУРЛ(ВременныйФайлXLS);

    //»file:///» + СтрЗаменить(ВременныйФайлXLS, «», «/»); // приводим путь к файлу из виндового формата в опен офисный

    ВременныйФайлXLS1_какУРЛ = ПривестиФайлКУРЛ(ВременныйФайлXLS1);

    //»file:///» + СтрЗаменить(ВременныйФайлXLS1, «», «/»);  

    // Откроем файл в опене офисе

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

    
    НастройкиСохранения = Новый COMSafeArray(«VT_VARIANT», 1);

    Свойства2 = ServiceManager.Bridge_GetStruct(«com.sun.star.beans.PropertyValue»);

    Свойства2.Name = «FilterName»;

    Свойства2.Value = «MS Excel 97»;

    НастройкиСохранения.SetValue(0,Свойства2);

      
    //ВременныйФайлPDF_какУРЛ = «file:///» + СтрЗаменить(ВременныйФайлPDF, «», «/»); // приводим путь к файлу из виндового формата в опен офисный

    ОпенОфис.storeToURL(ВременныйФайлXLS1_какУРЛ, НастройкиСохранения); // сохранили PDF файл

    ОпенОфис.close(-1);

    ОпенОфис = Неопределено;

   ЯЧайник

23 — 17.07.18 — 14:43

ну,вроде, как-то так

   ЯЧайник

24 — 17.07.18 — 14:51

спасибо за подсказки

   ЯЧайник

25 — 17.07.18 — 15:03

хотя,наверное,можно было ограничиться

ТабДокумент = Новый ТабличныйДокумент;

    
    Макет = ЭтотОбъект.ПолучитьМакет(«Материалы»);

    Заголовок = Макет.ПолучитьОбласть(«Заголовок»);

    ТабДокумент.Вывести(Заголовок);

    
    Для каждого стр из ТЗ Цикл

        СтрокаМатериал = Макет.ПолучитьОбласть(«Строка»);

        ЗаполнитьЗначенияСвойств(СтрокаМатериал.Параметры,Стр);

        ТабДокумент.Вывести(СтрокаМатериал);

        
    КонецЦикла;

    ТабДокумент.Записать(«D:АнтонинаВыгрузкиМатериалы123.xls»,ТипФайлаТабличногоДокумента.XLS97);

и не парить себе мозг…

   spectre1978

26 — 17.07.18 — 15:12

(25) вам решать. Мы же не знаем, зачем вам именно OOo. Возможно, у вас что-то не сохраняется средствами 1С, она не все и не всегда корректно может сохранить в XLS.

  

ЯЧайник

27 — 17.07.18 — 15:34

(26) согласна

Автор VEU, 16 марта 2016, 08:35

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

Помогите пожалуйста написать макрос для 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», о котором я писал во втором сообщении этой темы



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

  • Главная категория

  • Basic

  • Не получается написать макрос для openoffice calc

1

2

Показывать по
10
20
40
сообщений

Новая тема

Ответить

Zebraaa

Дата регистрации: 16.03.2012
Сообщений: 23

Платформа 1с 8.2.15.310, релиз 1.0.12.2 При открытии стандартного отчета Карточка субконто выдается сообщение: Ошибка при вызове метода контекста (Найти поле). Если доступные поля. Найти поле(Отборы.Элементы [Я]_ Левое значение).=Неопределенно Тогда по причине Несоответствии типов (параметр номер 1) <br>Причем такая ошибка выходит только у одного пользователя, у других все нормально открывается.

Sh_S

Дата регистрации: 02.03.2007
Сообщений: 7730

где-то стоит отбор со сравнением с пустым значением, зайдите в настройку и посмотрите

Zebraaa

Дата регистрации: 16.03.2012
Сообщений: 23

А можно ,пожалуиста, по подробнее!

Sh_S

Дата регистрации: 02.03.2007
Сообщений: 7730

мне кажется теперь, что я не права. Под рукой бухгалтерии нет, но в УПП и ЗУПе если поставить отбор по пустому значению выходит просто шапка отчета. Но все-таки посмотрите внимательно на отборы в настройках.

Zebraaa

Дата регистрации: 16.03.2012
Сообщений: 23

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

Денис (САМАРА)

Дата регистрации: 09.04.2008
Сообщений: 8351

Платформу обновить до последней. Выполнить тестирование и исправление со всеми флагами.

Zebraaa

Дата регистрации: 16.03.2012
Сообщений: 23

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

Денис (САМАРА)

Дата регистрации: 09.04.2008
Сообщений: 8351

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

Zebraaa

Дата регистрации: 16.03.2012
Сообщений: 23

Кстати, самое интересное, что сохраненных настроек по этому пользователю нет, а по другим есть.

Денис (САМАРА)

Дата регистрации: 09.04.2008
Сообщений: 8351

Имеются ввиду «Сохраненные варианты отчета».

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

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

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка при входе на сайт через стим
  • Ошибка при вызове метода контекста execute слишком длинный строковый параметр