Feedback

C# - Excel: alle Tabellen über OleDb in DataSet lesen

Veröffentlicht von am 21.09.2007
(5 Bewertungen)
Hier wird gezeigt, wie sämtliche Daten aus einer Excel-Datei über OleDb in ein DataSet eingelesen werden können.

Getestet mit VS 2003 u. Excel 2003
GFU-Schulungen  [Anzeige]

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

Angular mit ASP.NET Core für .NET-Entwickler

.NET ist Ihnen vertraut, als Entwickler verfügen Sie über einschlägige Kenntnisse. In diesem Kurs lernen Sie nun, Angular in .NET-Umgebungen einzusetzen. Sie verstehen das Konzept von Angular und integrieren das clientseitige JS-Framework sicher in.NET-Anwendungen.

/// <summary>
/// Holt die Daten aus einer Excel-Datei in ein DataSet
/// </summary>
/// <param name="excelFile">Pfad zur Excel-Datei</param>
/// <param name="headers">Haben die Tabellenspalten Überschriften</param>
/// <returns>DataSet</returns>
private DataSet GetExcelDataSet(string excelFile, bool headers)
{
	DataSet ds = new DataSet();

	OleDbConnection con = new OleDbConnection();
	con.ConnectionString = "Data Source=" + excelFile + 
		";Provider=Microsoft.Jet.OLEDB.4.0;";
	
	if (headers)
		con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=Yes""";
	else
		con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=No""";
	
	con.Open();
	DataTable sheets = con.GetOleDbSchemaTable(
		OleDbSchemaGuid.Tables, 
		new object[] {null, null, null, "TABLE"});

	foreach (DataRow sheet in sheets.Rows)
	{
		string tableName = sheet["Table_Name"].ToString();
		string sql = "SELECT * FROM [" + tableName + "]";
		OleDbDataAdapter adap = new OleDbDataAdapter(sql, con);
		adap.Fill(ds, tableName);
	}
	
	con.Close();
	return ds;
}
Abgelegt unter Excel, OleDb.

2 Kommentare zum Snippet

Kaffeeholiker schrieb am 06.05.2011:
Super Sache dieses OleDB.
Falls ich einen Feheler bekommen solltet, dass ein Treiber nicht geladen werden kann setzt einfach die Properties in Anführungszeichen. Dann läufts.
Nooa schrieb am 20.11.2012:
Hier auch der Code um auch Excel 2010 zu unterstützen

public static DataSet GetExcelDataSet(string excelFile, bool hasHeaders)
{
var hdr = hasHeaders ? "Yes" : "No";
string strConn;
if (excelFile.Substring(excelFile.LastIndexOf('.')).ToLower() == ".xlsx")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile +
";Extended Properties=\"Excel 12.0 Macro;HDR=" + hdr + ";IMEX=1\"";
else
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties=\"Excel 8.0;HDR=" + hdr +
";IMEX=1\"";

var output = new DataSet();

using (var conn = new OleDbConnection(strConn))
{
conn.Open();

var schemaTable = conn.GetOleDbSchemaTable(
OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"});

if (schemaTable != null)
foreach (DataRow schemaRow in schemaTable.Rows)
{
var tableName = schemaRow["TABLE_NAME"].ToString();

// hier wird kontrolliert ob die zu lesende Tabelle eine Wertetabelle ist, da bei "nicht über Excel geöffneter Tabelle" weitere Tabellenblätter hinzugefügt werden welche zu Fehlern führen
if (tableName.LastIndexOf("'", StringComparison.Ordinal) < tableName.Length - 1)
continue;
try
{
var cmd = new OleDbCommand("SELECT * FROM [" + tableName + "]", conn) {CommandType = CommandType.Text};
var outputTable = new DataTable(tableName);
new OleDbDataAdapter(cmd).Fill(outputTable);
}
catch (Exception ex)
{
throw new Exception(ex.Message + "Sheet:" + tableName + ".File:" + excelFile, ex);
}
}

conn.Close();
}
return output;
}
 

Logge dich ein, um hier zu kommentieren!