logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C# - Jak dodać makro do Excela generowanego z DataGridView?

kafus6 23 Lip 2014 11:22 2448 13
REKLAMA
  • #1 13818076
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Cześć.

    Gdzieś w internetach znalazłem takie kody:

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


    oraz export danych z DatagridView do excela:

    Kod: C#
    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
  • REKLAMA
  • #2 13823280
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Nikt mi nie pomoże przekształcić tego?
  • #3 13823528
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    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: C#
    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).
  • REKLAMA
  • #4 13825049
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Dzięki za podpowiedź.

    Tak więc zrobiłem coś takiego:

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Problem jest z :

    Kod: C#
    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?
  • #5 13825480
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Zwróć uwagę na przykład - tam używa się kwadratowych nawiasów .
  • REKLAMA
  • #6 13825678
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Tak. Nie zauważyłem.

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Oczywiście musiał się pojawić problem. Jak już wyeksportuje to otwiera mi się pusty excel(nawet kratek nie ma).
  • #7 13825742
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    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.
  • #8 13825911
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    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: C#
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 13826056
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    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: C#
    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.
  • REKLAMA
  • #10 13826107
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Dzięki wielkie.

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

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    po kliknięciu:
    blad w linijce
    Kod: C#
    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: C#
    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
    #11 13826142
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    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: C#
    Zaloguj się, aby zobaczyć kod
  • #12 13826173
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    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
    #13 13826718
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    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: text
    Zaloguj się, aby zobaczyć kod


    2. Formuły->Definiuj nazwę
    Nazwa: wartosci
    Odwołuje się do:
    Kod: text
    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...
  • #14 13827379
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    No masz... jakie to łatwe :) dzięki raz jeszcze.


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

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy dodawania makr do plików Excel generowanych z komponentu DataGridView w C#. Użytkownik początkowo korzystał z Microsoft.Office.Interop.Excel, ale otrzymał sugestie, aby rozważyć użycie bibliotek NPOI lub EPPlus, które oferują prostsze metody zapisu danych do plików Excel. Użytkownik z powodzeniem zaimplementował kod do eksportu danych z DataGridView do pliku Excel, jednak napotkał problemy z rzutowaniem danych z BindingSource. Ostatecznie, po wskazówkach dotyczących użycia dynamicznych zakresów w Excelu, udało mu się rozwiązać problem i uzyskać działający kod, który zapisuje dane w formacie .xlsx oraz .xlsm.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA