展子希 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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘