Вставка изображений в ячейки таблицы writer

Автор 777sasa, 19 апреля 2016, 23:05

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

777sasa

Как в Cell вставить изображение из файла.
Имеется шаблон, в нем таблица, в 3 ячейки которой необходимо вставлять фото. Фото находятся в папке (наименование населенного пункта). К сожалению фото переименованы - сначала крупный план потом боковые - это не проблема можно и переделать. На каждый нас. пункт порядка 10 опознаков.
Для упрощения - папку с файлами и имена фото можно сделать фиксироваными.

JohnSUN

Добро пожаловать на форум,  777sasa!
Красивый документ, аккуратный. Но совершенно не понятный.
Судя по тому, что вопрос в разделе Basic, ты думаешь о макросе, который всё сделает в полуавтоматическом режиме.
Судя по описанию задачи, для каждого населённого пункта есть папка с фотографиями и (желательно) там же документ с этими же изображениями и осмысленными подписями к ним.
А вот дальше - не совсем понятно. Что будет с этим документом потом, когда фотки встанут на нужные места и подписи будут соответствовать изображениям? Напечатать несколько экземпляров и забыть? Отправить клиенту-начальству-в архив? В формате ODF или лучше в PDF?

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

777sasa

#2
Цитировать
Sub Main
Dim Doc As Object
Dim TextTables As Object
Dim Table As Object
Dim CellNames
Dim Cell As Object
Dim CellCursor As Object
Dim I As Integer



Dim J As Integer

Doc = StarDesktop.CurrentComponent
TextTables = Doc.getTextTables()

Table = TextTables(0)
CellNames = Table.getCellNames()

Rows = Table.getRows
Cols = Table.getColumns
For RowIndex = 1 To Rows.getCount()
For ColIndex = 1 To Cols.getCount()
CellName = Chr(64 + ColIndex) & RowIndex
Cell = Table.getCellByName(CellName)
Cell.String = "row: " & CStr(RowIndex) + ", column: " & CStr(ColIndex)
Next
Next
Cell.String = "row: " & CStr(RowIndex) + ", column: " & CStr(ColIndex) - данная строка вставляет в ячейку таблицы writer текст. Тоже самое только только изображение из графического файлf
Я не программист. К старому офису была какая то  ли примочка или отдельная прога позволяющая узнать все свойства сеты геты объекта, предков и потомков.
Есть только папки (названия сёл) с графическими файлами. В каждой папке примерно по 30 файлов (кратное 3). В каждой папке имена файлов начинаются с 1. Имена файлов 1.jpg, 1_1.jpg, 1_2.jpg, 2.jpg, 2_1.jpg, 2_2.jpg и так далее.  С нижним подчеркиванием - два фото с сторон, просто цифра в имени - фото сверху. Другими словами каждый опознак описывается тремя графическими файлами. Необходимо на каждый опознак создать текстовый документ как в примере. Имя текстового документа = имя папки+имя фото сверху без расширения.
На данный момент минимум что нужно как вставить изображение из графического файла в ячейку таблицы.
Зы
Слитые ячейки некорректно отрабатывает, так что табличка будет 4х4.
Что бы меньше морочиться что в какую ячейку можно файлы фото сверху переименовать в n_3.jpg или вогобще все файлы в папках 1,2,..n.jpg



JohnSUN

Вообще-то, их было две - Xray tool и MRI. Вторая не только позволяет смотреть свойства и методы, но и фрагменты программы за тебя пишет.
Цитата: 777sasa от 20 апреля 2016, 20:32
Cell.String = "row: " & CStr(RowIndex) + ", column: " & CStr(ColIndex) - данная строка вставляет в ячейку таблицы writer текст. Тоже самое только только изображение из графического файла
Это-то понятно и без пояснений... Я про вставку самого изображения: есть как минимум два разных способа - результат внешне ничем не отличается.
Один вариант - "всосать" графический файл в документ. Сам документ вырастет в размере, но даже если ты его отправишь, например, по почте, все равно будет содержать эту фотографию.
Второй вариант - вставить связь. В документ вставится только короткая текстовая ссылка на папку и имя файла с картинкой. Соответственно, размер файла почти не увеличится. Но если его оторвать от первоначального расположения - картинки пропадут...

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

777sasa

 "всосать" графический файл в документ

JohnSUN

А, понятно.
Тогда последовательность действий такая:
С помощью .drawing.BitmapTable вставляешь изображение из внешнего файла в документ - при этом изображение нигде не отображается, просто в теле документа в папке \Pictures создается копия картинки с каким-то диковатым именем типа 10000000000000DC000000B508F56592.bmp. Тебе об этом заботиться не надо, офис сам включает все нужные механизмы - графические фильтры, доступ к файлу и его чтение, создание нового имени для внедренного изображения и всё такое... В бэйсике это может выглядеть приблизительно так:
REM Внедрить графическое изображение в тело документа
REM (Загрузить рисунок из файла в текущий документ)
REM Возвращает строку - новый URL изображения
Function LoadGraphicIntoDocument(oDoc As Variant, path As String, fileName As String) As String
Dim oBitmaps As Object
oBitmaps = oDoc.createInstance( "com.sun.star.drawing.BitmapTable" )
If Not oBitmaps.hasByName(fileName) Then oBitmaps.insertByName(fileName, ConvertToURL (path & fileName))
LoadGraphicIntoDocument = oBitmaps.getByName( fileName )
End Function

В результате получим строку - ссылку на внутренний файл. Это будет что-то вроде "vnd.sun.star.GraphicObject:1000000000000064000000648E59A0AB"
А уже потом, когда картинка стала частью документа, создаёшь экземпляр изображения ,text.GraphicObject, в качестве его свойства GraphicURL указываешь внутренний URL картинки, задаешь другие нужные параметры (высота, ширина, привязку и т.п.),  находишь в тексте документа подходящее место (например, текст в ячейке таблицы), тычешь в него курсором и выполняешь insertTextContent.
Как-то так:
Sub insPictToB2
Dim oDoc As Variant
Dim oTextTable As Variant
Dim oCellByName As Variant
Dim oText As Variant
Dim oCursor As Variant
Dim oImage As Variant
Dim s As String
oDoc = ThisComponent
s = LoadGraphicIntoDocument(oDoc, "D:\Test\", "temp_picture.bmp")
oImage = oDoc.createInstance("com.sun.star.text.GraphicObject")
With oImage
.GraphicURL = s
.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
.Width = 4000
.Height = 3000
End With
REM И вставляем этот графический объект в ячейку таблицы
oTextTable = oDoc.getTextTables().getByIndex(0)
oCellByName = oTextTable.getCellByName("B2")
oText = oCellByName.getText()
oCursor = oText.createTextCursor()
oCursor.goToEnd(FALSE) ' Перепрыгнуть в конец уже имеющегося в ячейке текста
oText.insertTextContent( oCursor, oImage, False )
End Sub

Имея этот URL можешь отобразить одну и ту же картинку в разных местах документа много раз, с самыми разными размерами, но само изображение будет храниться внутри документа одно.

В варианте "не всасывать" почти всё то же самое, но без предварительного внедрения картинки в документ - просто для GraphicObject укажешь
.GraphicURL = ConvertToURL("Диск:\Путь\Имя.расширение")
и офис создаст связь с файлом на диске (можно посмотреть в Правка-Связи). Хотя внешне картинки ничем отличаться не будут
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне