起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 353|回复: 16

【结帖】导出excel表格出错?**

[复制链接]
发表于 2009-5-20 09:47:13 | 显示全部楼层 |阅读模式
请问我们导出datagrid为excel表格时,当数据量比较大的情况导出带图片的数据就会出现以下错误,但是如果只导出10条以内的记录数据又没有任何问题?麻烦看下吧

1.jpg

7.99 KB, 下载次数: 216

回复

使用道具 举报

发表于 2009-5-20 10:13:04 | 显示全部楼层
大概是多大的数据量?
楼主用的平台版本?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-20 10:19:06 | 显示全部楼层
超过10条以上的记录就会出现这种错误了  
我们的版本是3068
回复 支持 反对

使用道具 举报

发表于 2009-5-20 10:24:46 | 显示全部楼层
你拿任务中心(查询出超过10条的),然后右键导出到excel看看是否ok的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-20 10:30:37 | 显示全部楼层
从任务中心导出的excel没问题呢,主要是导出带图片的数据就不行了
var
  o: object;
  app, Workbooks, Worksheets, sheet: DispatchHelper;
  FPicture, FPictures, Range, tRow, tCol: DispatchHelper;
  UsedRange, Cells, Rows: DispatchHelper;
  sColValue, sFolder,TempFile, sFileName: string;
  JpegMap: TJPEGImage;
  DBImage1: TDBImage;
  i, PicIndex, RowCount, sfzhCol, zpCol: Integer;
  bEof: Boolean;
  zpbh, zpColName: string;
begin
  if DataSetBroker1.DataSet.RecordCount = 0 then Exit;
  SaveDialog1.FileName := '从业人员信息明细表';
  SaveDialog1.DefaultExt := 'xls';
  if SaveDialog1.Execute = false then Exit;

  sFolder := '';
  sFileName := SaveDialog1.FileName;
  while StringUtils.Pos('\', sFileName) > 0 do
  begin
    sFolder   := sFolder + StringUtils.Copy(sFileName, 1, StringUtils.Pos('\', sFileName));
    sFileName := StringUtils.Copy(sFileName, StringUtils.Pos('\', sFileName) + 1, sFileName.Length - StringUtils.Pos('\', sFileName))
  end;

  sFileName := SaveDialog1.FileName;
  if (sender as TBitBtn).Tag=1 then
  begin
    RowCount := DataGrid1.SelectedCount;
    DataGrid1.SaveToXLS(sFileName, False);
  end
  else
  begin
    RowCount := DataSetBroker1.DataSet.RecordCount;
    DataGrid1.SaveToXLS(sFileName, True);
  end;
  o := ComObj.CreateOleObject('Excel.Application');
  app := DispatchHelper.Create(o);
  app.PropertyPut('Visible', [false]);
  app.PropertyPut('DisplayAlerts', [false]);
  Workbooks := DispatchHelper.Create(app.PropertyGet('Workbooks', []));
  Worksheets := DispatchHelper.Create(Workbooks.InvokeMethod('Open', [sFileName]));
  sheet := DispatchHelper.Create(Worksheets.PropertyGet('Worksheets', [1]));
  sheet.InvokeMethod('Select', []);
  {
  //取使用范围的行数
  UsedRange:=DispatchHelper.Create(sheet.PropertyGet('UsedRange', []));
  cells:=DispatchHelper.Create(UsedRange.PropertyGet('Cells', []));
  Rows:=DispatchHelper.Create(cells.PropertyGet('Rows', []));
  RowCount:=objecthelper.ToInt(Rows.PropertyGet('count',[]));
  {}
  bEof := false;
  i := 1;
  while bEof = false do
  begin
    Cells := DispatchHelper.Create(app.PropertyGet('Cells', [1, i]));
    if Cells.PropertyGet('value', []) <> nil then
      sColValue := objecthelper.ToString(Cells.PropertyGet('value', []))
    else
      sColValue := '';
    if sColValue = '身份证号' then
    begin
      sfzhCol := i;
    end
    else if sColValue = '' then
    begin
      zpColName := '';
      if i > 26 then
      begin
        for zpCol := 1 to Trunc(i / 26) do
        begin
          zpColName := Char(64 + zpCol);
        end;
        zpColName := zpColName + Char(64 + (i mod 26));
      end
      else
      begin
        zpColName := Char(64 + i);
      end;
      zpCol := i;
      Cells.PropertyPut('value', ['照片']);
      tCol := DispatchHelper.Create(sheet.PropertyGet('Columns', ));
      tCol.PropertyPut('ColumnWidth', [25]);
      bEof := true;
    end;
    i := i + 1;
  end;
  PicIndex := 1;
  for i := 1 to RowCount do
  begin
    tRow := DispatchHelper.Create(sheet.PropertyGet('Rows', [i + 1]));
    tRow.PropertyPut('RowHeight', [160]);
    Cells     := DispatchHelper.Create(app.PropertyGet('Cells', [i + 1, sfzhCol]));
    sColValue := objecthelper.ToString(Cells.PropertyGet('value', []));
    if DataSetBroker1.DataSet.Locate('sfzh', [sColValue], [TLocateOption.loPartialKey]) then
    begin
      zpbh := DataSetBroker1.DataSet.FieldByName('zpbh').AsString;
      TSqlDataSet(dsbZP.DataSet).UserFilter := 'zpbh=''' + zpbh + '''';
      if dsbZP.DataSet.RecordCount > 0 then
      begin
        TempFile:=sFolder + 'temp.jpg';
        TBlobField(dsbZP.DataSet.FieldByName['zp']).SaveToFile(TempFile);
        try
          if BMP2JPG(TempFile,TempFile) then
          begin
            JpegMap := TJPEGImage.Create;
            JpegMap.LoadFromFile(TempFile);
            DBImage1 := TDBImage.Create(self);
            DBImage1.Picture.Bitmap.Assign(JpegMap);
            DBImage1.CopyToClipboard;
            Range := DispatchHelper.Create(sheet.PropertyGet('Range', [zpColName + SysUtils.IntToStr(i + 1), zpColName + SysUtils.IntToStr(i + 1)]));
            Range.InvokeMethod('Select', []);
            sheet.InvokeMethod('Paste', []);

            FPicture := DispatchHelper.Create(sheet.PropertyGet('Pictures', [PicIndex]));
            //FPicture:=DispatchHelper.Create(FPictures.InvokeMethod('Insert', ['D:\1.jpg']));
            //FPicture.PropertyPut('Left', [10]);
            //FPicture.PropertyPut('Top', [10]);
            FPicture.PropertyPut('width', [120]);
            FPicture.PropertyPut('height', [160]);
            PicIndex := PicIndex + 1;
          end;
        finally
          JpegMap.Free;
          DBImage1.Free;
          if SysUtils.FileExists(TempFile) then SysUtils.DeleteFile(TempFile);
        end;
      end;
    end;
  end;
  app.InvokeMethod('Save', []);
  app.PropertyPut('Visible', [true]);
  (o as System.IDisposable).Dispose;
end;
回复 支持 反对

使用道具 举报

发表于 2009-5-20 10:42:46 | 显示全部楼层
我这边简单试了一下,datagrid带图片的数据行超过10条,然后通过DataGrid.SaveToXLS方式导出到excel没有什么问题。

你具体报错是在什么地方呢?
我看你上面的代码是把图片字段存出来然后插入到excel的方式,对吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-20 10:56:51 | 显示全部楼层
代码错误停在红色部分,其中建模工具还会出现如下错误信息

var
  MyJpg:TJPEGImage;
  Image:TImage;
  BMP:TBitmap;
  Gif:TGIFImage;
  ImageInfo:TImageInfo;
  PicType:string;
begin
  Result := false;
  ImageInfo:=TImageInfo.Create;
  PicType:=SysUtils.UpperCase(ImageInfo.GetImageType(inFile));
  ImageInfo.Free;
  //'BMP''JPEG''GIF''PCX''PNG''PSD''RAS''SGI''TIFF''ERR'
  if not ((PicType ='BMP') or (PicType ='JPEG') or (PicType ='GIF')) then exit;
  try   //Finally
    try //Except
        // create some stuff
      MyJpg := TJPEGImage.Create;
      Image := TImage.Create(self);
      BMP:=TBitmap.Create;
      Gif := TGIFImage.Create;
       // LOAD JPG-file
      // TO BMP TO MAKE PROPERTIES PERMANENT
      if PicType='BMP' then
      begin        
Image.Picture.LoadFromFile(inFile);
        
MyJpg.Assign(Image.Picture.Bitmap);
      end
      else if PicType='JPEG' then
      begin
        Image.Picture.LoadFromFile(inFile);
        BMP.Width := Image.Picture.Width;
        BMP.Height := Image.Picture.Height;
        BMP.Canvas.Draw(0, 0, Image.Picture.Graphic);
        //Image.Canvas.Draw(0, 0, Image.Picture.Graphic);
        MyJpg.Assign(BMP);
      end
      else if PicType='GIF' then
      begin
        Gif.LoadFromFile(inFile);
        Image.Picture.Bitmap.Assign(Gif);
        MyJpg.Assign(Image.Picture.Bitmap);
      end;
      // BACK JPG
      MyJpg.CompressionQuality := 80; // as an example
      MyJpg.Compress;
      MyJpg.SaveToFile(OutFile);

      Result := true;

    except
      Result := false;
    end; //Except

  finally
    MyJpg.Free;
    Image.Free;
    BMP.Free;
    Gif.Free;
  end; // Finnaly
end;

2.jpg

9.05 KB, 下载次数: 185

回复 支持 反对

使用道具 举报

发表于 2009-5-20 11:21:09 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-20 11:41:50 | 显示全部楼层
没看明白 能解释下么?
回复 支持 反对

使用道具 举报

发表于 2009-5-20 13:40:16 | 显示全部楼层
楼主,你上面说停在红色标记的代码处,不对吧?
我简单改了你的代码,运行起来没问题呀
(放一个button和OpenDialog1组件,然后用下面的代码,运行后选择一个bmp图片)

procedure TMainForm.Button1Click(Sender: TObject);
var
  MyJpg : TJPEGImage;
  Image : TImage;
  BMP : TBitmap;
  Gif : TGIFImage;
  ImageInfo : TImageInfo;
  PicType , inFile,OutFile : string;
begin
  if OpenDialog1.Execute then
  begin
    OutFile := 'c:\a.jpeg';
    inFile := OpenDialog1.FileName;
    PicType := 'BMP';
    //'BMP''JPEG''GIF''PCX''PNG''PSD''RAS''SGI''TIFF''ERR'
    if not ((PicType ='BMP') or (PicType ='JPEG') or (PicType ='GIF')) then exit;
    try   //Finally
      try //Except
        // create some stuff
      MyJpg := TJPEGImage.Create;
      Image := TImage.Create(self);
      BMP:=TBitmap.Create;
      Gif := TGIFImage.Create;
      if PicType='BMP' then
      begin
        Image.Picture.LoadFromFile(inFile);

        MyJpg.Assign(Image.Picture.Bitmap);
      end
      else if PicType='JPEG' then
      begin
        Image.Picture.LoadFromFile(inFile);
        BMP.Width := Image.Picture.Width;
        BMP.Height := Image.Picture.Height;
        BMP.Canvas.Draw(0, 0, Image.Picture.Graphic);
        //Image.Canvas.Draw(0, 0, Image.Picture.Graphic);
        MyJpg.Assign(BMP);
      end
      else if PicType='GIF' then
      begin
        Gif.LoadFromFile(inFile);
        Image.Picture.Bitmap.Assign(Gif);
        MyJpg.Assign(Image.Picture.Bitmap);
      end;
      // BACK JPG
      MyJpg.CompressionQuality := 80; // as an example
      MyJpg.Compress;
      MyJpg.SaveToFile(OutFile);
    except
    end; //Except
  finally
    MyJpg.Free;
    Image.Free;
    BMP.Free;
    Gif.Free;
  end; // Finnaly
  end;
end;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-21 03:03 , Processed in 0.048413 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表