如何将所有的Excel工作表导入C#中的DataSet

我为此search了互联网,并不能真正find像这样的问题。 每个人都在寻找一种方法来导入excel文件中的单个工作表,但是我想要的是将文件中的所有工作表导入到DataSet DataTable中,而无需知道工作表名称。

以前我没有用Excel做过很多事情。 这是我在互联网上find的一个示例和部分工作代码,它只parsing给定的工作表名称:

 public static DataSet Parse(string fileName, string workSheetName) { string connectionString = string.Format("provider=Microsoft.Jet.OLEDB.4.0; data source={0};Extended Properties=Excel 8.0;", fileName); string query = string.Format("SELECT * FROM [{0}$]", workSheetName); DataSet data = new DataSet(); using (OleDbConnection con = new OleDbConnection(connectionString)) { con.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter(query, con); adapter.Fill(data); } return data; } 

在上面的代码中,如您所见,应该传入workSheetName,以便查询可以知道在哪里查看导入。 在我的情况下,我希望它遍历所有的表,不pipe他们被命名为like,并将它们导入DataSet单个DataTable

所以实质上,最后的东西将是一个DataSet ,其中每个DataTable包含导入文件中每个工作表的行。

这是一个代码我想出来,它的作品完美,但我看到有人已经添加了一个答案:

 static DataSet Parse(string fileName) { string connectionString = string.Format("provider=Microsoft.Jet.OLEDB.4.0; data source={0};Extended Properties=Excel 8.0;", fileName); DataSet data = new DataSet(); foreach(var sheetName in GetExcelSheetNames(connectionString)) { using (OleDbConnection con = new OleDbConnection(connectionString)) { var dataTable = new DataTable(); string query = string.Format("SELECT * FROM [{0}]", sheetName); con.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter(query, con); adapter.Fill(dataTable); data.Tables.Add(dataTable); } } return data; } static string[] GetExcelSheetNames(string connectionString) { OleDbConnection con = null; DataTable dt = null; con= new OleDbConnection(connectionString); con.Open(); dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if (dt == null) { return null; } String[] excelSheetNames = new String[dt.Rows.Count]; int i = 0; foreach (DataRow row in dt.Rows) { excelSheetNames[i] = row["TABLE_NAME"].ToString(); i++; } return excelSheetNames; } 

因为我很无聊:

  static void Main(string[] args) { string filename = @"c:\temp\myfile.xlsx"; System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.ACE.OLEDB.12.0; " + "data source='" + filename + "';" + "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\" "); myConnection.Open(); DataTable mySheets = myConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); DataSet ds = new DataSet(); DataTable dt; for (int i = 0; i <= mySheets.Rows.Count; i++) { dt = makeDataTableFromSheetName(filename, mySheets.Rows[i]["TABLE_NAME"].ToString()); ds.Tables.Add(dt); } } private static DataTable makeDataTableFromSheetName(string filename, string sheetName) { System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.ACE.OLEDB.12.0; " + "data source='" + filename + "';" + "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\" "); DataTable dtImport = new DataTable(); System.Data.OleDb.OleDbDataAdapter myImportCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + sheetName + "$]", myConnection); myImportCommand.Fill(dtImport); return dtImport; } 

Avitusbuild议的function是正确的,但是有逻辑错误,你必须重写:

 DataTable dtImport = new DataTable(); using ( System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection( "Provider=Microsoft.ACE.OLEDB.12.0; " + "data source='" + filename + "';" + "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\" ")){ using ( System.Data.OleDb.OleDbDataAdapter myImportCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + sheetName + "$]", myConnection)) myImportCommand.Fill(dtImport); } return dtImport; 

这是正确的,否则你必须手动configuration连接和数据适配器。

这可能不是最好的也是最快的,但是它的另一种方式(编辑 – 添加消除空白单元格):

  public static DataSet ReadWorkbook(string excelFileName, bool useFirstRowAsColumnName = false) { var excel = new Microsoft.Office.Interop.Excel.Application(); var workBook = excel.Workbooks.Open(excelFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);//MLHIDE try { System.Data.DataSet ds = new DataSet(excelFileName); foreach (var sheet0 in workBook.Worksheets) { var sheet = (Microsoft.Office.Interop.Excel.Worksheet)sheet0; try { var dt = readSheet(sheet, useFirstRowAsColumnName); if (dt != null) ds.Tables.Add(dt); } finally { releaseObject(sheet); } } return ds; } finally { workBook.Close(true, null, null); excel.Quit(); releaseObject(workBook); releaseObject(excel); } } /// <summary> /// Returns null for empty sheets or if sheet is not found. /// </summary> public static DataTable ReadSheet(string excelFileName, string sheetName, bool useFirstRowAsColumnName = false) { var excel = new Microsoft.Office.Interop.Excel.Application(); var workBook = excel.Workbooks.Open(excelFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);//MLHIDE try { foreach (var sheet0 in workBook.Worksheets) { var sheet = (Microsoft.Office.Interop.Excel.Worksheet)sheet0; try { if (sheet.Name.Equals_Wildcard(sheetName)) { var dt = readSheet(sheet, useFirstRowAsColumnName); if (dt != null) return dt; } } finally { releaseObject(sheet); } } return null; } finally { workBook.Close(true, null, null); excel.Quit(); releaseObject(workBook); releaseObject(excel); } } /// <summary> /// Returns null for empty sheets /// </summary> private static DataTable readSheet(Microsoft.Office.Interop.Excel.Worksheet sheet, bool useFirstRowAsColumnName = false) { using (Dece.Common.BeginChangeCurrentCultureBlock_EN_us()) { var range = sheet.UsedRange; try { object[,] values = (object[,])range.Value2; int rowCount = values.GetLength(0); int colCount = values.GetLength(1); int rowCount0 = rowCount; int colCount0 = colCount; #region find row-col count { bool ok = false; for (int row = rowCount; row > 0; row--) if (!ok) for (int col = colCount; col > 0; col--) { var val = values[row, col]; if ((val != null) && (!System.Convert.ToString(val).IsNullOrEmpty())) { rowCount = row; ok = true; break; } } else break; } { bool ok = false; for (int col = colCount; col > 0; col--) if (!ok) for (int row = rowCount; row > 0; row--) { var val = values[row, col]; if ((val != null) && (!System.Convert.ToString(val).IsNullOrEmpty())) { colCount = col; ok = true; break; } } else break; } #endregion if ((rowCount > 0) && (colCount > 0)) { var dt = new DataTable(sheet.Name); dt.BeginLoadData(); try { for (int col = 1; col <= colCount; col++) dt.Columns.Add_RenameIfRequired(useFirstRowAsColumnName ? values[1, col].ToString_NullProof() : col.ToString()); var arr = new object[colCount]; for (int row = useFirstRowAsColumnName ? 1 : 0; row < rowCount; row++) { for (int col = 1; col <= colCount; col++) arr[col - 1] = values[row + 1, col]; dt.Rows.Add(arr); } } finally { dt.EndLoadData(); } return dt; } else return null; } finally { releaseObject(range); } } } private static void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; throw new Exception("Unable to release the Object " + ex.ToString(), ex);//MLHIDE } finally { GC.Collect(); } }