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
/// <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!