展子希 2016-09-12 08:55 采纳率: 0%
浏览 1718

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条回答

  • 张云勇 2016-09-12 09: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;
    }

    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试