2 sxz787899 sxz787899 于 2016.09.12 16:55 提问

C# 以OleDB方式读取Excel07版本时出现奇葩异常,求高手解释!!!

我在以OleDB方式读取Excel(07版本)时,开发环境一切正常,测试环境却出现问题,只能读出一列数据,经过测试,发现是因为我在Excel中对一列数据同时设置了“分列”+“筛选”,结果就只读出了这一列数据,其他数据都不读取了,但是如果保存成97-03版本的Excel时,读取就正常了。
问题描述:
1、C# OleDB方式读取Excel
2、Excel版本2007以上
3、Excel中对同一列设置了“分列”+“筛选”
4、开发环境正常。测试环境只读设置了“分列”+“筛选”的这一列
5、Excel保存成97-2003版本时,测试环境读取正常
读取Excel代码:

//数据表
                DataSet ds = new DataSet();
                //获取文件扩展名
                string strExtension = System.IO.Path.GetExtension(strExcelPath);
                string strFileName = System.IO.Path.GetFileName(strExcelPath);
                //Excel的连接
                OleDbConnection objConn = null;
                //HDR=Yes,这代表第一行是标题,不做为数据使用
                //IMEX 0:写入 1:读取 2:读取 写入  
                switch (strExtension)
                {
                    case ".xls":
                        objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\"");
                        break;
                    case ".xlsx":
                        objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1;\"");
                        break;
                    default:
                        objConn = null;
                        break;
                }
                if (objConn == null)
                {
                    return null;
                }
                objConn.Open();
                //获取Excel中所有sheet表的信息
                DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
                //获取Excel的第一个Sheet表名
                string tableName = schemaTable.Rows[0][2].ToString().Trim();
                string strSql = "select * from [" + tableName + "]";
                //获取Excel指定Sheet表中的信息
                //OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
                OleDbDataAdapter myData = new OleDbDataAdapter(strSql, objConn);
                myData.Fill(ds, tableName);
                objConn.Close();

                return ds;



1个回答

yongyong521
yongyong521   2016.09.12 17:30

switch (version)
{
case ExcelVerion.Excel2003: //读取Excel97-2003版本
connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";
break;
case ExcelVerion.Excel2007: //读取Excel2007版本
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0 XML;HDR=YES';data source=" + ExcelFilePath;
break;
}

Csdn user default icon
上传中...
上传图片
插入图片