当前位置:编程学习 > C#/ASP.NET >>

C# 读取Excle数据报错,多种解决办法尝试都未能解决,急求帮助

private static DataSet ExcelToDataSet(string excelFile, params string[] excelSheets)
{
            DataSet ds = new DataSet();
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties=\"Excel 12.0;HDR=YES\";";         

            using (OleDbConnection conn = new OleDbConnection(strConn))
            {
                conn.Open();

                if (excelSheets == null) excelSheets = new string[1] { "Sheet1" };

                foreach (string sheet in excelSheets)
                {
                    string strExcel = string.Format("select * from [{0}$]", string.IsNullOrEmpty(sheet) ? "Sheet1" : sheet);

                    using (OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn))
                    {
                        myCommand.Fill(ds, sheet);
                    }
                }
            }
            return ds;
}


服务器环境:Windows 2003 R2 Enterprise x64 Edition Service Pack 2
开发工具:VS2010
Office:Microsoft Office Enterprise 2007
报错信息:The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.

已尝试办法一:安装AccessDatabaseEngine.exe
http://www.cnblogs.com/insus/articles/2008941.html
结果:无任何效果

已尝试办法二:IIS6.0启用32位框架
http://blog.csdn.net/playwarcraft/article/details/4835442
1.用命令启用IIS6.0 32位框架,重启IIS
2.注册.net 4.0框架,重启IIS,启用IIS扩展程序.net 4.0(32bit)
结果:程序不能正常运行

不知道是我找到的办法漏掉了一些细节还是什么问题,本以为第二种办法应该相当靠谱的。

求大神帮忙看看
--------------------编程问答-------------------- 这种方式确实会遇到好多类似的问题。
很头疼的。你这又是 64位系统。

试一试 NPOI 吧 --------------------编程问答-------------------- 已尝试办法三:VS改目标框架为x86
结果:程序不能正常运行(因为项目下调用其他项目和dll插件比较多,很难全部改为x86)

还搜集到其他办法:
1.换第三方插件读取
2.升级服务器到Win2008 64bit
不过这两种都比较耗时,咱不做考虑 --------------------编程问答--------------------
引用 1 楼 mmm306306 的回复:
这种方式确实会遇到好多类似的问题。
很头疼的。你这又是 64位系统。

试一试 NPOI 吧


谢谢,换一下比较费时间,所有想等实在没办法了再做考虑 --------------------编程问答--------------------
引用 2 楼 u011300178 的回复:
已尝试办法三:VS改目标框架为x86
结果:程序不能正常运行(因为项目下调用其他项目和dll插件比较多,很难全部改为x86)

还搜集到其他办法:
1.换第三方插件读取
2.升级服务器到Win2008 64bit
不过这两种都比较耗时,咱不做考虑


暂不做考虑,实在没有其他办法估计就这能这样了 --------------------编程问答-------------------- 提示很明确,还是有什么组件没装,上网多查查看。
--------------------编程问答--------------------  以前读取都是用 NPOI ,楼主百度试试 。 --------------------编程问答--------------------
引用 5 楼 eryongyan 的回复:
提示很明确,还是有什么组件没装,上网多查查看。


主要是office是2007  2007只有32位的
从2010开始office才有64位,但win2003 64bit安装不了office 2010 64bit

从这个思路去搜答案,网上搜到很多都是说安装AccessDatabaseEngine.exe(12.0.4518.1014)
但是我安装之后没有什么效果,是缺少什么配置吗?有没有用过这种办法的 --------------------编程问答-------------------- 我用WIN8 64位,没发现问题,呵呵。 --------------------编程问答-------------------- 先用个WINFORM测试下, 不是操作系统的关系就是OFFICE的问题,先从这方便考虑。 --------------------编程问答-------------------- 解决了,最终还是花了时间用了第三方插件  aspose  

贴子先挂几天再结,看看有没有更好的办法 --------------------编程问答-------------------- 你在抄一个 Microsoft.ACE.OLEDB.12.0 之前应该大概了解一下这是什么。 --------------------编程问答-------------------- 缺少(古老的) MS 数据库引擎组件,你就应该去网上搜一下、或者上微软官网上下载安装包。你去整什么IIS、.net framework那些都是不沾边的。 --------------------编程问答--------------------
引用 12 楼 sp1234 的回复:
缺少(古老的) MS 数据库引擎组件,你就应该去网上搜一下、或者上微软官网上下载安装包。你去整什么IIS、.net framework那些都是不沾边的。
--------------------编程问答-------------------- 我一直都用AccessDatabaseEngine 读取03 07的都正常..只不过 我是用SQL的openrowset读取的 --------------------编程问答--------------------
引用 10 楼 u011300178 的回复:
解决了,最终还是花了时间用了第三方插件  aspose  

贴子先挂几天再结,看看有没有更好的办法


你做那么多做什么哟,
直接用NPOI是最好的,用微软慢慢的你回发现很多问题 --------------------编程问答-------------------- aspose挺好用的,支持。 --------------------编程问答--------------------
引用 3 楼 u011300178 的回复:
Quote: 引用 1 楼 mmm306306 的回复:

这种方式确实会遇到好多类似的问题。
很头疼的。你这又是 64位系统。

试一试 NPOI 吧


谢谢,换一下比较费时间,所有想等实在没办法了再做考虑

首先恭喜你解决了。
Web 对于Excel 和 Word 的操作最好别使用 office组件。
问题多多。。
其实还有一种方式,就是输出XML。。
有 OpenXml 可以看看(对office2003支持不好)或者自己分析下excel2003的xml 输出。
--------------------编程问答-------------------- 是的 office组件真的不好用,
首先是对于没有默认参数的c#,要多写很多
其次是很多参数或返回值是object,经常要类型转化
最后我最痛恨的一点不管怎么关闭文档,进程里的excel都不退出 --------------------编程问答-------------------- 要学会使用工具啊 --------------------编程问答-------------------- excel 数据读取,
http://www.e-iceblue.com/Introduce/excel-for-net-introduce.html

Workbook workbook = new Workbook();

workbook.LoadFromFile(@"..\..\..\..\..\..\Data\DataTableSample.xls");
//Initialize worksheet
Worksheet sheet = workbook.Worksheets[0];

this.dataGrid1.DataSource =  sheet.ExportDataTable();



word文档数据读取
http://www.e-iceblue.com/Introduce/word-for-net-introduce.html --------------------编程问答--------------------
引用 11 楼 sp1234 的回复:
你在抄一个 Microsoft.ACE.OLEDB.12.0 之前应该大概了解一下这是什么。


这个我需要说明下,代码是同事写的,估计是为了节省时间,直接从公司很久之前的系统里拿的封装好的类

我是在客户现场调试发现这个问题的,我也是开发人员,所以就由我负责处理了

我事后也认识到我的过失,因为需求是我负责的,我没有很明确的告知同事客户那边的环境,没有跟进了解同事做出的解决方案 --------------------编程问答--------------------
引用 12 楼 sp1234 的回复:
缺少(古老的) MS 数据库引擎组件,你就应该去网上搜一下、或者上微软官网上下载安装包。你去整什么IIS、.net framework那些都是不沾边的。


我尝试的第一个办法就是安装数据库引擎(AccessDatabaseEngine.exe),我也问题里也提到了,不知道是不是有什么细节遗漏的原因,我安装好没有任何效果。 --------------------编程问答--------------------
引用 15 楼 happy09li 的回复:
Quote: 引用 10 楼 u011300178 的回复:

解决了,最终还是花了时间用了第三方插件  aspose  

贴子先挂几天再结,看看有没有更好的办法


你做那么多做什么哟,
直接用NPOI是最好的,用微软慢慢的你回发现很多问题


aspose刚好公司另外一个项目用过,所以当时选择了aspose

如果是以后做项目,个人也觉得NOPI好一点,不会有版权问题
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,