function TINFO_PROJECTDETAIL.GetPicFromExcel(AFileName: string; AJPG: TJPEGImage;
ASheetIndex, ARowIndex, AColumnIndex:Integer): Boolean;
var
objApplication, objWorkBooks: object;
objSourceWB, objCell, objSheet, objShapes, objShapeItem: object;
dispatchApplication, dispatchWorkBooks, dispatchSourceWB: System.DispatchHelper;
tmpCell, tmpSheet, tmpShapes, tmpShapeItem: System.DispatchHelper;
left, top, height, width: Double;
tmpLeft,tmpTop: Double;
i, ShapeCount: Integer; //图形个数
lSourceBmp: Business.System.TBitmap;
lTragetBmp: Business.System.TBitmap;
//l1, l2, l3: TStream;
begin
Result := False;
objApplication := ComObj.CreateOleObject('Excel.Application');
dispatchApplication := DispatchHelper.Create(objApplication);
objWorkBooks := dispatchApplication.PropertyGet('WorkBooks',[]);
dispatchWorkBooks := DispatchHelper.Create(objWorkBooks);
try
try
//创建Excel对象并打开
objSourceWB := dispatchWorkBooks.InvokeMethod('Open',[AFileName]);
dispatchSourceWB := DispatchHelper.Create(objSourceWB);
//获取指定单元格的左 上 宽 高
objCell := dispatchApplication.PropertyGet('cells', [ARowIndex, AColumnIndex]);
tmpCell := DispatchHelper.Create(objCell);
left := SysUtils.StrToFloat(ObjectHelper.ToString(tmpCell.PropertyGet('left', [])));
top := SysUtils.StrToFloat(ObjectHelper.ToString(tmpCell.PropertyGet('top', [])));
width := SysUtils.StrToFloat(ObjectHelper.ToString(tmpCell.PropertyGet('width', [])));
height := SysUtils.StrToFloat(ObjectHelper.ToString(tmpCell.PropertyGet('height', [])));
//获取全部的格数
objSheet := dispatchApplication.PropertyGet('Sheets', [ASheetIndex]);
tmpSheet := DispatchHelper.Create(objSheet);
objShapes := tmpSheet.PropertyGet('Shapes', []);
tmpShapes := DispatchHelper.Create(objShapes);
ShapeCount := SysUtils.StrToInt(ObjectHelper.ToString(tmpShapes.PropertyGet('Count', [])));
for i := 1 to ShapeCount do
begin
objShapeItem := tmpShapes.InvokeMethod('item', );
tmpShapeItem := DispatchHelper.Create(objShapeItem);
tmpLeft := SysUtils.StrToFloat(ObjectHelper.ToString(tmpShapeItem.PropertyGet('left', [])));
tmpTop := SysUtils.StrToFloat(ObjectHelper.ToString(tmpShapeItem.PropertyGet('top', [])));
//判断当前图片是否在指定的单元格内
if (tmpLeft >= left) and (tmpLeft < (left + width))
and (tmpTop >= top) and (tmpTop < (top + height)) then
begin
//将图片复制到剪贴板
tmpShapeItem.InvokeMethod('CopyPicture',[1,2]);
lTragetBmp := Business.System.TBitmap.Create;
lSourceBmp := Business.System.TBitmap.Create;
try
lSourceBmp.LoadFromClipboardFormat(Borland.Delphi.Windows.CF_BITMAP,
clipbrd.Clipboard.GetAsHandle(Borland.Delphi.Windows.CF_BITMAP), 0);
SmoothResize(lTragetBmp, lSourceBmp, $fffffe);
AJPG.Assign(lTragetBmp);
Result := True;
finally
lSourceBmp.Free;
lTragetBmp.Free;
end;
end;
end;
except
raise 'GetPic Failed';
end;
finally
//释放进程
dispatchApplication.InvokeMethod('quit', []);
(objShapeItem as System.IDisposable).Dispose;
(objShapes as System.IDisposable).Dispose;
(objSheet as System.IDisposable).Dispose;
(objCell as System.IDisposable).Dispose;
(objSourceWB as System.IDisposable).Dispose;
(objWorkBooks as System.IDisposable).Dispose;
(objApplication as System.IDisposable).Dispose;
end;
end; |