Картинка из ссылки

Автор TroYReall, 24 ноября 2011, 17:28

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

TroYReall

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

TroYReall

Цитата: Клио от 24 ноября 2011, 23:31
Вот такой макрос заменит все ссылки на 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

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

TroYReall

думаю переехать на Lbo но сейчас пользуюсь только OOo

JohnSUN

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

Рыбка Рио

Смотроите, вот в этом варианте есть управление выстотой строк с картинками и проверка на существование файлов 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

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

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

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

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

Рыбка Рио

Цитата: JohnSUN от 25 ноября 2011, 15:33Попробуй все-таки установить 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

Рыбка Рио

#23
Цитата: JohnSUN от 25 ноября 2011, 15:33Я тут попробовал менять размеры строк уже после вставки картинки - перерисовывает нормально, с пересчитанными размерами. То есть растягивает вплоть до заданных изначально или сжимает до минимума (не знаю как в ООо, не пробовал). Отсюда идея - не играться с пересчетом высоты-ширины, вставлять как есть, с родным размером, а расползшуюся ячейку тут же обжимать до старых величин. Во-первых, текст макроса сократится, а во-вторых, почему мы должны за Калк что-то вычислять, пусть сам трудится!
Можете пример привести? Чего-то я не понимаю.
ubuntu 12.04 + LibO3.6.0

JohnSUN

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

(Опять иллюстрация больше по размеру, чем сама программа  :o )
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Рыбка Рио

Цитата: JohnSUN от 26 ноября 2011, 20:33Ну, я имел в виду приблизительно такое...
Спасибо, теперь понятно.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

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

[вложение удалено Администратором]
[вложение восстановлено Доброжелателем]
ubuntu 12.04 + LibO3.6.0

JohnSUN

Да, интересная задачка была... Спасибо, TroYReall, развлёк!   :beer:
Цитата: TroYReall от 24 ноября 2011, 17:28...строк очень много больше 400 отработать в ручную очень проблематично...
Совместными усилиями кода где-то столько же и накидали - строк 400  ;D
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

neft

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

JohnSUN

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

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

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

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