这里提供一个更加方便的办法, 不过前提是第一行必须是作为字段名或者第一行的数据类型就为字符型. 这样一说, 大家就明白了. 首先修改连接字符串为:
- view source
- print ?
- //2003(Microsoft.Jet.Oledb.4.0)
- string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);
- //2010(Microsoft.ACE.OLEDB.12.0)
- string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);
这里将 HDR 设为 NO, 因为我就是将第一行做为数据读取, 而 IMEX=1 就表示根据前 8 行判断列的数据类型, 如果有字符型数据, 那么就强制混合数据转换为 文本. 这里就明白为什么要保证第一行为字符型的原因了. 能将列的数据类型强制设为字符型, 那么列中出现什么类型的数据都不怕了. 需要做的工作就是, 在获取 完数据后, 将字段名重新设置, 并删除第一条记录即可. 代码如下:
- view source
- print ?
- 01. DataTable dt = new DataTable();
- 02.
- 03. using(OleDbCommand cmd = new OleDbCommand()){
- 04. cmd.Connection = conn;
- 05. cmd.CommandType = CommandType.Text;
- 06. cmd.CommandTimeout = 6;
- 07. cmd.CommandText = string.Format("select * from [{0}$]", sheetName);
- 08.
- 09. OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
- adapter.Fill(dt);
- }
- if (dt.Rows.Count> 0) {
- DataRow dr = dt.Rows[0];
- for (int col = 0; col < dt.Columns.Count; col++) {
- dt.Columns[col].ColumnName = dr[col].ToString();
- }
- dt.Rows[0].Delete();
- dt.AcceptChanges();
- }
来源: http://www.bubuko.com/infodetail-2600667.html