在Delphi 7中使用TExcelWorkBook SaveAs方法时出现Ole 800A03EC错误

时间:2010-03-01 13:15:24

标签: delphi excel automation ole

我正在尝试打开excel 2003工作簿并将其保存为其他内容,例如excel 95。 我使用以下代码:

XLSApp:=TExcelApplication.Create(Self);
XLSApp.Workbooks.Open(SomeFileName,NULL,false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,defaultlcid);
XLSWB:=TExcelWorkbook.Create(XLSApp);
XLSWB.ConnectTo(XLSApp.Workbooks.Item[1]);
XLSWB.SaveCopyAs(ExtractFilePath(edTable.Text)+'temp.xls');
XLSWB.SaveAs(SomeOtherFileName,xlExcel7,EmptyParam,EmptyParam,False,False,xlNoChange,xlUserResolution,False,EmptyParam,EmptyParam,EmptyParam,DefaultLCID);

不幸的是,这段代码在客户端计算机上提供了“Ole 800A03EC”,而它在我的计算机上运行。请注意,我安装了Office 2007,并且他安装了Office 2003 SP3。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:9)

自动化Excel时,我看到过一次此错误。当用户在editmode中有一个单元格并且您尝试自动化该实例时,就会发生这种情况。当您编辑单元格并且某些程序在后台摆弄时,Excel不喜欢它。

所以这就是你的客户正在发生的事情(我认为):

  • 您的客户已打开Excel并且是 编辑单元格(选择单元格和 按F2)
  • 您的代码开始:
    • 您创建一个TExcelApplication并访问Workbooks属性。由于您的Excel应用程序尚未连接,因此调用TOleServer.Connect(查看GetDefaultInterface的实现)
    • 由于默认的connectkind是ckRunningOrNew,因此TExcelApplication连接到正在运行的实例。
    • 由于客户端正在编辑单元格,因此Open方法会出错。

如何防止这种情况:将TExcelApplication的ConnectKind设置为ckNewInstance,这样您就可以在单独的Excel实例中工作。

答案 1 :(得分:2)

800A03EC也会发生在一个人(比如我)做一个愚蠢的事情,比如试图加载到一个不存在的Excel单元格中,例如:

excel.Cells[rowIndex, ri] = x;
where ri is 0.

注意:col索引从1开始,而不是0。

答案 2 :(得分:1)

OLE 800A03EC通常与Excel文件中的无效字符有关。您使用的是与客户相同的数据吗?区域设置有区别吗?等等,可能会有很多错误,但很可能(正如快速谷歌告诉我的那样)这是一个区域设置。

答案 3 :(得分:1)

在我的情况下(xlExcel8格式):

而不是:

theWorkbookWyjscie.SaveAs(saveFileDialog1.FileName, myExcel.XlFileFormat.xlExcel8);

我用过:

theWorkbookWyjscie.SaveAs(saveFileDialog1.FileName);

theWorkbookWyjscie.SaveAs(saveFileDialog1.FileName, myExcel.XlFileFormat.xlExcel7);

两者都运作良好......是的,我知道这是一个愚蠢的解决方案,但它正在发挥作用!

答案 4 :(得分:0)

我在尝试将太多数据存储到WorkSheet时(通过Delphi)出现错误