开发工具:delphi7+SQL2000从系统导出的EXCEL文件无法用exce2010打开:
用DBGRIDEh控件直接导出一个excel文件,发现无法用excel2010打开,一打开报错:
‘Microsoft Excel 遇到问题需要关闭。我们对此引起的不便表示抱歉’。2. 若是不用DBGRIDEh控件,用delphi自带控件一行一行的往Excel写数据,也没有问题。之前用的是Excel2003没有问题,装了2010后就出现了上面的状况。若是转出的EXCEL文件先用2003打开,再另存,然后在用2010打开,又是可以的。
上网查了查说是版本的问题,按道理excel版本是向下兼容的,不应该出现这样的情况。请问,谁也遇到过这样的情况,有没有解决办法?

解决方案 »

  1.   

    建议导出为CSV文件,我以前也碰过
      

  2.   


    有些报表转出后,还会设置公式什么的,保存为CSV文件不行。
    这些报错也出现在导入过程,用户都是直接在EXCEL文件中作业,然后导入系统,让他们另存为CSV格式再导入估计也不现实。
      

  3.   

    可能是导出的文件不完整。不知你是用控件,或是使用D7的Server中的控件。
    建议使用XLS4控件,生成的EXCEL无问题。
      

  4.   

    我也遇到了,下面的代码肯定可以。
    procedure DBGridSaveXLS(aDBGrid: TDBGrid; sFileName: string);
      function LineFeedsToXLS(s:string):string;
      var
        Res: string;
        i: Integer;
      begin
        Res := '';
        for i := 1 to Length(s) do
          if s[i] <> #13 then
            Res := Res + s[i];
        Result:=res;
      end;
    var
      FExcel: Variant;
      FWorkbook: Variant;
      FWorksheet: Variant;
      FArray: Variant;
      s, z: Integer;
      RangeStr, sTitle: string;
      aBookMark: TBookMark;
      StrtCol, StrtRow, RowCount, ColCount: Integer;
    begin
      Screen.Cursor := crHourGlass;  try
        FExcel := CreateOleObject('excel.application');
      except
        Screen.cursor := crDefault;
        MessageDlg('Could not start Microsoft Excel!', mtError, [mbCancel], 0);
        Exit;
      end;  aBookMark := aDBGrid.DataSource.DataSet.GetBookMark;
      aDBGrid.DataSource.DataSet.DisableControls;
      try
        StrtCol := 0;
        StrtRow := 0;
        FWorkBook := FExcel.WorkBooks.Add;
        //FWorkSheet := FWorkBook.WorkSheets.Add;
        FWorkSheet := FExcel.WorkBooks[1].WorkSheets[1];
        RowCount := aDBGrid.DataSource.DataSet.RecordCount + 1;//加上標題行
        ColCount := aDBGrid.Columns.Count;
        FArray := VarArrayCreate([0, RowCount - 1 - StrtRow, 0, ColCount - 1 - StrtCol], VarVariant);    //Title
        for z := StrtCol to ColCount - 1 do
        begin
          sTitle := aDBGrid.Columns[z].Title.Caption;
          if sTitle = '' then
            sTitle := aDBGrid.Columns[z].FieldName;
          FArray[0, z - StrtCol] := LineFeedsToXLS(sTitle);
        end;    //data
        {for s := StrtRow to RowCount - 1 do
          for z := StrtCol to ColCount - 1 do
            FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS();}
        s := 1;//s := StrtRow;
        aDBGrid.DataSource.DataSet.First;
        while not aDBGrid.DataSource.DataSet.Eof do
        begin
          for z := StrtCol to ColCount - 1 do
            FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS(aDBGrid.Columns[z].Field.DisplayText);
          Inc(s);
          aDBGrid.DataSource.DataSet.Next;
        end;    RangeStr := 'A1:';    if (ColCount - StrtCol) > 26 then
        begin
          if (ColCount - StrtCol) mod 26 = 0 then
          begin
            RangeStr := RangeStr + Chr(Ord('A') - 2 + ((ColCount - StrtCol) div 26));
            RangeStr := RangeStr + 'Z';
          end
          else
          begin
            RangeStr := RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) div 26));
            RangeStr := RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) mod 26));
          end;
        end
        else
          RangeStr := RangeStr + Chr(Ord('A') - 1 + (ColCount - StrtCol));    RangeStr := RangeStr + IntToStr(RowCount - StrtRow);    FWorkSheet.Range[RangeStr].Value := FArray;    if sFileName <> '' then
        begin
          FWorkbook.SaveAs(sFileName);
          FExcel.Quit;
          FExcel := unAssigned;
        end
        else
          FExcel.Visible := True;
      finally
        aDBGrid.DataSource.DataSet.GotoBookMark(aBookMark);
        aDBGrid.DataSource.DataSet.EnableControls;
        aDBGrid.DataSource.DataSet.FreeBookMark(aBookMark);
        Screen.Cursor := crDefault;
      end;
    end;
      

  5.   

    我用的也是dbgrideh的控件,导出的excel也是用office 2010,可以正常导出excel,并打开,我把代码贴出来,希望有帮助,ps:我是用xe2写的,delphi 7 也可以用的。uses   COMobj,DBGridEhImpExp;procedure TfrmDetail.Button8Click(Sender: TObject);
    var
      pExpClass: TDBGridEhExportClass;      //导出文件类型
      pExt:string ;                        //导出文件扩展名
      pExpFile:string;                     //导出文件路径及文件名称
      pExpFileExt:string;                  //SaveDialog1返回的文件名的扩展名
      ExcelApp: Variant; //Excel变量
      Ret:integer;
    begin
        Ret :=  Application.MessageBox(pchar('是否只导出选中的数据?'
            +#13+#10+#13+#10+'    确认   - 选中部分'
            +#13+#10+#13+#10+'    取消   - 全部'),pchar(Application.title),MB_OKCANCEL);    SaveDialog1.FileName := '';
        if SaveDialog1.Execute then
        begin
          pExpClass := TDBGridEhExportAsXLS;
          pExt := 'xls';      pExpFile:= trim(SaveDialog1.FileName);
          if UpperCase(Copy(pExpFile,Length(pExpFile)-2,3)) <> UpperCase(pExt) then
             pExpFile := pExpFile + '.' + pExt;
          if  Ret = IDOK  then
            SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,False)
          else
            SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,true);      ExcelApp := CreateOleObject('Excel.Application');
          ExcelApp.Visible := true;
          ExcelApp.WorkBooks.Open(pExpFile);
          ExcelApp.WorkSheets[1].Activate;    end;
    end;
      

  6.   

    xe2 下导出的EXCEL,在e2010下打不开啊
      

  7.   


    我的xe2中怎么没有你说的dbgrideh控件啊?
      

  8.   

    求解,我用DBgridEh导出Excel文件后无法打开
    提示:文件已损坏,无法打开
    用2003,2007都可以正常打开,唯独2010打不开,2010以上的版本没试过SaveDBGridEhToExportFile(pExpClass,dbgrdh1,pExpFile,True)
      

  9.   

    这个会不会因为导出excel版本格式太久缘故?
    你试试03打开另存为97或者以上格式版本
      

  10.   

    这个会不会因为导出excel版本格式太久缘故?
    你试试03打开另存为97或者以上格式版本不会的,我用2000,2003,2007,2010,2013分别打开过了
    只有2010无法打开呢
      

  11.   


    做个标记,建议使用cxgrid...自带导出!
      

  12.   

    那请问这个哥们的Ehlib 是什么版本的
      

  13.   

    在日常操作中,Excel、PPT偶尔会碰到2003、2007、2010互相打不开的情况。