从系统导出的EXCEL文件无法用exce2010打开

wanghao0402 2012-12-29 05:32:57
开发工具:delphi7+SQL2000

从系统导出的EXCEL文件无法用exce2010打开:
用DBGRIDEh控件直接导出一个excel文件,发现无法用excel2010打开,一打开报错:
‘Microsoft Excel 遇到问题需要关闭。我们对此引起的不便表示抱歉’。

2. 若是不用DBGRIDEh控件,用delphi自带控件一行一行的往Excel写数据,也没有问题。

之前用的是Excel2003没有问题,装了2010后就出现了上面的状况。

若是转出的EXCEL文件先用2003打开,再另存,然后在用2010打开,又是可以的。
上网查了查说是版本的问题,按道理excel版本是向下兼容的,不应该出现这样的情况。

请问,谁也遇到过这样的情况,有没有解决办法?
...全文
1781 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbdzjx 2015-02-12
  • 打赏
  • 举报
回复
在日常操作中,Excel、PPT偶尔会碰到2003、2007、2010互相打不开的情况。
wuyiyuan123 2015-02-12
  • 打赏
  • 举报
回复
引用 5 楼 smijerryan 的回复:
我用的也是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;
那请问这个哥们的Ehlib 是什么版本的
  • 打赏
  • 举报
回复
做个标记,建议使用cxgrid...自带导出!
smhilyyan 2013-10-18
  • 打赏
  • 举报
回复
引用 8 楼 dream_wzf 的回复:
求解,我用DBgridEh导出Excel文件后无法打开 提示:文件已损坏,无法打开 用2003,2007都可以正常打开,唯独2010打不开,2010以上的版本没试过 SaveDBGridEhToExportFile(pExpClass,dbgrdh1,pExpFile,True)
这个会不会因为导出excel版本格式太久缘故? 你试试03打开另存为97或者以上格式版本
dream_wzf 2013-10-18
  • 打赏
  • 举报
回复
求解,我用DBgridEh导出Excel文件后无法打开 提示:文件已损坏,无法打开 用2003,2007都可以正常打开,唯独2010打不开,2010以上的版本没试过 SaveDBGridEhToExportFile(pExpClass,dbgrdh1,pExpFile,True)
smhilyyan 2013-10-18
  • 打赏
  • 举报
回复
那就不知道了
dream_wzf 2013-10-18
  • 打赏
  • 举报
回复
引用 9 楼 smhilyyan 的回复:
[quote=引用 8 楼 dream_wzf 的回复:] 求解,我用DBgridEh导出Excel文件后无法打开 提示:文件已损坏,无法打开 用2003,2007都可以正常打开,唯独2010打不开,2010以上的版本没试过 SaveDBGridEhToExportFile(pExpClass,dbgrdh1,pExpFile,True)
这个会不会因为导出excel版本格式太久缘故? 你试试03打开另存为97或者以上格式版本[/quote] 不会的,我用2000,2003,2007,2010,2013分别打开过了 只有2010无法打开呢
Jimmy_CHENBN 2013-03-15
  • 打赏
  • 举报
回复
引用 5 楼 smijerryan 的回复:
我用的也是dbgrideh的控件,导出的excel也是用office 2010,可以正常导出excel,并打开,我把代码贴出来,希望有帮助,ps:我是用xe2写的,delphi 7 也可以用的。 uses COMobj,DBGridEhImpExp; procedure TfrmDetail.Button8Click(Sender: TObject); var pExpCl……
我的xe2中怎么没有你说的dbgrideh控件啊?
Wandrew 2013-01-22
  • 打赏
  • 举报
回复
xe2 下导出的EXCEL,在e2010下打不开啊
smijerryan 2013-01-03
  • 打赏
  • 举报
回复
我用的也是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;
feiba7288 2013-01-03
  • 打赏
  • 举报
回复
我也遇到了,下面的代码肯定可以。
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;
lyhoo163 2013-01-03
  • 打赏
  • 举报
回复
可能是导出的文件不完整。不知你是用控件,或是使用D7的Server中的控件。 建议使用XLS4控件,生成的EXCEL无问题。
wanghao0402 2013-01-02
  • 打赏
  • 举报
回复
引用 1 楼 taixinltd 的回复:
建议导出为CSV文件,我以前也碰过
有些报表转出后,还会设置公式什么的,保存为CSV文件不行。 这些报错也出现在导入过程,用户都是直接在EXCEL文件中作业,然后导入系统,让他们另存为CSV格式再导入估计也不现实。
taixinltd 2012-12-29
  • 打赏
  • 举报
回复
建议导出为CSV文件,我以前也碰过

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧