导出Excel报错

挨踢蜗牛 2013-02-19 11:15:10
有时可以导出,有时报一下错误,这是为啥??
错误地址:
错误时间: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;
}
}
...全文
561 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
蔚蓝01 2013-08-22
  • 打赏
  • 举报
回复
还是不对啊。求指导
挨踢蜗牛 2013-02-26
  • 打赏
  • 举报
回复
引用 9 楼 zzccff1 的回复:
看看你在DCOM中找到的Microsoft Excel 应用程序的属性,先看其ID是不是{00024500-0000-0000-C000-000000000046},如果不是,则复制它的ID,打开注册表,定位到HKEY_CLASSES_ROOT\CLSID下,搜索你复制的ID,找到后把它的APPID的值改为{00024500-0000-0000-C000-00000000……
太感谢你了,改完就没有报过错误了,,谢谢
fishstone118 2013-02-21
  • 打赏
  • 举报
回复
我自己用的npoi和epplus整合导出03跟07
挨踢蜗牛 2013-02-21
  • 打赏
  • 举报
回复
嘿,还是有时导的出来,有时导不出来,我用的是excel20007 服务器是 2008r2 iis7.0,又遇到过这种问题的兄弟帮帮忙吧
zzccff1 2013-02-21
  • 打赏
  • 举报
回复
看看你在DCOM中找到的Microsoft Excel 应用程序的属性,先看其ID是不是{00024500-0000-0000-C000-000000000046},如果不是,则复制它的ID,打开注册表,定位到HKEY_CLASSES_ROOT\CLSID下,搜索你复制的ID,找到后把它的APPID的值改为{00024500-0000-0000-C000-000000000046}
孙大诚_SunRobin 2013-02-19
  • 打赏
  • 举报
回复
调用COM组件出问题的时候,很不方便的一点是,只告诉程序员COM组件运行时出错,而没有更具体的信息,顶多是再给你一个错误代码,而这个代码也很宽泛,不详细。所以,遇到这问题的时候,很能从信息上分析。楼主只有一步一步的单步调试。而且,运行到出错地方的时候,就要凭经验来分析改进。
F15Eagle 2013-02-19
  • 打赏
  • 举报
回复
http://www.cnblogs.com/Sue_/articles/2123372.html
md5e 2013-02-19
  • 打赏
  • 举报
回复
NPOI什么都不用管
xiongxyt2 2013-02-19
  • 打赏
  • 举报
回复
检索 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/288366 2、 解决方法如下: 1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应 用程序属性"对话框 5:点击"标识"标签,选择"交互式用户" 6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加 一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限. 7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限. 这样,我们便配置好了相应的Excel的DCOM权限. 注意:这是在WIN2003上配置的,在2000,xp上,是配置ASPNET用户 由于EXCEL是在服务器上打开的,所以应该写一个把导出数据保存在服务器上,然后再传递给客户端的方法,最后每次调 用这个功能的时候再删除以前在服务器上所生成的所有Excel ---------- 我的结果以上两种方法,都不行。 参考多数资料: 简单的记录下自己我解决方法: 1、创建一个用户账号,设置所属于Power User或者User; 2、运行DCOMCNFG,在Dcom组件里面找到Microsoft Excel 应用程序或者Microsoft excel文档-属性-标识里面选择“特定用户”,然后输入前面建立的帐号和密码就可以了; 3、在web.config配置文件里添加一个支点〈identity /〉即可;
挨踢蜗牛 2013-02-19
  • 打赏
  • 举报
回复
引用 4 楼 yyl8781697 的回复:
会不会你导入的文件夹没有写入的权限 之前我也碰到过一次
是有时可以有时不行,郁闷
yyl8781697 2013-02-19
  • 打赏
  • 举报
回复
会不会你导入的文件夹没有写入的权限 之前我也碰到过一次

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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