Warning - untested code follows! :-)
My usual approach when trying to find out how to automate something I am unfamiliar with in Excel is to record a macro, and I'm afraid that what I did confirmed my expectations. A picture is not related to a cell, but to a sheet. Therefore, all your references to cells, and your attempt to position the pictures relative to cells, are doomed to failure. You will probably have realised that your line
$excel -> ActiveSheet -> Pictures -> Insert($image_file_full); # Insert in active cell makes no reference to the active cell, only the active sheet. However, I believe, based on other peoples' files including pictures that I have worked on, that inserting and deleting rows and columns will move and resize pictures.
Anyway, I recorded a macro and put two pictures into a sheet. The first thing that happened was, as you described, that the pictures went one on top of the other. So I dragged one of them down. The resulting VBA macro was:
ActiveSheet.Pictures.Insert( _
"C:\Documents and Settings\All Users\Documents\My Pictures\Sam
+ple Pictures\Blue hills.jpg" _
).Select
ActiveSheet.Pictures.Insert( _
"C:\Documents and Settings\All Users\Documents\My Pictures\Sam
+ple Pictures\Sunset.jpg" _
).Select
Selection.ShapeRange.IncrementTop 290.25
Although VBA litters recorded macros with "Activate" and "Select", it's usually bad practice to let these leak into production code, as they slow the system down without doing anything useful. It's OK to use them to get the user where you want him when you finish, and there are certain situations where they can't be avoided. But if I were trying to put two pictures into an Excel sheet, my VBA would look like the following
untested code:
Dim picCurrent As Picture
Dim shtPics As Worksheet
Set shtPics = ThisWorkbook.Sheets(1)
Const ksPic1 As String = "C:\Documents and Settings\All Users\Document
+s\My Pictures\Sample Pictures\Blue hills.jpg"
Const ksPic2 As String = "C:\Documents and Settings\All Users\Document
+s\My Pictures\Sample Pictures\Sunset.jpg"
Set picCurrent = shtPics.Pictures.Insert(ksPic1)
Set picCurrent = shtPics.Pictures.Insert(ksPic2)
picCurrent.Top = 130
picCurrent.Left = 280
From this, my first pass at Perl would be:
use strict;
use warnings;
use diagnostics;
use Win32::OLE;
my $xl = Win32::OLE->new('Excel.Application');
$xl->{Visible} = 1;
my $wb = $xl->ActiveWorkbook;
my $shtPics = $wb->Sheets(1);
my $picCurrent = $shtPics->Pictures->Insert(first pic);
$picCurrent = $shtPics->Pictures->Insert(second pic);
$picCurrent->Top = 130;
$picCurrent->Left = 280;
... and then I would start debugging.
HTH,
John Davies