středa 21. října 2009

.NET a C#: Čtení dat z excelu pomocí ADO.NET

Ukážu velice jednoduchý způsob jako pomocí ADO.NET načíst data z excelového souboru.

internal static DataTable VratTabulkuZExcelu(string cestaKExcelSouboru, string nazevListu)
{
OleDbDataAdapter odbaAdapter = new OleDbDataAdapter();
string connectString = VratConnectStringExcel(cestaKExcelSouboru);
OleDbConnection odbcPripojeni = new OleDbConnection(connectString);
OleDbCommand selectPrikaz = new OleDbCommand();
selectPrikaz.Connection = odbcPripojeni;
selectPrikaz.CommandText = "SELECT * FROM [" + nazevListu + "$]";
odbaAdapter.SelectCommand = selectPrikaz;
DataTable dtVyslednaTabulka = new DataTable();
try
{
odbcPripojeni.Open();
odbaAdapter.Fill(dtVyslednaTabulka);
}
catch (Exception e)
{
dtVyslednaTabulka = null;
}
finally
{
if (odbcPripojeni.State != ConnectionState.Closed)
{
odbcPripojeni.Close();
}
}
return dtVyslednaTabulka;
}
Connection string k pripojeni excelového souboru vypadá takto:
Provider=Microsoft.Jet.OLEDB.4.0; Data Source = excelSoubor.xls; Extended Properties="Excel 8.0;HDR=YES; IMEX=1"
Data Source - úplná cesta k souboru
HDR = YES - značí, že prní řádek obsahuje názvy sloupců a žádná data
IMEX = 1 - vždy číst data ze smíšených sloupců (sloupce obsahující čísla, datumy, řetězce...) jako textové řetězce. Může mít vliv na výkon.

Metoda na dynamické sestavení connection stringu:
public static string VratConnectStringExcel(string cestaKSouboru)
{
string jmenoSouboru = Path.GetFileName(cestaKSouboru);
string castPredCestou = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|";
string zaCestou = @"; Extended Properties=""Excel 8.0;HDR=YES;""";

string connectStringExcel = castPredCestou +
jmenoSouboru + zaCestou;
return connectStringExcel;
}

2 komentáře:

  1. Jo, jen pozor na 64bitech to nefunguje

    OdpovědětVymazat
  2. Děkuji za poznámku. Každopádně "nefunguje" je dost obecný pojem, mohl bys to trošku upřesnit, na čem to přesně padá, nebo jak to vyřešit?

    OdpovědětVymazat