当我们采用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列的数据了