[C#] Tabela z Pliku xls razem z pierwszym wierszem, jak?


(A2395744) #1

Mam taki kod:

String ConnectionStringXLS = @"Provider = Microsoft.Jet.OLEDB.4.0; " +

                                                 @"Data Source = " +

                                                 //@"C:\Users\Wojdav\Desktop\Files\Plik 1.xls; " +

                                                 tŚcieżki[i] + @"; " +

                                                 @"Extended Properties = " +

                                                 @"""Excel 8.0; HDR = NO;""";

                    da = new OleDbDataAdapter(efm_TextBox_ZapytanieSQL.Text, ConnectionStringXLS);

                    da.Fill(dt);

                    if (Schemat)

                    {

                        _dt = dt.Clone();

                        Schemat = false;

                    }

                    foreach (DataRow row in dt.Rows)

                    {

                        Console.WriteLine(row.ItemArray[0] + "; " + row.ItemArray[1] + "; " + row.ItemArray[2] + ";");

                        _dt.ImportRow(row);


                    }

                    dt.Clear();

Oczywiście wcześniej jest pętla i zmienne są zadeklarowane.

Mój problem polega na tym, że pierwszy wiersz arkusza exelowskiego jest brany jako nazwa dla kolumn w datatable, jak to zmienić.

Przy czym od razu mówię, że kombinowałem z opcję HDR=YES/NO i to nic nie daje.

Jest na to jakiś sposób/ doradźcie mi coś.

Z góry dziękuję za pomoc.


(Tomek Matz) #2

Musiałbyś bliżej przyjrzeć się temu swojemu łańcuchowi połączenia. Wydaje mi się, że tutaj jest gdzieś błąd. Może to kwestia jakiejś spacji? średnika? Ja u siebie na MS Office 2007 przetestowałem taki kod (powinien też działać ze starszą wersją 2003, nie jestem pewien co do 2010) i działa jak trzeba:

private DataTable GetExcelData(string filePath, string query)

{

    DataTable dt = null;

    OleDbDataAdapter adapter = null;

    OleDbConnection conn = null;


    try

    {

        dt = new DataTable();

        conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;"

            + "Data Source=" + filePath + ";"

            + "Extended Properties=\"Excel 12.0 Xml;HDR=No\";");

        adapter = new OleDbDataAdapter(query, conn);


        adapter.Fill(dt);

        return dt;

    }

    catch (Exception ex)

    {

        throw ex;

    }

}

i jeszcze wywołanie metody:

DataTable dt = this.GetExcelData("test.xls", "Select * From [Arkusz1$]");

Kod ten działa zarówno z arkuszem excela zapisanym jako xls oraz jako xlsx. Oczywiście łańcuch połączenia powinien zostać zapisany w pliku konfiguracyjnym aplikacji. Polecam także tą stronę: http://www.connectionstrings.com/


(Somekindsoftware) #3

Przepraszam, czemu się przyjrzeć?


(Tomek Matz) #4

?


(Somekindsoftware) #5

Co to jest "łańcuchowi połączenia"? Bo napisałeś, żeby temu czemuś się przyjrzeć.


(Tomek Matz) #6

Taki jest polski odpowiednik dla "connection string". BTW +1 (w zasadzie teraz już +2).

EDIT: Chyba, że masz na myśli odmianę. Sugerowałem się tym słownikiem http://www.sjp.pl/co/%B3a%F1cuch.


(Somekindsoftware) #7

Aha... Wybacz niezrozumienie, po prostu pierwsze widzę, żeby ktoś to tłumaczył. No bo co to jest "connection string" wie prawie każdy programista, a "łańcuch połączenia" to brzmi tak jakby coś było łączone i tworzyło łańcuch... nie wiem, dla mnie tłumaczenie tego tylko zaciemnia sens.


(Tomek Matz) #8

No cóż, takie tłumaczenie się u nas przyjęło (również w polskiej literaturze). Czy oddaje ono w wystarczającym stopniu sens terminu? Pewno nie, ale co zrobić. I tak IMO nie jest wcale tak źle (wystarczy spojrzeć na tłumaczenia niektórych tytułów filmów :D). Niby faktycznie używanie angielskich nazw jest często łatwiejsze, ale ich polskie odpowiedniki też warto znać. Przydaje się w trakcie pisania prac w naszym języku.


(A2395744) #9

matzu dzięki za łańcuch połączenia/connection string. Twój mi działa, coś musiało być nie tak. Wielkie dzięki za pomoc.

edit: poza tym zmieniłem obiekt połączenia ze String na OleDBConnection


(Tomek Matz) #10

Nie ma za co. Pisałem Ci co jest nie tak. Zwróć uwagę na spacje i średniki. Przykładowo zrób coś takiego

HDR = No

i też nie będzie działać. No i Extended Properties powinieneś dobierać w zależności od zainstalowanej na komputerze wersji Excela.