Мне нужно вставить изображения в файл «Calc» с помощью Open Office. Код из ответа на этот вопрос с небольшими изменениями прекрасно работает с открытыми текстовыми документами, поэтому я решил улучшить его для файлов Calc, но не удалось - назначение Graphic.GraphicURL
вызывает ошибку OLE. Как это исправить?
procedure InsertImage2;
var
OleApp, Desktop, OpenParams, SaveParams, Document, Bitmaps, Sheet: Variant;
SearchDescriptor, TextCursor, Graphic, Found: Variant;
cb: integer;
sSourceFile, sDestFile, sImageFile, sImageName, sLocationWord: string;
begin
sSourceFile := 'file:///c:/test.ods';
sDestFile := 'file:///c:/test2.ods';
sImageFile := 'file:///c:/stamp.png';
sImageName := 'Image1';
sLocationWord := '[stamp]';
OleApp := CreateOleObject('com.sun.star.ServiceManager');
Desktop := OleApp.CreateInstance('com.sun.star.frame.Desktop');
OpenParams := VarArrayCreate([0, -1], varVariant);
Document := Desktop.LoadComponentFromURL(sSourceFile, '_blank', 0, OpenParams);
Bitmaps := Document.CreateInstance('com.sun.star.drawing.BitmapTable');
Bitmaps.insertByName(sImageName, sImageFile);
if Document.supportsService('com.sun.star.sheet.SpreadsheetDocument') then
begin
for cb := 0 to Document.Sheets.Count - 1 do
begin
Sheet := Document.Sheets.getByIndex(cb);
SearchDescriptor := Sheet.createSearchDescriptor;
SearchDescriptor.setSearchString(sLocationWord);
Found := Sheet.findFirst(SearchDescriptor);
While not VarIsClear(Found) do
begin
TextCursor := Found.GetText.createTextCursor;
TextCursor.gotoRange(Found, False);
Graphic := Document.CreateInstance('com.sun.star.text.GraphicObject');
Graphic.GraphicURL := Bitmaps.getByName(sImageName); //error "Variant does not reference an automation object"
Graphic.AnchorType := 1;
Graphic.Width := 6000;
Graphic.Height := 6000;
Found.GetText.insertTextContent(TextCursor, Graphic, True);
Found := Sheet.findNext(Found.End, SearchDescriptor);
end;
SearchDescriptor := Unassigned;
TextCursor := Unassigned;
Found := Unassigned;
Graphic := Unassigned;
end;
SaveParams := VarArrayCreate([0, -1], varVariant);
Document.StoreAsURL(sDestFile, SaveParams);
end;
Document.Close(True);
Bitmaps := Unassigned;
OpenParams := Unassigned;
SaveParams := Unassigned;
Document := Unassigned;
end;