【问题标题】:Exception from HRESULT: 0x800A03EC Error While creating Excel fileHRESULT 异常:创建 Excel 文件时出现 0x800A03EC 错误
【发布时间】:2026-02-02 06:50:01
【问题描述】:

我创建了需要每 2 小时创建一次 Excel 的 Windows 服务。 但它给我一个错误如下

Exception from HRESULT: 0x800A03EC

第一次创建 excel 文件。但第二次出现错误。 尝试了很多事情但都失败了。请帮帮我。

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005.

这个错误也出现在第一个错误出现之后。

public void WriteExcel()
    {
        string ExcelGen = "ExcelGen";
        try
        {
            string fileNm = DateTime.Now.ToString("dd-MM-yyyy_HH") + ".xls";
            string path = AppDomain.CurrentDomain.BaseDirectory + "Uploads\\" + fileNm;
            string ServiceDbName = ConfigurationManager.AppSettings["ServiceDBName"].ToString();
            string ServiceLMName = ConfigurationManager.AppSettings["ServiceTable"].ToString();
            int Cnt = Service1.Counter;

            Service1.AddLog("EXCEL STEP 1");
            Microsoft.Office.Interop.Excel.Application objexcelapp = new Microsoft.Office.Interop.Excel.Application();                
            objexcelapp.Application.Workbooks.Add(Type.Missing);
            objexcelapp.Columns.ColumnWidth = 25;
            Service1.AddLog("EXCEL STEP 1.1");
            MySqlConnection Conn = new MySqlConnection(ConfigurationManager.AppSettings["Conn"].ToString());
            MySqlCommand inCmd = new MySqlCommand("select HT_LeadCode as 'LeadCode',right(lead_phone1,10) as 'Mobile',idg_fnc_GetDispositionDescription(lead_service_id, lead_last_dial_status) as 'Status' from " + ServiceDbName + "." + ServiceLMName + " where lead_status ='F' and HT_LeadCode <> '' and ifnull(HT_UpldFlag,'N') = 'N'", Conn);
            Conn.Open();
            DataSet ds = new DataSet();
            MySqlDataAdapter da = new MySqlDataAdapter(inCmd);
            da.Fill(ds);
            Service1.AddLog( "EXCEL STEP 2");
            string leadCodes = "";
            foreach (System.Data.DataTable table in ds.Tables)
            {
                for (int i = 1; i < table.Columns.Count + 1; i++)
                {
                    Service1.AddLog(" i : " + i.ToString());
                    objexcelapp.Cells[1, i] = table.Columns[i - 1].ColumnName;
                }

                for (int j = 1; j < table.Rows.Count+1; j++)
                {
                    for (int k = 1; k < table.Columns.Count+1; k++)
                    {
                        Service1.AddLog("j & k : " + j.ToString()+ " & " + k.ToString());
                        objexcelapp.Cells[j + 2, k + 1] = table.Rows[j].ItemArray[k].ToString();
                        if(k==0)
                            leadCodes += table.Rows[j].ItemArray[k].ToString() + ",";
                    }
                }
            }
            Service1.AddLog("LeadCodes : "+leadCodes);
            leadCodes = leadCodes.Substring(0, leadCodes.Length - 1);
            Service1.AddLog("LeadCodes : " + leadCodes);

            inCmd = new MySqlCommand("update " + ServiceDbName + "." + ServiceLMName + " set HT_UpldFlag = 'Y' where lead_status ='F' and HT_LeadCode <> '' and ifnull(HT_UpldFlag,'N') = 'N' ", Conn);
            inCmd.ExecuteNonQuery();

            Service1.AddLog( "EXCEL STEP 3");
            Service1.AddLog( "'" + path + "'" + " File is Created");
            objexcelapp.ActiveWorkbook.SaveCopyAs(path);
            objexcelapp.ActiveWorkbook.Saved = true;
            objexcelapp.Quit();
            Conn.Close();
            Service1.AddLog( "EXCEL STEP 4");
            Service1.AddLog( "UPLOAD THREAD STARTING");
            Activity act = new Activity();

            act.Upload();
        }
        catch (Exception ex)
        {
            Service1.AddLog( "WriteExcel Err : " + ex.Message);
        }
    }

当我运行服务时,它第一次创建 excel 文件,但间隔发生时。它给出了上述错误。

【问题讨论】:

    标签: c# excel excel-interop


    【解决方案1】:

    咕噜咕噜。

    我已经多次看到 0x800A03EC 错误,它可能意味着任何事情......

    你可能想试试这个...

    • 获取此 free C# library 的副本,它使用创建 .xlsx 文件 OpenXML 库,而不是 VSTO。它使用OpenXmlWriter 库写入文件,因此如果有大量数据,您不会遇到内存不足的问题。

    • 通过像以前一样填充 ds DataSet 来创建 Excel 文件,然后使用一行代码:

      CreateExcelFile.CreateExcelDocument(ds, "YourExcelFilename.xlsx");

    如果您不想走这条路,我建议您处理掉您的 objexcelapp 变量。这是一个 COM 对象,如果您不专门杀死它,它可能会保持打开/使用中。

    if (objexcelapp != null)
        Marshal.ReleaseComObject(objexcelapp);
    

    多年来,我们遇到了大量 VSTO 问题,现在,尽可能少地使用它。

    希望这会有所帮助。

    【讨论】: