有时可以导出,有时报一下错误,这是为啥??
错误地址:
错误时间:2013/2/19 11:07:25
所在IP:
错误信息:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a。
错误详细:System.Runtime.InteropServices.COMException (0x8000401A): 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a。
     在 System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   在 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   在 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   在 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   在 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
----------------------------------------------------------导出Excel 方法
 /// <summary>
        /// 导出Excel 
        /// </summary>
        /// <param name="dtTemp"></param>
        public static void ExportCMB(System.Data.DataTable dtTemp, string ServerPath, string TextName, System.Web.UI.Page page)
        {
            // 定义要使用的Excel 组件接口
            // 定义Application 对象,此对象表示整个Excel 程序
            Application excelApp = null;
            // 定义Workbook对象,此对象代表工作薄
            Workbook workBook;
            // 定义Worksheet 对象,此对象表示Execel 中的一张工作表
            Worksheet ws = null;
            //定义Range对象,此对象代表单元格区域
            Range range;            int dcell = 1;
            int colindex = 0;            int rowcount = dtTemp.Rows.Count;
            int colcount = dtTemp.Columns.Count;            try
            {
                //初始化 Application 对象 excelApp
                excelApp = new Application();
                //在工作薄的第一个工作表上创建任务列表
                workBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                ws = (Worksheet)workBook.Worksheets[1];                // 命名工作表的名称为
                ws.Name = "Sheet1";
                //创建缓存
                Object[,] objdata = new object[rowcount + 3, colcount];                //创建标题
                foreach (System.Data.DataColumn dc in dtTemp.Columns)
                {
                    objdata[0, colindex++] = dc.ColumnName;
                }                //获取数据
                for (int i = 0; i < rowcount; i++)
                {
                    dcell = 0;                    for (int j = 0; j < colcount; j++)
                    {
                        objdata[i + 1, dcell++] = dtTemp.Rows[i][dtTemp.Columns[j].ColumnName].ToString();
                    }
                }
                //写入Excel
                range = ws.get_Range(excelApp.Cells[1, 1], excelApp.Cells[rowcount + 1, colcount]);
                ws.get_Range(excelApp.Cells[2, 12], excelApp.Cells[rowcount + 1, 12]).NumberFormatLocal = "@";                range.Value2 = objdata;
                range.Font.Size = 10;
                //设置格式
                excelApp.Cells.HorizontalAlignment = Constants.xlLeft; //全局左对齐
                excelApp.Cells.EntireColumn.AutoFit();
                range = ws.get_Range(excelApp.Cells[1, 1], excelApp.Cells[rowcount + 1, colcount]);                range.Borders.LineStyle = 1;
                //显示 Excel                workBook.SaveCopyAs(ServerPath.Replace("//", "\\") + TextName + ".xlsx");                workBook.Close(false, null, null);
                excelApp.Quit();
                ws = null;
                Utility.UploadExcel(ServerPath.Replace("//", "\\") + TextName + ".xlsx", page, true);
            }
            catch (Exception ex)
            {
                excelApp.Quit();
                throw ex;
            }
        }

解决方案 »

  1.   

    NPOI什么都不用管
      

  2.   

    http://www.cnblogs.com/Sue_/articles/2123372.html
      

  3.   

    调用COM组件出问题的时候,很不方便的一点是,只告诉程序员COM组件运行时出错,而没有更具体的信息,顶多是再给你一个错误代码,而这个代码也很宽泛,不详细。所以,遇到这问题的时候,很能从信息上分析。楼主只有一步一步的单步调试。而且,运行到出错地方的时候,就要凭经验来分析改进。
      

  4.   

    检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,8000401a错误解决方案
    在编写生成Excel 程序在win 20003 运行里,遇到了“检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a。 的错误.”问题,在网上主要解决办法为两种:1、http://support.microsoft.com/kb/2883662、 解决方法如下:1:在服务器上安装office的Excel软件.2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框5:点击"标识"标签,选择"交互式用户"6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORKSERVICE"用户,然后赋予"本地访问"权限.这样,我们便配置好了相应的Excel的DCOM权限.注意:这是在WIN2003上配置的,在2000,xp上,是配置ASPNET用户由于EXCEL是在服务器上打开的,所以应该写一个把导出数据保存在服务器上,然后再传递给客户端的方法,最后每次调用这个功能的时候再删除以前在服务器上所生成的所有Excel----------我的结果以上两种方法,都不行。参考多数资料:简单的记录下自己我解决方法:1、创建一个用户账号,设置所属于Power User或者User;2、运行DCOMCNFG,在Dcom组件里面找到Microsoft Excel 应用程序或者Microsoft excel文档-属性-标识里面选择“特定用户”,然后输入前面建立的帐号和密码就可以了;3、在web.config配置文件里添加一个支点〈identity /〉即可;
      

  5.   

    嘿,还是有时导的出来,有时导不出来,我用的是excel20007 服务器是 2008r2 iis7.0,又遇到过这种问题的兄弟帮帮忙吧
      

  6.   

    我自己用的npoi和epplus整合导出03跟07
      

  7.   

    看看你在DCOM中找到的Microsoft Excel 应用程序的属性,先看其ID是不是{00024500-0000-0000-C000-000000000046},如果不是,则复制它的ID,打开注册表,定位到HKEY_CLASSES_ROOT\CLSID下,搜索你复制的ID,找到后把它的APPID的值改为{00024500-0000-0000-C000-000000000046}