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

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

20 Октябрь 2017, 13:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 »   Вниз
  Печать  
Автор Тема: Картинка из ссылки  (Прочитано 13065 раз)
0 Пользователей и 1 Гость смотрят эту тему.
TroYReall
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #15: 25 Ноябрь 2011, 09:56 »

да, компания действительно приятная Улыбка в целом курс понятен не думаю что в дальнейшем при каких то изменениях будут проблемы. но теперь наверняка знаю кто тут ГУРУ
еще раз товарищи ОГРОМНОЕ спасибо.
Записан
TroYReall
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #16: 25 Ноябрь 2011, 11:39 »

Вот такой макрос заменит все ссылки на png, jpg, gif на картинки.

REM*****BASIC*****

Sub Main
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   
   SD = oSheet.createSearchDescriptor()
   SD.SearchRegularExpression = TRUE
   SD.SearchCaseSensitive = FALSE
   SD.SearchString = "jpg|gif|png"
   Results = oSheet.findAll(SD)
   Dim Props(0) as new com.sun.star.beans.PropertyValue
   Props(0).Name= "URL"
   Dim Size as new com.sun.star.awt.Size
   oProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
      
   For i=0 to Results.Count-1
      NameOfCell = Results(i).AbsoluteName
      Cell = oSheet.getCellRangeByName(NameOfCell)
      If Cell.supportsService("com.sun.star.table.Cell") then 'тогда это ячейка, а иначе это диапазон ячеек
         oShape = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
         oSheet.DrawPage.add(oShape)
         Props(0).Value = Results(i).String
         'print Results(i).String
         oShape.Graphic = oProvider.queryGraphic(Props())
         'GlobalScope.BasicLibraries.loadLibrary("MRILib")
         w = oShape.Size.Width
         h = oShape.Size.Height
         wcl = Cell.Size.Width
         hcl = Cell.Size.Height

         Size.Width = wcl
         Size.Height = h*wcl/w
         If Size.Height > hcl then
            Size.Width = hcl*w/h
            Size.Height = hcl
         Endif
         oShape.setSize(Size)
         oShape.setPosition(Cell.Position)
         erase oShape
      Else
         'mri Cell
         r = Cell.Rows.Count-1
         c = Cell.Columns.Count-1
         For i=0 to r
         For j=0 to c
            oShape = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
            oSheet.DrawPage.add(oShape)
            Cellij = Cell.getCellByPosition(j,i)
            Props(0).Value = Cellij.String
            'print Cellij.String
            oShape.Graphic = oProvider.queryGraphic(Props())
            w = oShape.Size.Width
            h = oShape.Size.Height
            wcl = Cellij.Size.Width
            hcl = Cellij.Size.Height
   
            Size.Width = wcl
            Size.Height = h*wcl/w
            If Size.Height > hcl then
               Size.Width = hcl*w/h
               Size.Height = hcl
            Endif
            oShape.setSize(Size)
            oShape.setPosition(Cellij.Position)
            erase oShape
         Next
         Next
      Endif
   Next
End Sub


Тестовый файл:


ну вот вопросик, Улыбка а как в данном варианте управлять размерами картинки ?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #17: 25 Ноябрь 2011, 12:53 »

Ну, как вариант, сразу задать подходящие ширину колонки и высоту строк.
Можно, конечно, и макрос допилить... Ну, там, всякие дополнительные параметры для картинки выставить. Типа, размеры менять пропорционально, привязать к ячейке как символ... Или жестко задать, как я это сделал, размер "почтовой марки", 2х3, да и не париться....
У тебя, кстати, офис какой?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
TroYReall
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #18: 25 Ноябрь 2011, 13:00 »

думаю переехать на Lbo но сейчас пользуюсь только OOo
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #19: 25 Ноябрь 2011, 13:08 »

Стоит переехать... Ну, или использовать и тот и другой по очереди.
Помнишь этот момент, что мы с neft'ом нарыли? Не устанавливалось свойство "гиперссылка" под ООо. LO это умеет делать и получается действительно прикольно - картинки в книге махонькие, но если кликнуть на неё, то тут же в браузере видишь её в полный рост
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Рыбка Рио
Ветеран
*****
Offline Offline

Сообщений: 1 678


« Ответ #20: 25 Ноябрь 2011, 13:11 »

Смотроите, вот в этом варианте есть управление выстотой строк с картинками и проверка на существование файлов jpg, gif, png:

REM*****BASIC*****

Sub Main
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   
   SD = oSheet.createSearchDescriptor()
   SD.SearchRegularExpression = TRUE
   SD.SearchCaseSensitive = FALSE
   SD.SearchString = "jpg|gif|png"
   Results = oSheet.findAll(SD)
   Dim Props(0) as new com.sun.star.beans.PropertyValue
   Props(0).Name= "URL"
   Dim Size as new com.sun.star.awt.Size
   oProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
   oFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
      
   For i=0 to Results.Count-1
      NameOfCell = Results(i).AbsoluteName
      Cell = oSheet.getCellRangeByName(NameOfCell)
      If Cell.supportsService("com.sun.star.table.Cell") then 'тогда это ячейка, а иначе это диапазон ячеек
         If oFileAccess.exists(Results(i).String) then
            oShape = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
            oSheet.DrawPage.add(oShape)
            Props(0).Value = Results(i).String
            'Results(i).String=""
            oShape.Graphic = oProvider.queryGraphic(Props())
            oShape.Name = Results(i).AbsoluteName + "##" + Props(0).Value
            'GlobalScope.BasicLibraries.loadLibrary("MRILib")
            w = oShape.Size.Width
            h = oShape.Size.Height
            wcl = Cell.Size.Width
            hcl = Cell.Size.Height
   
            Size.Width = wcl
            Size.Height = h*wcl/w
            If Size.Height > hcl then
               Size.Width = hcl*w/h
               Size.Height = hcl
            Endif
            oShape.setSize(Size)
            oShape.setPosition(Cell.Position)
            erase oShape
         Endif
      Else
         'mri Cell
         r = Cell.Rows.Count-1
         c = Cell.Columns.Count-1
         For i=0 to r
         For j=0 to c
            Cellij = Cell.getCellByPosition(j,i)
            If oFileAccess.exists(Cellij.String) then
               oShape = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
               oSheet.DrawPage.add(oShape)
               Props(0).Value = Cellij.String
               'Cellij.String=""
               oShape.Graphic = oProvider.queryGraphic(Props())
               oShape.Name = Cellij.AbsoluteName + "##" + Props(0).Value
               w = oShape.Size.Width
               h = oShape.Size.Height
               wcl = Cellij.Size.Width
               hcl = Cellij.Size.Height
   
               Size.Width = wcl
               Size.Height = h*wcl/w
               If Size.Height > hcl then
                  Size.Width = hcl*w/h
                  Size.Height = hcl
               Endif
               oShape.setSize(Size)
               oShape.setPosition(Cellij.Position)
               erase oShape
            Endif
         Next
         Next
      Endif
   Next
End Sub

Sub UpdateImages
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   Images = oSheet.DrawPage
   Dim Size as new com.sun.star.awt.Size
   For i=0 to Images.Count-1
      If Images(i).supportsService("com.sun.star.drawing.GraphicObjectShape") then
         Parameters = Split(Images(i).Name,"##")
         If ubound(Parameters)=1 then
            CellName = Parameters(0)
            'ImageURL = Parameters(1)
            Cell = oSheet.getCellRangeByName(CellName)
            Images(i).Position = Cell.Position
            w = Images(i).Size.Width
            h = Images(i).Size.Height
            wcl = Cell.Size.Width
            hcl = Cell.Size.Height
            Size.Height = h*wcl/w
            If Size.Height > hcl then
               Size.Width = hcl*w/h
               Size.Height = hcl
            Else
               Size.Width = wcl
            Endif
            Images(i).Size = Size
         Endif
      Endif
   Next
End Sub

Sub IncreaseCells
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   Images = oSheet.DrawPage
   For i=0 to Images.Count-1
      If Images(i).supportsService("com.sun.star.drawing.GraphicObjectShape") then
         Parameters = Split(Images(i).Name,"##")
         If ubound(Parameters)=1 then
            CellName = Parameters(0)
            'ImageURL = Parameters(1)
            Cell = oSheet.getCellRangeByName(CellName)
            Cell.Rows.Height = Cell.Rows.Height*1.1
         Endif
      Endif
   Next
End Sub


Тестовый файл:

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

ubuntu 12.04 + LibO3.6.0
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #21: 25 Ноябрь 2011, 15:33 »

Как говорила Алиса: "Всё чудесатее и чудесатее!"

Попробуй все-таки установить oShape'у свойство Anchor в значение Cell (ну, или в Cellij, если диапазон обрабатываем). Это должно привязать картинку к верхнему левому углу ячейки (по умолчанию). Тогда при изменении размеров строк/столбцов картинки не должны съезжать... Опять же, не придется в имя эти координаты заталкивать.

И остается нерешенной проблема дублей. Желательно, наверное, все-таки не всасывать имеющуюся картинку... Или всасывать и заменять... А то ведь распухает книга при каждом запуске макроса. Но ориентироваться на имя - смысла нет, имена могут и дублироваться. Да и ссылки бывают разные, одно и то же изображение можно по разным путям найти...

Я тут попробовал менять размеры строк уже после вставки картинки - перерисовывает нормально, с пересчитанными размерами. То есть растягивает вплоть до заданных изначально или сжимает до минимума (не знаю как в ООо, не пробовал). Отсюда идея - не играться с пересчетом высоты-ширины, вставлять как есть, с родным размером, а расползшуюся ячейку тут же обжимать до старых величин. Во-первых, текст макроса сократится, а во-вторых, почему мы должны за Калк что-то вычислять, пусть сам трудится!
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Рыбка Рио
Ветеран
*****
Offline Offline

Сообщений: 1 678


« Ответ #22: 25 Ноябрь 2011, 22:55 »

Попробуй все-таки установить oShape'у свойство Anchor в значение Cell (ну, или в Cellij, если диапазон обрабатываем). Это должно привязать картинку к верхнему левому углу ячейки (по умолчанию).
Ага, так лучше.

REM*****BASIC*****

Sub Main
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   
   SD = oSheet.createSearchDescriptor()
   SD.SearchRegularExpression = TRUE
   SD.SearchCaseSensitive = FALSE
   SD.SearchString = "jpg|gif|png"
   Results = oSheet.findAll(SD)
   Dim Props(0) as new com.sun.star.beans.PropertyValue
   Props(0).Name= "URL"
   Dim Size as new com.sun.star.awt.Size
   oProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
   oFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
      
   For i=0 to Results.Count-1
      NameOfCell = Results(i).AbsoluteName
      Cell = oSheet.getCellRangeByName(NameOfCell)
      If Cell.supportsService("com.sun.star.table.Cell") then 'тогда это ячейка, а иначе это диапазон ячеек
         If oFileAccess.exists(Results(i).String) then
            oShape = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
            oSheet.DrawPage.add(oShape)
            Props(0).Value = Results(i).String
            Results(i).String=""
            oShape.Graphic = oProvider.queryGraphic(Props())
            oShape.Name = Results(i).AbsoluteName + "##" + Props(0).Value
            oShape.Anchor = Results(i)
            'GlobalScope.BasicLibraries.loadLibrary("MRILib")
            w = oShape.Size.Width
            h = oShape.Size.Height
            wcl = Cell.Size.Width
            hcl = Cell.Size.Height
   
            Size.Width = wcl
            Size.Height = h*wcl/w
            If Size.Height > hcl then
               Size.Width = hcl*w/h
               Size.Height = hcl
            Endif
            oShape.setSize(Size)
            'oShape.setPosition(Cell.Position)
            erase oShape
         Endif
      Else
         'mri Cell
         r = Cell.Rows.Count-1
         c = Cell.Columns.Count-1
         For i=0 to r
         For j=0 to c
            Cellij = Cell.getCellByPosition(j,i)
            If oFileAccess.exists(Cellij.String) then
               oShape = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
               oSheet.DrawPage.add(oShape)
               Props(0).Value = Cellij.String
               Cellij.String=""
               oShape.Graphic = oProvider.queryGraphic(Props())
               oShape.Name = Cellij.AbsoluteName + "##" + Props(0).Value
               oShape.Anchor = Cellij
               w = oShape.Size.Width
               h = oShape.Size.Height
               wcl = Cellij.Size.Width
               hcl = Cellij.Size.Height
   
               Size.Width = wcl
               Size.Height = h*wcl/w
               If Size.Height > hcl then
                  Size.Width = hcl*w/h
                  Size.Height = hcl
               Endif
               oShape.setSize(Size)
               'oShape.setPosition(Cellij.Position)
               erase oShape
            Endif
         Next
         Next
      Endif
   Next
End Sub

Sub UpdateImages
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   Images = oSheet.DrawPage
   Dim Size as new com.sun.star.awt.Size
   For i=0 to Images.Count-1
      If Images(i).supportsService("com.sun.star.drawing.GraphicObjectShape") then
         Parameters = Split(Images(i).Name,"##")
         If ubound(Parameters)=1 then
            'CellName = Parameters(0)
            'ImageURL = Parameters(1)
            Cell = Images(i).Anchor 'oSheet.getCellRangeByName(CellName)
            'Images(i).Position = Cell.Position
            w = Images(i).Size.Width
            h = Images(i).Size.Height
            wcl = Cell.Size.Width
            hcl = Cell.Size.Height
            Size.Height = h*wcl/w
            If Size.Height > hcl then
               Size.Width = hcl*w/h
               Size.Height = hcl
            Else
               Size.Width = wcl
            Endif
            Images(i).Size = Size
         Endif
      Endif
   Next
End Sub

Sub IncreaseCells
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   Images = oSheet.DrawPage
   For i=0 to Images.Count-1
      If Images(i).supportsService("com.sun.star.drawing.GraphicObjectShape") then
         Parameters = Split(Images(i).Name,"##")
         If ubound(Parameters)=1 then
            'CellName = Parameters(0)
            'ImageURL = Parameters(1)
            Cell = Images(i).Anchor'oSheet.getCellRangeByName(CellName)
            Cell.Rows.Height = Cell.Rows.Height*1.1
         Endif
      Endif
   Next
End Sub

Sub RestoreLinks
   oDoc = ThisComponent
   oSheet = oDoc.CurrentController.ActiveSheet
   Images = oSheet.DrawPage
   ic = Images.Count-1
   For i=ic to 0 step -1
      If Images(i).supportsService("com.sun.star.drawing.GraphicObjectShape") then
         Parameters = Split(Images(i).Name,"##")
         If ubound(Parameters)=1 then
            'CellName = Parameters(0)
            ImageURL = Parameters(1)
            Cell = Images(i).Anchor 'oSheet.getCellRangeByName(CellName)
            Cell.String = ImageURL
            Images(i).dispose()
         Endif
      Endif
   Next
End Sub


Тестовый файл:

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

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Ветеран
*****
Offline Offline

Сообщений: 1 678


« Ответ #23: 25 Ноябрь 2011, 23:02 »

Я тут попробовал менять размеры строк уже после вставки картинки - перерисовывает нормально, с пересчитанными размерами. То есть растягивает вплоть до заданных изначально или сжимает до минимума (не знаю как в ООо, не пробовал). Отсюда идея - не играться с пересчетом высоты-ширины, вставлять как есть, с родным размером, а расползшуюся ячейку тут же обжимать до старых величин. Во-первых, текст макроса сократится, а во-вторых, почему мы должны за Калк что-то вычислять, пусть сам трудится!
Можете пример привести? Чего-то я не понимаю.
« Последнее редактирование: 25 Ноябрь 2011, 23:05 от Клио » Записан

ubuntu 12.04 + LibO3.6.0
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #24: 26 Ноябрь 2011, 20:33 »

Ну, я имел в виду приблизительно такое...

(Опять иллюстрация больше по размеру, чем сама программа  Шокирован )


* Размеры картинок.gif (119.04 Кб, 436x437 - просмотрено 11 раз.)
« Последнее редактирование: 1 Март 2017, 15:18 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Рыбка Рио
Ветеран
*****
Offline Offline

Сообщений: 1 678


« Ответ #25: 26 Ноябрь 2011, 22:04 »

Ну, я имел в виду приблизительно такое...
Спасибо, теперь понятно.
Записан

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Ветеран
*****
Offline Offline

Сообщений: 1 678


« Ответ #26: 27 Ноябрь 2011, 19:26 »

Вот вариант в виде расширения. Ярлыки находятся в меню Сервис/Дополнения/Ссылки в картинки в Calc. Этот вариант чуть-чуть доработанный (добавлен индикатор выполнения), но без привязки размера картинок к ячейкам. Для того чтобы подогнать картинки под размеры ячеек - нужно использовать отдельный пункт меню.

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

* replacelinkswithimages-0.1.5.oxt (8.68 Кб - загружено 6 раз.)
« Последнее редактирование: 19 Январь 2017, 19:11 от JohnSUN » Записан

ubuntu 12.04 + LibO3.6.0
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #27: 27 Ноябрь 2011, 19:38 »

Да, интересная задачка была... Спасибо, TroYReall, развлёк!   Всё хорошо
...строк очень много больше 400 отработать в ручную очень проблематично...
Совместными усилиями кода где-то столько же и накидали - строк 400  Смеющийся
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
neft
Постоялец
***
Offline Offline

Сообщений: 189


« Ответ #28: 27 Ноябрь 2011, 20:36 »

Да уж, (макро)писатели, Лев Толстой отдыхает.
"За деревьями не видно леса."
А простенький пример (саму соль идеи) можно?
В A1 ссылка, в B1 вставить картинку.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #29: 27 Ноябрь 2011, 21:00 »

Давно отдыхает... Говорят, всю жизнь шутил: "А я про женщин ТАКОЕ знаю!.. Но никому не скажу... Опасаюсь. Вот помирать буду - тогда, может, и скажу. И сразу крышкой - хлоп! - поди меня достань..." Так и не сказал никому.

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

Вставка изображений в ODF делается в два этапа: на первом шаге изображение импортируется в тело документа (в папку Pictures - её можно увидеть "раззиповав" готовый документ). При этом файл получает новое имя (по нему теперь можно будет это изображение получить) и новый адрес - что-нибудь вроде "Pictures\10000000000001F4000001F409587416.jpg". На втором шаге ссылка уже на этот элемент размещается на страницах документа, оформляется размером, положением, привязкой и другими атрибутами.
Если создать изображение и в качестве его источника указать первоначальную ссылку, то картинка в документе будет видна. Но только до тех пор, пока файлы лежат на тех же местах. Сам документ получается гораздо меньше по размеру, но "не транспортабельный".
В моих макросах оба эти шага выписаны явно.
Клио использует другой подход: при использовании GraphicProvider оба эти шага для программиста сливаются в один, провайдер выполняет все необходимые действия по импорту и вставке изображения, остается только оформить результат.
Подробности реализации - в коде и в комментариях к нему. Скачивай, открывай, читай...

« Последнее редактирование: 27 Ноябрь 2011, 21:04 от JohnSUN » Записан

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

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