本方法,将传入的Excel文件内所有的Sheet内的数据都填充入DataSet中。这是一个简单快捷的方法,不足之处是不适合带有格式复杂的Excel文件。(比如:有合并单元格的)
public class ExcelUtil {
public static DataSet GetDataSetFromExcel(string fileName, string sheetName = "", bool firstRowIsHeader = true) {
if (!System.IO.File.Exists(fileName)) throw new ArgumentException("file is not exist!"); var ds =
new DataSet(); var strConn =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='{0}';Extended Properties=Excel 8.0;"; strConn =
string.Format(strConn, fileName); using (var conn = new OleDbConnection(strConn)) { conn.Open(); DataTable excelSchema =
null; string sql = "select * from [{0}]"; var adapter =
new OleDbDataAdapter(); adapter.SelectCommand = conn.CreateCommand();
if (string.IsNullOrEmpty(sheetName)) { excelSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] { null, null, null, "TABLE" }); foreach (DataRow row in excelSchema.Rows) { var sheet = row[
"TABLE_NAME"].ToString(); sql =
string.Format(sql, sheet); adapter.SelectCommand.CommandText = sql; adapter.Fill(ds, sheet); } }
else { sql =
string.Format(sql, sheetName + "{1}quot;); adapter.SelectCommand.CommandText = sql; adapter.Fill(ds, sheetName); } conn.Close(); }
return ds; } }
上面代码中46行的 "quot;" 应为 "$"
Excel查询的时候,加上范围也可以。这样就能指定范围获得数据。比如: (1) string sql = "select * from [{0}A:C]";(2) string sql = "select * from [{0}A1:C100]";
使用:
private void btnExcel2Data_Click(object sender, EventArgs e) { openFileDialog1.Filter =
"Excel Files | *.xls"; var ret = openFileDialog1.ShowDialog();
if (ret == System.Windows.Forms.DialogResult.OK) { DataSet ds = GetDataSetFromExcel(openFileDialog1.FileName,
false); this.dataGridView1.DataSource = ds.Tables[0]; } }