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

C# - Tworzenie Excela z DataGridView + macro

23 Lip 2014 11:22 2091 13
  • Poziom 14  
    Cześć.

    Gdzieś w internetach znalazłem takie kody:

    na tworzenie pliku excel z przykładowymi danymi wraz z makrami:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    oraz export danych z DatagridView do excela:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Czy mógłby ktoś połączyć te dwa kody tak, aby zaciągało dane z datagridview do excela i tworzyło makra? (oczywiście wiem, że jest tutaj przykładowe "puste" makro, ale o samo makro tu nie chodzi).

    Z góry dziękuję za pomoc
  • Poziom 14  
    Nikt mi nie pomoże przekształcić tego?
  • Poziom 40  
    Zapis do CSV to zupełnie inny sposób zapisu, niż do Excela przy wykorzystaniu Interopa, nie można tych kodów tak po prostu skleić...
    Generalnie tam gdzie wypisujesz dane w Intropie, musisz je wypisywać jako:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Pokombinuj najpierw sam, pokaż co nie działa, może wtedy ktoś pomoże...

    A tak zupełnie na marginesie, to są lepsze sposoby niż Interop: ja polecam bibliotekę NPOI jeżeli musisz mieć zapis do .xls lub EPPlus, jeżeli może być .xlsx(m).
  • Poziom 14  
    Dzięki za podpowiedź.

    Tak więc zrobiłem coś takiego:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Problem jest z :

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Wyskakuje błąd:

    Error 1 Non-invocable member 'Microsoft.Office.Interop.Excel._Application.Cells' cannot be used like a method.

    A po drugie
    jak dodać te macro :(

    Edit:

    Może prosciej byłoby otwierać plik excelowski i wczytywać dane z datagrid na pierwszą stronę i zapisać, a w samym pliku zrobić macro?
  • Poziom 40  
    Zwróć uwagę na przykład - tam używa się kwadratowych nawiasów .
  • Poziom 14  
    Tak. Nie zauważyłem.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Oczywiście musiał się pojawić problem. Jak już wyeksportuje to otwiera mi się pusty excel(nawet kratek nie ma).
  • Poziom 40  
    Użyj jako wyjściowego w całości ten kod, który znalazłeś na początku. Potem zastęp fragment wstawiający przykładowe dane i użyj swoich linijek.
  • Poziom 14  
    Kurcze, nie umiem sobie dać z tym rady tak aby wykonywało się to po kliknięciu na button "export do excela"
    Mógłbyś mi poradzić/pomóc/powklejać to prawidłowo ? :)

    Całość, po wielu próbach wygląda tak (możliwe, że wszystko już jest źle):

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 40  
    Wspominałem już o EPPlus?
    1. Pobierz stąd bibliotekę.
    2. Upewnij się, że projektu w VS nie kompilujesz do wersji Client.
    3. Bibliotekę EPPlus.dll dołącz przez referencję do projektu.
    4. Stwórz w Excelu szablon z makrem, formatowaniem etc.
    5. Kod zapisujący dane z tabeli będącej źródłem dgv do szablonu to (uwaga...)
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    Nie ma potrzeby mieć nawet zainstalowanego Excela.

    Możesz umieścić szablon w zasobach i przerobić kod aby stamtąd go pobierał, możesz przerobić tak, aby kopiować tabelę bez nagłówków, a użyć tych z dgv etc.
  • Poziom 14  
    Dzięki wielkie.

    Oczywiście nie może być tak pięknie.
    Zrobiłem coś takiego:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    po kliknięciu:
    blad w linijce
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    An unhandled exception of type 'System.ArgumentNullException' occurred in EPPlus.dll
    Additional information: Wartość nie może być zerowa.


    :( Co robię nie tak?

    (ps. Tak swoją drogą to faktycznie- dwie linijki kodu i po sprawie.)

    Edit:

    zmieniłem ścieżki i rozszerzenia plików(takie jakie napisałeś) - pomyślałem, że mogą być problemy z dostępem do C:\\

    teraz błąd w linijce:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    An unhandled exception of type 'System.Collections.Generic.KeyNotFoundException' occurred in mscorlib.dll
    Additional information: Dany klucz nie był obecny w słowniku.
  • Pomocny post
    Poziom 40  
    kafus6 napisał:
    po kliknięciu:
    blad w linijce

    Kod C# - [rozwiń]
    worksheet.Cells[1, 1].LoadFromDataTable(dataGridView1.DataSource as DataTable, true);



    An unhandled exception of type 'System.ArgumentNullException' occurred in EPPlus.dll
    Additional information: Wartość nie może być zerowa.

    Założyłem, że podpinasz do dgv datatable bezpośrednio, ale widzę, że używasz binding source - w takim razie przekaż bindingSource.DataSource albo rzutuj:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 14  
    Ha! Działa jak należy. Jesteś pierwszym ludziem, który mi konkretnie pomógł! :)
    Dzięki wielkie.

    Tzn. kod działa, tabele faktycznie kopiują się, ale działa tylko z rozszerzeniem xlsx, ale to chyba (mam taka nadzieję przynajmniej), że w praktyce niczego nie zmienia.

    Edit: ok. działa z xlsm również.

    Nie umiem jednak stworzyć szablonu(a w zasadzie wykresu), dzięki któremu mogę zmienić zakres danych, który odpowiada faktycznemu wypełnieniu komórek. Ale to już jest sama sprawa excela a nie c#.
  • Pomocny post
    Poziom 40  
    kafus6 napisał:
    Nie umiem jednak stworzyć szablonu(a w zasadzie wykresu), dzięki któremu mogę zmienić zakres danych, który odpowiada faktycznemu wypełnieniu komórek. Ale to już jest sama sprawa excela a nie c#.
    O, na to też są metody...
    Można np. użyć dynamicznego zakresu.
    Zakładając, że masz nagłówek w pierwszym wierszu, w komórkach A2...Ax masz etykiety, a w C2...cx odpowiadające im wartości, musisz zrobić to tak:

    1. Formuły->Definiuj nazwę
    Nazwa: etykiety
    Odwołuje się do:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    2. Formuły->Definiuj nazwę
    Nazwa: wartosci
    Odwołuje się do:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    3. Wstaw np. wykres kolumnowy, prawym->zaznacz dane.
    - w okienku "Wpisy legendy (serie danych)" kliknij Dodaj,
    - w "Nazwa serii" wpisz jakąś nazwę,
    - w "wartości serii" wpisz =Arkusz1!wartosci

    4. W okienku "Etykiety osi poziomej (kategorii)" wpisz =Arkusz1!etykiety

    Zatwierdź i wyjdź z kreatora. Sformatuj wykres pod swoje potrzeby.

    5. Usuń dane z szablonu, ale zostaw jedną linijkę, żeby formuły nie sypały błędem.

    I już... Dynamiczny wykres gotowy...
  • Poziom 14  
    No masz... jakie to łatwe :) dzięki raz jeszcze.


    Nie zamykam tematu bo jeszcze mogą pojawić się jakieś pytania.