使用C#读取excel数据目标平台64位office也是201064位没问题,但是在其他电脑上office为32位出现错误

weixin_40103378 2018-01-22 04:14:38
使用的是vs2010CLR窗体程序,不是C#但是和C#非常类似,代码如下:
public: DataTable ^ getData(String^ path)
{
String^ filename=path;
//String^ filename1=filename->Substring(filename->LastIndexOf("\\")+1);//获取用户选择的不带路径的文件名
String ^fileSuffix=System::IO::Path::GetExtension(filename);//获取文件扩展名
/*if(String::IsNullOrEmpty(fileSuffix))
return nullptr ;*/
DataSet ^ds=gcnew DataSet();
String^ connString;
if(fileSuffix==".xls")
connString="Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source="+filename+";"+
"Extended Properties='Excel 8.0;HDR=No;IMEX=1';";
else connString="Provider=Microsoft.ACE.OLEDB.12.0;"+"Data Source="+filename+";"+
"Extended Properties='Excel 12.0;HDR=No;IMEX=1';";
String ^sql_select="SELECT * FROM [Sheet1$]";
OleDbConnection ^conn=gcnew OleDbConnection(connString);
OleDbDataAdapter^ cmd=gcnew OleDbDataAdapter(sql_select,conn);
conn->Open();
cmd->Fill(ds);
conn->Close();
/*if(ds==nullptr||ds->Tables->Count<=0)
return nullptr;
return ds;*/
DataTable ^dt=ds->Tables[0];
return ds;
}

如题,我在自己电脑上可以运行vs和office都是64的,但是其他电脑是2010office32位的就会出错,运行到conn->Open();这句直接跳出返回空值或报错,System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生;请问64位的项目平台不能读取32位的Excel文件吗(我不想改项目目标平台为32位),如果有办法请指教。
...全文
425 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 9 楼 weixin_40103378 的回复:
[quote=引用 8 楼 xomix 的回复:] excel文件没有任何位数属性,再说一次。 但是excel文件分为2000/97、2003、2007等多个版本。基本上2000/2007是两个大版本,互相之间不能兼容读取的。 我猜你的问题出在这里了。
首先感谢您回答问题,但我想说的是: Excel虽然没有位数属性,但是安装的office有,相应的accessdatabaseEngine也就有位数属性; 你说的版本问题,是否是连接字符串的问题,我已经写在代码中,如果有问题能否指出,能够让大家共同学习,而不是靠猜。[/quote] 我又没有你的com组件或者oledb数据源,又没有你的excel文件,又没有你的环境详细信息,分析你的问题只能靠猜。 我这么猜还是因为你用npoi读取失败才能大致猜到方向的。 就算我有我上面指出的东西,一个论坛可用分,什么也不能买的东西,我还不如写两个简单例子扔到下载里面挣cb快呢,干嘛跟你讨论给你讲怎么办。 另外强烈建议csdn增加block系统,这样有些帖子不想看就不看了。
weixin_40103378 2018-01-22
  • 打赏
  • 举报
回复
引用 8 楼 xomix 的回复:
excel文件没有任何位数属性,再说一次。 但是excel文件分为2000/97、2003、2007等多个版本。基本上2000/2007是两个大版本,互相之间不能兼容读取的。 我猜你的问题出在这里了。
首先感谢您回答问题,但我想说的是: Excel虽然没有位数属性,但是安装的office有,相应的accessdatabaseEngine也就有位数属性; 你说的版本问题,是否是连接字符串的问题,我已经写在代码中,如果有问题能否指出,能够让大家共同学习,而不是靠猜。
  • 打赏
  • 举报
回复
excel文件没有任何位数属性,再说一次。 但是excel文件分为2000/97、2003、2007等多个版本。基本上2000/2007是两个大版本,互相之间不能兼容读取的。 我猜你的问题出在这里了。
  • 打赏
  • 举报
回复
oledb 问题更多,32位和64位的数据源名称都不一样…………
weixin_40103378 2018-01-22
  • 打赏
  • 举报
回复
引用 2 楼 From_TaiWan 的回复:
64,32的问题吧
知道怎么解决吗,除了把他们都对应起来,能不能用64读32的
weixin_40103378 2018-01-22
  • 打赏
  • 举报
回复
引用 3 楼 qq_34798533 的回复:
据说这个可以npoi
我用npoi试了,代码如下 IWorkbook^ workbook = nullptr; //新建IWorkbook对象 String^ fileName = path; FileStream ^fileStream = gcnew FileStream(path, FileMode::Open, FileAccess::Read); if (fileName->IndexOf(".xlsx") > 0) // 2007版本 { workbook = gcnew XSSFWorkbook(fileStream); //xlsx数据读入workbook } else if (fileName->IndexOf(".xls") > 0) // 2003版本 { workbook = gcnew HSSFWorkbook(fileStream); //xls数据读入workbook } ISheet^ sheet = workbook->GetSheetAt(0); //获取第一个工作表 IRow^ row1 = sheet->GetRow(0); //新建当前工作表行数据 array<String^,2>^ numArray=gcnew array<String^,2>(sheet->LastRowNum,row1->LastCellNum); for (int i = 0; i < sheet->LastRowNum; i++) //对工作表每一行 { IRow^ row = sheet->GetRow(i); //row读入第i行数据 if (row != nullptr) { for (int j = 0; j < row->LastCellNum; j++) //对工作表每一列 { numArray[i,j] = row->GetCell(j)->ToString(); //获取i行j列数据 } } } fileStream->Close(); workbook->Close(); 程序运行到workbook = gcnew XSSFWorkbook(fileStream);这句直接跳出,和以前用oledb一样conn->open();直接跳槽是一样的,我感觉就是64位运行平台读取32位excel的问题,请问有办法这样读吗,还是一定要项目是32只能读32位office?
weixin_40103378 2018-01-22
  • 打赏
  • 举报
回复
引用 1 楼 xomix 的回复:
[quote=引用 楼主 weixin_40103378 的回复:] 使用的是vs2010CLR窗体程序,不是C#但是和C#非常类似,代码如下: public: DataTable ^ getData(String^ path) { String^ filename=path; //String^ filename1=filename->Substring(filename->LastIndexOf("\\")+1);//获取用户选择的不带路径的文件名 String ^fileSuffix=System::IO::Path::GetExtension(filename);//获取文件扩展名 /*if(String::IsNullOrEmpty(fileSuffix)) return nullptr ;*/ DataSet ^ds=gcnew DataSet(); String^ connString; if(fileSuffix==".xls") connString="Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source="+filename+";"+ "Extended Properties='Excel 8.0;HDR=No;IMEX=1';"; else connString="Provider=Microsoft.ACE.OLEDB.12.0;"+"Data Source="+filename+";"+ "Extended Properties='Excel 12.0;HDR=No;IMEX=1';"; String ^sql_select="SELECT * FROM [Sheet1$]"; OleDbConnection ^conn=gcnew OleDbConnection(connString); OleDbDataAdapter^ cmd=gcnew OleDbDataAdapter(sql_select,conn); conn->Open(); cmd->Fill(ds); conn->Close(); /*if(ds==nullptr||ds->Tables->Count<=0) return nullptr; return ds;*/ DataTable ^dt=ds->Tables[0]; return ds; } 如题,我在自己电脑上可以运行vs和office都是64的,但是其他电脑是2010office32位的就会出错,运行到conn->Open();这句直接跳出返回空值或报错,System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生;请问64位的项目平台不能读取32位的Excel文件吗(我不想改项目目标平台为32位),如果有办法请指教。
excel文件本身是数据文件,没有平台属性。 出问题的是你调用的com组件。[/quote] 我就没用com组件,用的是oledb
xiaoyu5425 2018-01-22
  • 打赏
  • 举报
回复
据说这个可以npoi
秋的红果实 2018-01-22
  • 打赏
  • 举报
回复
64,32的问题吧
  • 打赏
  • 举报
回复
引用 楼主 weixin_40103378 的回复:
使用的是vs2010CLR窗体程序,不是C#但是和C#非常类似,代码如下: public: DataTable ^ getData(String^ path) { String^ filename=path; //String^ filename1=filename->Substring(filename->LastIndexOf("\\")+1);//获取用户选择的不带路径的文件名 String ^fileSuffix=System::IO::Path::GetExtension(filename);//获取文件扩展名 /*if(String::IsNullOrEmpty(fileSuffix)) return nullptr ;*/ DataSet ^ds=gcnew DataSet(); String^ connString; if(fileSuffix==".xls") connString="Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source="+filename+";"+ "Extended Properties='Excel 8.0;HDR=No;IMEX=1';"; else connString="Provider=Microsoft.ACE.OLEDB.12.0;"+"Data Source="+filename+";"+ "Extended Properties='Excel 12.0;HDR=No;IMEX=1';"; String ^sql_select="SELECT * FROM [Sheet1$]"; OleDbConnection ^conn=gcnew OleDbConnection(connString); OleDbDataAdapter^ cmd=gcnew OleDbDataAdapter(sql_select,conn); conn->Open(); cmd->Fill(ds); conn->Close(); /*if(ds==nullptr||ds->Tables->Count<=0) return nullptr; return ds;*/ DataTable ^dt=ds->Tables[0]; return ds; } 如题,我在自己电脑上可以运行vs和office都是64的,但是其他电脑是2010office32位的就会出错,运行到conn->Open();这句直接跳出返回空值或报错,System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生;请问64位的项目平台不能读取32位的Excel文件吗(我不想改项目目标平台为32位),如果有办法请指教。
excel文件本身是数据文件,没有平台属性。 出问题的是你调用的com组件。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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