解决采用OLEDB读取EXCEL文件255列限制问题

当我们采用OLEDB的方式读取EXCEL文件的时候,只能读取EXCEL中255列的数据。当我们需要读取的数据超过255列的时候程序就会出错。

比如:

string connstr = “Provider=Microsoft.ACE.OLEDB.12.0;” + “Data Source=” + savepath + “;” + “Extended Properties=‘Excel 12.0 XML;HDR=YES;IMEX=1;’”;
OleDbConnection conn = new OleDbConnection(connstr);
conn.Open();
string cmdText = “select * from [” + sheetname + “$]”;
OleDbCommand cmd = new OleDbCommand(cmdText, conn);
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
DataSet set = new DataSet();
adapter.Fill(set, “data”);
这里datatable里面只有255列数据。但是excel文件里面有4000列.

既然每次只能读取255列的数据,那我们是不是可以分几次读取数据,然后再将数据拼接在一起,这样我们也就实现了读取Eecel文件限制列宽内任意列数的数据。

在这里我们首先要使用以下查询:

SELECT * FROM Project_Data$[RANGE]:[HERE]

但是EXCEL列的范围不是数字而是26个英文字母的组合。所以我们这里要使用一个递归方法将数字列好转换为Excel能识别的字符串列号

    public string GetCExcelColName(int col)
    {
       byte[] array = new byte[1];
       string rtn="";
       int HighData = (col-1) / 26;
       int LowData = (col-1) % 26;
       if (HighData  == 0 )
       {
           array[0] = (byte)(Convert.ToInt32(LowData + 64+1)); //ASCII码强制转换二进制
           rtn = Convert.ToString(System.Text.Encoding.ASCII.GetString(array));//str为ASCII码对应的字符
           return rtn;
       }
       else
       {
           array[0] = (byte)(Convert.ToInt32(LowData +1+ 64)); //ASCII码强制转换二进制
           rtn = GetCExcelColName(HighData) + Convert.ToString(System.Text.Encoding.ASCII.GetString(array));//str为ASCII码对应的字符
       }
       return rtn;
    }

大致方法如下:

    public static DataSet LoadDataFromExcel(string filePath, string name, string range1, string range2)
    {
        try
        {
            string strConn;
            strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
            OleDbConnection OleConn = new OleDbConnection(strConn);
            OleConn.Open();
            string sql = "SELECT * FROM [" + name + "$" + range1 + ":" + range2 + "]";//可是更改Sheet名称,比如sheet2,等等    
            OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);
            DataSet OleDsExcle = new DataSet();
            OleDaExcel.Fill(OleDsExcle, name);
            OleConn.Close();
            return OleDsExcle;
        }
        catch (Exception err2)
        {
            ErrorInfo = "数据绑定Excel文件:" + filePath + "的 Sheet: " + name + " 失败!\n原因:" + err2.Message;
            MessageBox.Show(ErrorInfo);
            return null;
        }
    }

    public ExeclHelper(string filePath, string sheetName,int range1,int range2)
    {
        for(int i =range1;i<=range2;i=i+255)
        {
            DB = LoadDataFromExcel(filePath, sheetName, GetCExcelColName(i), GetCExcelColName(i+255));
            if (DB != null)
            {
                if (i == range1)
                    Table = DB.Tables[0];
                else
                    Table.Merge(DB.Tables[0]);
            }
        }
    }

我们在加载Excel时只需要指定一个列的范围就可以了

比如:

TestPoints = new ExeclHelper(“CALData_TLL.xlsx”, “CALData_TLL”, 1, 1000);

TestPoints.GetData(“777”, out dTLL, true);

这样我们就能直接获取到第777列的数据了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值