2012年7月11日 星期三

解決Excel2010插入圖片變成連結方式存檔

使用方法二可解決以下狀況

Excel 2010 插入圖片後, 發到收件人後, 圖片不能正確顯示, 只顯示"無法顯示連結的圖像"

//use  office2000,comobj;

procedure DBGrid3Excel(var DBGrid: TINFODBGrid;  ExcelFileName: string);
var  MyExcel: Variant;
     x,y, Z:integer;
     aGONO1:String;
     aPIC: Variant;
     iPic:Integer;
     aRange: Variant;

begin
  Z:=dbgrid.FieldCount;
  deletefile(ExcelFileName);
  MyExcel := CreateOleOBject('Excel.Application');
  MyExcel.WorkBooks.Add;
  MyExcel.Visible := True;
  MyExcel.WorkBooks[1].Saveas(ExcelFileName);
  dbgrid.DataSource.DataSet.First;
  MyExcel.Range['A1:N1'].Select;//選取一整行
  MyExcel.Selection.Merge;
  MyExcel.WorkBooks[1].WorkSheets[1].Cells[1,1] := Printstr;

  y:=2;
  for x:=1 to dbgrid.FieldCount do
  begin
    if dbgrid.Columns[x-1].Visible then
    begin
      MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Columns[x-1].title.caption;
      // 將該欄設為標選
      MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x].Select;
      // 將標題欄位變粗體字
      MyExcel.Selection.Font.Bold := true;
      // 設定欄位寬度
      MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := dbgrid.Fields[x-1].DisplayWidth;
    end;
  end;
  inc(y);
  iPic:=1;
  aGONO1:='';
  while not dbgrid.DataSource.DataSet.eof do
  begin
    for x:=1 to dbgrid.FieldCount do
    begin
      if  dbgrid.Fields[x-1].FieldName='PICNAM' then
      begin
          MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := 19;
          MyExcel.WorkBooks[1].WorkSheets[1].Rows[y].RowHeight:= 53;//recycle
          if (FileExists(Pchar(dbgrid.DataSource.DataSet.FieldByName('PICNAM').AsString)))then
          begin
            MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,1].Select;
            //方法一
            aPIC:= MyExcel.WorkBooks[1].WorkSheets[1].Pictures.Insert(dbgrid.DataSource.DataSet.FieldByName('PICNAM').Value);
            aPIC.Select;
            //aPIC.ShapeRange.IncrementLeft(0);
            //aPIC.ShapeRange.IncrementTop(0);
            //aPIC.ShapeRange.LockAspectRatio := msoFalse; //圖檔大小LOCK          
            aPIC.ShapeRange.height:=50;//指定高度
            //aPIC.ShapeRange.Width:=50;
            //aPIC.ShapeRange.ScaleWidth:=0.5;

            //取消底色
            aPIC.ShapeRange.PictureFormat.TransparentBackground := 1;
            aPIC.ShapeRange.PictureFormat.TransparencyColor := RGB(255, 255, 255);
            aPIC.ShapeRange.Fill.Visible := 0;
                       
            //方法二 Shapes.AddPicture
            aPIC:= MyExcel.WorkBooks[1].WorkSheets[1].Shapes.AddPicture(dbgrid.DataSource.DataSet.FieldByName('PICNAM').Value, msoTrue, msoTrue, 0, 33+52.5*(y-3), 50, 50);

            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures.Insert(dbgrid.DataSource.DataSet.FieldByName('PICNAM').Value);
            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures.Insert('\\127.0.0.1\PICT\10WEG011001.jpg');
            //設定圖檔大小
            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures[iPic].ShapeRange.height:=200;
            //MyExcel.WorkBooks[1].WorkSheets[iSheets].Pictures[iPic].ShapeRange.width:=40;

            Inc(iPic);//記錄目前圖檔陣列
          end;
      end
      else if dbgrid.Columns[x-1].Visible then
      begin
        if dbgrid.Fields[x-1].DataType =ftString then
          MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := ''''+dbgrid.Fields[x-1].DisplayText
        else
         MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Fields[x-1].DisplayText;
      end;
    end;
    inc(y);
    //aGONO1 := dbgrid.DataSource.DataSet.FieldByName('GONO1').AsString;
    dbgrid.DataSource.DataSet.next;
  end;
end;

以下節錄 Shapes.AddPicture 方法說明:
從已存在的檔案中建立圖片。傳回代表新圖片的 Shape 物件。
語法

ActiveSheet.AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height)

參數

名稱 必要/選用 資料類型 描述
Filename 必要 String 要建立 OLE 物件的來源檔案。
LinkToFile 必要 MsoTriState 要連結的檔案。
SaveWithDocument 必要 MsoTriState 要與文件一同儲存的圖片。
Left 必要 Single 圖片的左上角位置 (以點為單位),與文件左上角相對。
Top 必要 Single 圖片的左上角位置 (以點為單位),與文件頂端相對。

Width 必要 Single 圖片的寬度 (以點為單位)。
Height 必要 Single 圖片的高度 (以點為單位)。

傳回值 Shape

備註
MsoTriState 可以為下列其中一個 MsoTriState 常數。
msoCTrue
msoFalse :將圖片建立成獨立的檔案複本。
msoTriStateMixed
msoTriStateToggle
msoTrue:建立圖片與其來源檔案之間的連結。

MsoTriState 可以為下列其中一個 MsoTriState 常數。
msoCTrue
msoFalse:只在文件中存放連結資訊。
msoTriStateMixed
msoTriStateToggle
msoTrue:將連結的圖片與其所插入的文件一同儲存。如果 LinkToFile 為 msoFalse,則此引數必須為 msoTrue。

沒有留言: