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
Данный код пишу в обычных формах (УПП), в модуле объекта (Обработки)
5 — 17.07.18 — 12:03
У меня функция преобразования выглядит так:
// Функция преобразует Windows имя файла в URL OpenOffice
Функция ПреобразоватьВURL(ИмяФайла)
Возврат «file:///» + СтрЗаменить(ИмяФайла, «», «/»);
КонецФункции
6 — 17.07.18 — 12:04
ну вроде почти по-русски же пишет что урл кривой. Попробуйте написать путь к файлу как-то по-другому.
7 — 17.07.18 — 12:06
Попробую еще раз другие варианты формата УРЛ,но,мне кажется,что я уже как только не пробовала его писать…
8 — 17.07.18 — 12:09
может не дружить с кириллицей, например
9 — 17.07.18 — 12:09
попробуйте использовать в пути и имени файла только латинские буквы
10 — 17.07.18 — 12:20
(5) не меняет ситуацию
11 — 17.07.18 — 12:20
(9) да,тоже думала, а потом забыла попробовать. сейчас попробую
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)
18 — 17.07.18 — 13:06
(16) попробуйте localhost/ убрать из латинского пути
19 — 17.07.18 — 13:17
пробовала как в (5), не получается
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);
и не парить себе мозг…
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)», я просто перевёл.
А во-вторых, я и так знаю, что ошибся
)
Здравствуйте! еще раз спасибо за помощь)
Скажите пожалуйста, есть ли команда которая копирует не только значение, а вообще все что имеется в ячейках как например в стандартных функциях 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
Имеются ввиду «Сохраненные варианты отчета».