设置轴标题时发生COMException 0x800A03EC

当通过COM Interop将数据导出为Excel时,在尝试设置AxisTitle.Text属性时出现错误(代码0x800A03EC)。 这种情况只发生在一台使用Windows 7 x64 Professional和Excel 2003的特定计算机上。我已经在各种不同的PC(包括Win7 x64 Professional + Excel 2003)上尝试过,但不能在任何其他机器上重现该错误。

private static void setAxisTitle(_Chart tChart, string aszTimeUnit) { Axis tAxis = (Axis)tChart.Axes(XlAxisType.xlValue, XlAxisGroup.xlPrimary); try { tAxis.HasTitle = true; tAxis.AxisTitle.Text = "Messwert [um/m]"; tAxis = (Axis)tChart.Axes(XlAxisType.xlCategory, XlAxisGroup.xlPrimary); tAxis.HasTitle = true; tAxis.AxisTitle.Text = string.Format("Zeit [{0}]", aszTimeUnit); } catch (Exception aEx) { cLogger.ErrorFormat("error setting axis title for time unit '{0}' on Axis '{1}'", aszTimeUnit, tAxis.AxisTitle); cLogger.Error("error stack trace:", aEx); throw; } } 

有人知道如何解决这个困境?

编辑:关于不同文化的话题:操作系统和Excel都有相同的文化。 不过,我认为我可以用下面的代码处理任何可能出现的问题:

  static Excel2007Export() { Microsoft.Office.Interop.Excel.Application tExcel = new Application(); cSystemCulture = Thread.CurrentThread.CurrentCulture; cExcelCulture = new CultureInfo(tExcel.LanguageSettings.get_LanguageID( Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI)); try { Thread.CurrentThread.CurrentCulture = cExcelCulture; int tVersion; bool tParseSucceded = Int32.TryParse(tExcel.Version.Substring(0, tExcel.Version.IndexOf('.')), out tVersion); // 12 is the first version with .xlsx extension if (tVersion >= 12) cDefaultExtension = ".xlsx"; else cDefaultExtension = ".xls"; } catch (Exception aException) { cLogger.Debug("error retrieving excel version.", aException); cLogger.Error("error retrieving excel version."); } finally { Thread.CurrentThread.CurrentCulture = cSystemCulture; } } 

当调用过程与办公室安装有不同的文化时,有时会发生这种错误。 如果这是你的情况,你可以改变调用线程的文化,以符合Excel的文化,像这样:

CultureInfo MyCulture = new CultureInfo(“en-US”); //你的文化在这里Thread.CurrentThread.CurrentCulture = MyCulture;

这可能可以解决这个问题。

 For Each Obj As Excel.ChartObject In xlsSheet.ChartObjects() ' Obj.Copy() If Obj.Name.ToString = "Chart gainloose" Then Obj.Chart.ChartArea.Copy() End If ' Console.WriteLine(Obj.Name) ' Console.WriteLine(Obj.TopLeftCell.Row.ToString & " : " & Obj.TopLeftCell.Column.ToString) Next