Как использовать OpenOffice Spreadsheet для получения изображения из файла Excel

У меня есть код, который экспортирует изображение из Excel в изображение, и вот оно.

 Dim appExcel As Object



        Set appExcel = CreateObject("Excel.Application")
        appExcel.Visible = False
        Dim xlsBook  As New excel.Workbook
        Dim xlsSheet As New excel.Worksheet

        Dim rowlocation As Integer
        Dim columnlocation As Integer
        Dim celladdress As String



        Set xlsBook = appExcel.Workbooks.Open(Text1.Text)
        Set xlsSheet = xlsBook.Worksheets("Sheet1")
     Dim x As excel.Shapes



        For Each x In xlsSheet.Shapes
            x.Copy
            Picture1.Picture = Clipboard.GetData(vbCFBitmap)
            Text2.Text = x.Name
            rowlocation = x.TopLeftCell.Row
            columnlocation = x.TopLeftCell.Column
            celladdress = xlsSheet.Cells(x.BottomRightCell.Row + 1, x.TopLeftCell.Column).Address(RowAbsolute:=False, ColumnAbsolute:=False)
            MsgBox ActiveSheet.Range(celladdress)
        Next

    End If

и, к сожалению, этот код не будет работать на ПК моих друзей, потому что у него не установлен Excel, но у него есть электронная таблица OpenOffice. Я попытался открыть Excel в OpenOffice, затем файл открывается, теперь моя цель - как я могу преобразовать приведенный выше код в OpenOffice? Я имею в виду запуск кода для файлов OpenOffice.

Это мой код, но он не работает

   Dim objServiceManager As Object
    Dim objDesktop        As Object
    Dim objDocument       As Object
    Dim objText           As Object
    Dim objCursor         As Object
    Dim oDoc              As Object
    Dim ARG()
    Dim oGraph    As Object
    Dim oView     As Object
    Dim oDrawPage As Object
    Dim oSheet    As Object
    Dim Image     As System_Drawing.Image
    Dim oimage As Object
    Dim osize As Object

    Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
    Set oDoc = objDesktop.loadComponentFromURL("file:///C:\Users\paul\Desktop\Testing.ods", "_blank", 0, ARG())
    Set oSheet = oDoc.getSheets().getByIndex(0)
    Set oGraph = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
    Set oView = oDoc.CurrentController
    Set oDrawPage = oView.getActiveSheet.DrawPage


    For i = 0 To 2
        For j = 0 To 9
           ' Form1.Image1.Picture = Clipboard.GetData

            Form1.Image1.Picture = LoadPicture(oDrawPage)
        Next
    Next

TYSM для будущей помощи

Это последний код в VB6, и в нем есть ошибка, говорящая о том, что vnd.sun.star отсутствует.

 Dim objServiceManager As Object
    Dim objDesktop        As Object
    Dim objDocument       As Object
    Dim objText           As Object
    Dim objCursor         As Object
    Dim oDoc              As Object
    Dim ARG()
    Dim oGraph      As Object
    Dim oView       As Object
    Dim oDrawPage   As Object
    Dim oSheet      As Object
    Dim Image       As System_Drawing.Image
    Dim oimage      As Object
    Dim osize       As Object
    Dim Cell        As Object
    Dim sGraphicUrl As String
    Dim oDisp
   Dim oFrame
    Dim opos        As Object



    Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
    Set osize = objServiceManager.Bridge_GetStruct("com.sun.star.awt.Size")
    Set opos = objServiceManager.Bridge_GetStruct("com.sun.star.awt.Point")
    Set oDoc = objDesktop.loadComponentFromURL("file:///C:\Users\paul\Desktop\ACE Express - Fairview_Sample PC of Gondola.ods", "_blank", 0, ARG())
    Set oSheet = oDoc.getSheets().getByIndex(0)
    Set oimage = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
    Set oView = oDoc.CurrentController
    Set oDrawPage = oView.getActiveSheet.DrawPage
    Set oimage = oDrawPage.getByIndex(0)
    Image1.Picture = LoadPicture(oimage.GraphicURL)

Вот результат разархивированного изображения

введите здесь описание изображения


person Shadow Fiend    schedule 02.12.2016    source источник
comment
Подробнее этот вопрос задается здесь: stackoverflow.com/questions/40927324/.   -  person Jim K    schedule 05.12.2016
comment
Некоторые из этих вопросов также задаются здесь: .com/questions/40986697/.   -  person Jim K    schedule 06.12.2016
comment
Да, сэр, это я, сэр. Пожалуйста, помогите мне преобразовать это в VB6 :( TYSM за помощью.   -  person Shadow Fiend    schedule 06.12.2016


Ответы (2)


Я не знаю точно, что делает ваш код, потому что обычно я не использую Microsoft Office. Однако похоже, что эту задачу можно выполнить с помощью OpenOffice Basic. Одним из лучших мест для изучения OpenOffice Basic является Макродокумент Эндрю Питоньяка.

Для начала загляните в раздел 5.9.5. Convert all linked images.

ИЗМЕНИТЬ:

Чтобы сделать это в Calc, я сначала перешел к Tools -> Macros -> Organize Dialogs и создал диалоговое окно с именем «ImageViewerForm» с элементом управления изображением с именем «MyImageControl».

Затем я перешел к Tools -> Macros -> Organize Macros -> OpenOffice Basic и добавил следующий код:

Sub ShowImageViewerDialog
    oDoc = ThisComponent
    oDlg = CreateUnoDialog(DialogLibraries.Standard.ImageViewerForm)
    oControl = oDlg.Model.MyImageControl
    oDrawPage = oDoc.getDrawPages().getByIndex(0)
    oImage = oDrawPage.getByIndex(0)
    oControl.ImageURL = oImage.GraphicURL
    oDlg.execute()
End Sub

Чтобы запустить код, перейдите к Tools -> Macros -> Run Macro. Вот результат:

введите здесь описание изображения

Кнопку «Следующее изображение» достаточно просто реализовать, добавив обработчик событий.

Документацию см. в разделе GraphicObjectShape и UnoControlButtonModel. Но в основном я просто использовал инструмент МРТ, чтобы понять это. .

ИЗМЕНИТЬ 2:

Что касается ошибки, которую вы опубликовали, свойство GraphicURL в этом случае представляет собой строку, которая ссылается на объект в памяти, а не на путь к файлу. Здесь показан пример строки: https://www.openoffice.org/api/docs/common/ref/com/sun/star/graphic/XGraphicObject.html.

Поэтому он не подходит для перехода к LoadPicture, который принимает имя файла.

Возможно, вы можете получить фактические данные изображения из oImage.Bitmap или oImage.Graphic. Используйте МРТ, чтобы увидеть, какие атрибуты доступны.

Например, похоже, что есть метод getDIB(), который может работать следующим образом:

Form1.Image1.Picture = oImage.Bitmap.getDIB()

Еще одна идея: вместо использования приложения Office вы можете написать код, который распаковывает файл и считывает каждое изображение в подкаталоге Pictures.

person Jim K    schedule 02.12.2016
comment
Сэр, спасибо за усилия, и я почти наполовину разобрался с этим, теперь моя проблема заключается в том, как получить изображение из электронной таблицы в ящик для изображений? - person Shadow Fiend; 04.12.2016
comment
Господа, где вы это сделали? Вы сделали это на Macro или VB6? - person Shadow Fiend; 06.12.2016
comment
Это то, что мне нужно, сэр, но это должно быть сделано в VB6. - person Shadow Fiend; 06.12.2016
comment
Сэр, основываясь на вашем Edit 2, я получаю сообщение об ошибке Object Required - person Shadow Fiend; 06.12.2016
comment
Сэр, пожалуйста, посмотрите отредактированный пост, и я добавил изображение разархивированного файла, о котором вы говорите, и я надеюсь, сэр, что мы придерживаемся этого формата кода, потому что мы зашли так далеко, и я уверен, что многие новые программисты получат выгоду от этого. TYSM для пациентов и сотрудничества. - person Shadow Fiend; 06.12.2016
comment
Итак, вместо подключения к OpenOffice вы можете использовать эти файлы .jpg в качестве аргументов для LoadPicture? В любом случае да, похоже, что другой подход может быть близок к работе, но я не могу проверить его, чтобы увидеть, что именно нужно. Поэтому вам нужно будет попробовать разные атрибуты, чтобы увидеть, что работает. - person Jim K; 06.12.2016
comment
Если я сделаю это, сэр, все усилия, которые мы приложили, будут потеряны, и, честно говоря, я не знаю, как сделать то, что вы сказали, сделать код, который будет заархивировать / разархивировать файл и переименовать их? на самом деле, сэр, дело в том, что я сделаю это, потому что каждое изображение имеет собственное имя под ними, поэтому следующее, когда мы загружаем изображение в ящик изображения, я сделаю цикл for, чтобы все изображения в электронной таблице были получены, и я также отобразлю там названия под каждым изображением. Сэр, пожалуйста, потерпите меня. - person Shadow Fiend; 06.12.2016
comment
Хорошо, теперь вам решать, будет ли работать один из атрибутов или методов, показанных МРТ или документацией. Установили ли вы инструмент для самоанализа объектов, такой как МРТ? - person Jim K; 06.12.2016
comment
Установить? Вы имеете в виду добавить ссылку, сэр? Нет, сэр, я не делал никакой установки между vb6 и openoffice, я делал только кодирование. - person Shadow Fiend; 06.12.2016
comment
Под установкой я имел в виду загрузку и добавление расширения МРТ по ссылке в моем ответе. Инструмент отображает информацию о методах и атрибутах любого объекта UNO. - person Jim K; 06.12.2016
comment
Хорошо, сэр, я думаю, что это будет последний наш разговор об этом, но я все еще жду вашей помощи в ближайшее время. Я хочу выяснить это не только для себя, но и для других, и, кроме того, сэр, я вижу эту ссылку, которая указывает на мою ошибку в отношении vnd.sun.star похоже, что ошибка - это идентификатор изображения, я надеюсь, что есть способ, который будет получить идентификатор и преобразовать его или получить изображение и отобразить его. в любом случае, сэр, пожалуйста, примите мою награду в знак признательности, но все же, сэр, я не приму это как ответ, и, кстати, сэр, я буду придерживаться этого кода. ТИСМ и извините - person Shadow Fiend; 06.12.2016
comment
Сэр, основываясь на ссылке, моя ошибка объясняется тем, что The numeric portion of the url is formed from UniqueID. As long as at least one instance of XGraphicObject with a particular UniqueID exists, the associated image/graphic is available. - person Shadow Fiend; 06.12.2016

Я никогда не пробовал, но согласно документации вы можете управлять Open Office с помощью COM-автоматизации.

Ваш код VB6 выше управляет Excel через автоматизацию COM. Вы можете установить Open Office на свой компьютер и посмотреть, сможете ли вы автоматизировать Calc из VB6, чтобы открыть электронную таблицу и извлечь изображение. Я не знаю, позволяет ли это. Автоматизация Excel COM очень мощная и позволяет делать почти все, Open Office может быть не таким мощным (я не знаю).

Я бы посоветовал хорошенько подумать, какую проблему вы пытаетесь решить и есть ли совсем другой подход!

person MarkJ    schedule 02.12.2016
comment
На самом деле есть 2 пользователя системы, первый использует excel, они создают формат в excel и отправляют его пользователю 2, но у пользователя 2 есть только openoffice, хорошо, что excel можно открыть в open office, но мой код выше будет работать, если у пользователя 2 будет excel, но они его не используют, моя цель - как я могу преобразовать приведенный выше код, чтобы он мог импортировать excel без установки приложения excel - person Shadow Fiend; 02.12.2016
comment
Вы не можете импортировать Excel, если Excel не установлен. Возможно, вы сможете импортировать Open Office, вот о чем мой ответ. См. ссылку. В качестве альтернативы можно передать изображение или формат от пользователя 1 пользователю 2 без использования файлов Excel. Если у пользователя 2 нет Excel, лучше использовать другой формат. - person MarkJ; 02.12.2016
comment
Сэр, спасибо за усилия, и я почти наполовину разобрался с этим, теперь моя проблема заключается в том, как получить изображение из электронной таблицы в ящик для изображений? - person Shadow Fiend; 04.12.2016