注意:OleDbConnection这个链接的设置
我最先是设置成:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sExcelFile + ";" + "Extended Properties=Excel 8.0;"
结果:只读取是数值的部分,无法读取文字部分,并且第一行数据读取不到,因为我的Excel表格是数值和文字混合的
之后,我看到了一篇文章,说:
“HDR=Yes;”指示第一行中包含列名,而不是数据,“IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取。
所以我修改成
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sExcelFile + ";" + "Extended Properties=Excel 8.0;HDR=NO;IMEX=1;"
则又出现了个错误:找不到可安装的 ISAM。
之后又改成:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sExcelFile + ";" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"
才成功读取所有的数据
参数理解:
HDR=NO; 是标明第一行不是表头;
IMEX = 1; 是告诉驱动,使用混合类型读取数据;
Excel 8.0 是使用Excel 2003即以下的,如果是2007或者2012,这里得使用Excel 12.0(待测试,那我朋友测试过帮忙通知我一下)
sExcelFile是文件路径,我这里是使用
string str2 = Environment.CurrentDirectory + "\\template.xls";获取得到xls的文件路径,在exe的同级目录。
public void ReadExcel(string sExcelFile, DataTable ExcelTable)
{
DataSet ds = new DataSet();
//Excel的连接
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sExcelFile + ";" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';");
conn.Open();
DataTable schemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
string tableName = schemaTable.Rows[0][2].ToString().Trim();//获取 Excel 的表名,默认值是sheet1
string strSql = "select * from [" + tableName + "]";
OleDbCommand objCmd = new OleDbCommand(strSql, conn);
OleDbDataAdapter myData = new OleDbDataAdapter(strSql, conn);
myData.Fill(ds, tableName);//填充数据
conn.Close();
ExcelTable = ds.Tables[tableName];
}
以上是读取Excel的函数,下面是在按钮事件中调用
//导入数据
private void button2_Click(object sender, EventArgs e)
{
string str2 = Environment.CurrentDirectory + "\\template.xls";
DataTable ExcelTable = new DataTable();
ReadExcel(str2, ExcelTable);
int iColums = ExcelTable.Columns.Count;//列数
int iRows = ExcelTable.Rows.Count;//行数
//定义二维数组存储 Excel 表中读取的数据
string[,] storedata = new string[iRows, iColums];
for (int i = 0; i < ExcelTable.Rows.Count; i++)
for (int j = 0; j < ExcelTable.Columns.Count; j++)
{
//将Excel表中的数据存储到数组
storedata[i, j] = ExcelTable.Rows[i][j].ToString();
}
}
至此可以得到Excel文件的数据,即DataTable ExcelTable里面的数据,或者string[,] storedata里面的数据。