Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# odczyt z plików exel i zapis do comboboxa oraz textboxa

saddams85 03 Sty 2012 10:53 5080 15
  • #1 03 Sty 2012 10:53
    saddams85
    Poziom 9  

    Witam czy ktoś wie jak do VC# podpiąć bazę w exelu??
    I jak skojarzyć dane z combobox właśnie z tą bazą?
    Proszę o pomoc

    0 15
  • #2 03 Sty 2012 11:00
    marcinj12
    Poziom 40  

    1. Do .xls'a: biblioteka NPOI
    2. Do .xlsx'a: biblioteka EPPlus
    3. Jeżeli na komputerze jest odpowiedni aparat danych (Microsoft Jet): OLEDB
    To oczywiście tylko przykładowe sposoby. Generalnie wszystko jest wyjaśnione tutaj

    0
  • #3 03 Sty 2012 11:51
    saddams85
    Poziom 9  

    Dzięki za ultra-szybką odpowiedź.
    Ale jak już wiesz i umiesz to mógłbyś mi napisać to krok po kroku??
    Dzięki

    1
  • Pomocny post
    #4 03 Sty 2012 12:26
    marcinj12
    Poziom 40  

    Najprostszy przykład (z zakomentowanym connection string dla dwóch wersji plików):

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    Założenie: baza jest w arkuszu o nazwie Arkusz1, dane są wpisane do kolumny z nagłówkiem Miasto

    0
  • #5 03 Sty 2012 12:57
    saddams85
    Poziom 9  

    Dzięki za odpowiedź.
    Normalnie zostałeś moim "Guru".
    Czy da rade odnieść się wybranej komórki??
    Np. G54?? Pobierz dane z tej komórki??
    Proszę o pomoc

    0
  • #6 03 Sty 2012 13:08
    marcinj12
    Poziom 40  

    Można. Zmień w connection string HDR=No, i odwołuj się do komórki (lub zakresu komórek) tak:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    PS. Jak możesz - kliknij "pomógł" :)

    2
  • #7 03 Sty 2012 13:20
    saddams85
    Poziom 9  

    Te wszystkie informacje zostają w głowie na przyszłość.
    Ale mam teraz jeszcze jeden mały problem.
    TZN.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Podświetla u mnie DataSource i GetData czy mam dodać klase do tych obiektów??
    I czy powinienem dodać jeszcze z menu "project -> addreference->OleDb??
    Dziki za odpowiedź

    0
  • Pomocny post
    #8 03 Sty 2012 13:34
    wiesniak
    Poziom 31  

    Tak nie zadziała. DataSource to właściwość kontrolki ComboBox i służy do przypisywania kolekcji danych. TextBox nie posiada takiej możliwości, ponieważ jedyne, co można w nim wyświetlić, to tekst.

    0
  • #9 03 Sty 2012 13:41
    saddams85
    Poziom 9  

    To jak mogę pobrać np kurs euro z exela i zapisać go w taki sposób aby móc go później wykorzystać??

    0
  • #10 03 Sty 2012 13:44
    marcinj12
    Poziom 40  

    saddams85 napisał:
    I czy powinienem dodać jeszcze z menu "project -> addreference->OleDb??
    Oledb jest z biblioteki System.Data, to ją musisz dodać przez AddReference, chociaż dla domyślnego projektu już jest dodana. Ty musisz jedynie zadeklarować przestrzeń nazw:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Z TextBoxem jest tak, jak Kolega wiesniak wspomniał - jako że wyświetla ona tylko jedno pole z tekstem. W takim wypadku można zastosować prostszą metodę ExecuteScalar, czyli przerobić tą metodę na:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    i przypisać do textboxa przez:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Oczywiście to przy założeniu że chcesz z bazy pobrać i wyświetlić zawartość tylko jednej, konkretnej komórki.

    Jeżeli chcesz pobrać np. kurs euro, który masz zapisany w jednej, konkretnej komórce, to metodą jak wyżej, tylko zamiast zwracać string, lepiej wtedy zwrócić typ Decimal lub Double, oczywiście pamiętając, żeby wynik przypisać do zmiennej odpowiedniego typu, a dopiero potem tą zmienną do TextBoxa konwertując jej wartość .ToString()
    Czyli np. tak by mogła wyglądać przerobiona metoda:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #11 03 Sty 2012 14:26
    saddams85
    Poziom 9  

    Spoko do tego okienka potrzebny mi tylko jedna komórka oczywiście jest tam wiele innych rzeczy które są mi potrzebne. Wyskakuje mi błąd
    Warning 1 Cannot find wrapper assembly for type library "DTSLib". Carl Stahl Konfigurator klasa8 i 10
    Warning 2 The referenced component 'DTSLib' could not be found.
    Dlaczego tak jest??

    0
  • #12 03 Sty 2012 14:42
    marcinj12
    Poziom 40  

    A korzystasz w tym projekcie z jakiś dodatkowych komponentów / bibliotek? Zobacz w referencjach czy nie ma jakiejś biblioteki z żółtym wykrzyknikiem. Wygląda na to, że czegoś brakuje.
    To co masz to nie błąd, tylko warning, program powinien się mimo wszystko skompilować. Możesz też spróbować usunąć cały katalog obj z katalogu z projektem, a potem ponownie otworzyć i skompilować program.

    0
  • #13 03 Sty 2012 15:12
    saddams85
    Poziom 9  

    No sprawdziłem i nie znalazłem żadnego wykrzyknika.
    Podczas debugowania pojawiaja mi sie takie informacje:
    The source file is difrent from when the module was built. Would you like the debugger to use it anyway.
    Klikam tak a potem pokazuje mi się coś takiego:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Aparat bazy danych Microsoft Jet nie może znaleźć obiektu 'H:\Documents and Settings\dadamczyk\Pulpit\CENNIKI ZAWIESIA\kurs.xls'. Upewnij się, że obiekt istnieje, a jego nazwa i nazwa ścieżki podane są prawidłowo.

    0
  • #14 03 Sty 2012 16:19
    marcinj12
    Poziom 40  

    Pierwszy problem - to czy próbowałeś usunąć cały katalog obj z folderu z projektem (zrób przedtem kopię całego projektu na wszelki wypadek)? Spróbuj też usunąć katalogi Debug i Release, oczywiście przy zamkniętym projekcie, a potem otworzyć projekt .sln i przebudować go (Build->Rebuild Solution). Miałem kiedyś podobny problem, jak pracowałem nad jednym projektem w domu i w pracy, ale już nie pamiętam jak to rozwiązałem, możliwe że tak jak to teraz opisałem...

    Drugi błąd - to czy plik .xls jest w podanej lokalizacji na dysku H??
    PS. Rozumiem, że na komputerze gdzie masz Visual Studio jest też Excel zainstalowany?

    Spróbuj utworzyć nowy projekt, dla testów: prosty program w takiej formie, jak Ci przedstawiłem wcześniej (jeden button i textbox). Czy wtedy też masz te komunikaty?

    0
  • #15 04 Sty 2012 09:00
    saddams85
    Poziom 9  

    Witam
    No właśnie zrobiłem tak jak napisałeś:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    I niestety wyskakuje mi ciągle ten błąd.
    OledbException was unhandled
    "Zewnętrzna tabela nie ma oczekiwanego formatu."

    I nie wiem co robię źle.

    0
  • #16 04 Sty 2012 10:35
    marcinj12
    Poziom 40  

    Bo Kolega niedokładnie czyta - a może ja nie dość to zaakcentowałem... ;)
    W kodzie #4 są dwa connection stringi, jeden zakomentowany. Ten zakomentowany jest dla plików xlsx, ten odkomentowany - dla plików xls. Używają innych wersji aparatu danych, i dla łączenia z xlsx musisz zakomentować (lub usunąć) ten pierwszy, a odkomentować drugi.

    Druga sprawa - jeżeli chcesz odczytać wartość tylko jednej komórki, tak jak masz w #15, to użyj kodu który podałem w #10. Jest tam jedna istotna zmiana: parametr HDR w connection stringu jest ustawiony na No, przez co pierwsza odczytana komórka zostanie od razu wykorzystana jako komórka z danymi. W tej wersji którą Ty przedstawiłeś, dostaniesz pustą listę, ponieważ wykonanie readera na zakresie Arkusz1$A1:A1 z HDR=Yes spowoduje, że pierwsza (i jedyna) odczytana wartość zostanie potraktowana jako nagłówek i pominięta w zwracanych danych.

    Podsumowując:
    - chcesz czytać z plików .xls -> użyj connection string z Provider=Microsoft.Jet.OleDb.4.0
    - chcesz czytać z plików .xlsx -> użyj connection string z Provider=Microsoft.ACE.OLEDB.12.0
    - jeżeli w odczytywanym zakresie pierwszy wiersz to nagłówek -> ustaw HDR=Yes, jeżeli nie -> HDR=No
    - jeżeli chcesz odczytać zakres kilku danych, które potem wrzucasz np. do Comboboxa -> użyj kodu #4 z ExecuteReader(),
    - jeżeli chcesz odczytać tylko jedną wartość z konkretnej komórki -> użyj kodu #10 z ExecuteScalar()

    0