Schichtplan Windows Forms / Excel integration?

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Sgt.FloydPepper.

    Schichtplan Windows Forms / Excel integration?

    Guten Morgen zusammen,

    Aufgrund unseres umfangreichen Schichtplans, möchte ich diesen als Anwendung mit WindowsForms realisieren!
    Ich benötige eure Unterstützung/Tipps wie ich das am besten realisieren kann/soll!

    Gibt es eine Excel Tabellen Integration in VisualStudio/WindowsForms?

    Ein BIld als Beispiel habe ich upgeloaedet.

    Ich freue mich auf eure Ideen/Vorschläge/Ansätze

    bg andy

    *Thema aus dem WPF Bereich verschoben - Bitte nächstes mal daran denken @andseta ~NoFear23m*
    Bilder
    • Bild1.png

      808,83 kB, 2.000×665, 140 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Ich an Deiner Stelle würde bei Excel bleiben. Das ist ein hervorrangendes Werkzeug für solche Sachen, welches ich auf der Arbeit auch gerne verwende.
    Der Zeitaufwand für eine WindowsForms Anwendung dürfte um ein vielfaches höher sein. Wie viel Erfahrung beim Programmieren hast Du?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Hallo @andseta Ich würde auch bei Excel bleiben. Wenn du es mit einem Programm löst, kann das Ganze natürlich Vorteile haben, die Excel nicht bietet weil man einige Sachen schnell übersehen würde. Zum Beispiel kannst du dann
    • mit Ruhezeiten für die Arbeitnehmer nicht durcheinanderkommen (Programm sagt „Mitarbeiter hat so weniger als 11 Stunden Ruhezeit“)
    • eine richtige Rotation ist möglich (A arbeitet mit B, nächsten Tag A mit C, dann B mit C → wenn du jetzt B mit A einsetzt, wird erkannt, dass A mit B schon dran war)
    • und wenn du die Benutzeroberfläche schön und sinnvoll gestaltest, wird es auch einfacher sein, mit Datumsangaben / Zeitplänen umzugehen.
    Gibt es eine Excel Tabellen Integration in VisualStudio/WindowsForms?

    Ja, siehe Quellcode. Ist aus einer
    VB.Net-WinForms-Anwendung, du hast diesen Forumsthread mit WPF getaggt. Sollte aber umsetzbar sein. Dieses Testprogramm erstellt eine völlig neue Excel-Datei und schreibt die Zahlen 1 bis 1000 rein. Die Auswahl des Speicherverzeichnisses erfolgt vorher über einen SaveFileDialog.
    Noch ein paar Dinge der Vollständigkeit halber. Ich habe dies wie gesagt als Testprojekt geschrieben und wollte mal schauen, was alles machbar ist. Daher ist es etwas Overkill
    :whistling: . Zum Einen ist hier eine asynchrone Verarbeitung drin, das heißt, während die Prozedur für das Befüllen der Exceldatei rödelt, hängt das Programm nicht, weil ein zweiter Thread genutzt wird. Bei größeren Vorgängen ist das sehr nützlich. Aber alles, was mit der Interaktion mit dem Benutzer zu tun hat, muss auf dem GUI-Thread laufen, daher muss man einige Sachen wieder rüberziehen, deswegen Me.Invoke().
    Des Weiteren muss man ja immer aufräumen, das macht man normalerweise durch Verwendung von Using [Datei hier] End Using bzw [Datei].Dispose(), aber bei MS-Office im Code muss man System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorksheet) verwenden, um die Datei / Ressourcen wieder freizugeben.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.WindowsAPICodePack.Dialogs
    3. Public NotInheritable Class Form1
    4. Private xlApp As Excel.Application
    5. Private myWorkbook As Excel.Workbook
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Me.Location = New Point(0, 0) ' Programm startet links oben.
    8. End Sub
    9. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Await Task.Run(Sub() Schreiben())
    11. End Sub
    12. Private Sub Schreiben()
    13. Dim Pfad As String
    14. Using SFD1 As New CommonSaveFileDialog
    15. SFD1.Title = "Exceldatei speichern"
    16. SFD1.Filters.Add(New CommonFileDialogFilter("Excel", ".xlsx"))
    17. If System.IO.Directory.Exists("‪C:\Users\...\source\repos\VB.NET\in Exceldatei schreiben") Then
    18. SFD1.InitialDirectory = "‪C:\Users\...\source\repos\VB.NET\in Exceldatei schreiben"
    19. Else
    20. SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    21. End If
    22. Dim Result As CommonFileDialogResult
    23. Me.Invoke(Sub() Result = SFD1.ShowDialog())
    24. If Result = CommonFileDialogResult.Ok Then
    25. Pfad = SFD1.FileName & ".xlsx"
    26. Else
    27. Return
    28. End If
    29. End Using
    30. Me.Invoke(Sub() Button1.BackColor = Color.FromArgb(255, 255, 0)) ' Button wird gelb
    31. xlApp = New Excel.Application
    32. xlApp.Visible = True
    33. myWorkbook = xlApp.Workbooks.Add()
    34. Dim myWorksheet As Excel.Worksheet = CType(myWorkbook.Sheets("Tabelle1"), Excel.Worksheet)
    35. For i As Integer = 1 To 1000 Step 1 'Muss bei 1 anfangen!
    36. myWorksheet.Cells(i, 1) = i
    37. Next
    38. myWorksheet.SaveAs(Pfad, Excel.XlFileFormat.xlWorkbookDefault)
    39. myWorkbook.Close()
    40. xlApp.Quit()
    41. If myWorksheet IsNot Nothing Then
    42. System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorksheet)
    43. End If
    44. If myWorkbook IsNot Nothing Then
    45. System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorkbook)
    46. End If
    47. If xlApp IsNot Nothing Then
    48. System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
    49. End If
    50. xlApp = Nothing
    51. myWorkbook = Nothing
    52. myWorksheet = Nothing
    53. Me.Invoke(Sub() Button1.BackColor = Color.FromArgb(0, 255, 0)) ' Button wird grün, zum Zeichen, dass fertig!
    54. End Sub
    55. End Class



    Nun hast du ersteinmal etwas zum Lesen
    Bilder
    • GUI.png

      7,62 kB, 557×343, 123 mal angesehen
    • download this via NuGet.png

      37,98 kB, 1.027×380, 121 mal angesehen
    @Bartosz

    Vielen Dank für deine ausführliche Antwort und somit deiner Zeitnahme!
    Ich möchte aus verschiedenen Gründen nicht bei Excel bleiben!

    1. Wir haben in Europa über 170 Standort und IRGENDWANN soll dieser TestProjektAnsatz von einer Fachabteilung professional umgesetzt werden!
    2. Die aktuelle Ladezeit dieses Files ist nicht handlebar, sowie mehrfach Zugriff macht es uns schwer!
    3. Ich möchte eine ansehnliche Oberfläche gestalten!

    All zu viele funtionen soll dieses Projekt erstmal garnicht haben wie Ruhepausen etc. lediglich ersichtlich, welcher Mitarbeiter ist an Tag XY vor Ort/Urlaub/Schulung etc.
    Wenn das geschafft ist wird jedes Info wie U,Urlaub N,Nachtischt usw. in eine Datenbank geschrieben damit mehrere den aktuellen zugriff haben etc.

    Deswegen nochmal die Frage zur Gestaltung mehrerer Zellen für U=Urlaub,N,S usw...

    Ideen?

    danke vorab
    Eine Integration von Excel-Arbeitsblätter oder Excel-Tabellen in Winform- oder WPF-Anwendungen gibt es nicht oder ist mir zumindest nichts bekannt.
    Wie @Bartosz schon erklärte, kann man Excel-Arbeitsbücher aus Dot-Net Anwendungen heraus erzeugen, allerdings würde ich dazu EPPlus empfehlen.
    Version 4.5.3.3: github.com/JanKallman/EPPlus
    Version >= 5: nuget.org/packages/EPPlus/5.6.3/license

    Da das für dich aber gar nicht in Frage kommt, stellt sich für mich eine ganz andere Frage. Nämlich, kannst du überhaupt einen Leistungskatalog erstellen?
    Du musst nämlich genau beschreiben, was das Wunschprogramm in seiner größten und umfangreichsten Ausbaustufe können muss.
    Daraus wird sich ergeben, dass man ein Datenmodel benötigt und eine Datenbank aufbaut, das dir weltweit? alle benötigten Daten vorhält.
    Dann brauchst du eine Anwendung, die dir diese Daten so präsentiert, wie du sie benötigst. Ob das eine Windowsanwendung sein wird (dann aber bitte nicht Winforms) oder bei nicht gleich eine Web-Applikation ist wieder eine andere Entscheidung.
    Meiner Meinung nach dürften hier die wenigsten Forumsmitglieder eine ädequate Antwort geben können, einige sind vielleicht dazu berufen. Bis jetzt war offensichtlich noch kein Berufener dabei...

    Nachtrag: Was für ein Budget steht dir denn überhaupt zur Verfügung? steht dir überhaupt eines zur Verfügung? Ich denke nicht, dass hier 5 stellige Eurobeträge reichen, nur mal so als Grobabschätzung.
    Hallo andseta!

    Du bist jetzt der zweite hier im Forum, der seine Sätze immer zu rufen geneigt ist!
    Nicht so schlimm - das kann ich auch!!

    Zur Frage!
    So eine Anwendung muss auf einem relationalen Datenmodell basieren!
    Wenn du nicht weisst was das ist, dann musst du ganz ganz viele neue Sachen lernen!
    Hier wird das Instrumentarium gezeigt, mit dem du umzugehen lernen musst!
    vier Views-Videos!
    Da gibts glaub auch einen Link auf ein Grundlagen-Tutorial zum Thema Datenmodell!
    Ich wiederhole! Ohne dieses KnowHow ist dein Projekt zum Scheitern verurteilt!
    Aber es lohnt sich!
    Das Knowhow wird dir wohl in 90% von allem nützen, was du noch jemals programmieren wirst!
    ... when i was not clear enough!

    Bitte entzieht euch der Kompläxitat :)
    Aktuell beschriebne Aufgabe bevor hier irgendwas mit Datenbanken, und Windowsanmeldungen weil Standortübergreifend ins Spiel kommt...
    Es soll eine einfache Excel Tabelle in einer WindowsForm erstellt werden, da das nicht möglich ist - wollte ich eine alternative wissen :)

    Soll ich eventuell von WindowsForms weg und auf eine Webbasierende Lösung wechseln? Wenn ja, welche Startporjektauswahl muss ich bei VS2019 treffen?
    Dann beschäftige ich mich damit...

    Budget spielt nach der TestVisu keine Rolle - es geht um einen relativ bekannten Internetversandhandel :)
    Ich selbst würde mir hierfür eine WPF-Anwendung erstellen, darin bräuchtest du eine Klasse, die dir einen Mitarbeiter anzeigt (Name, Wie viele Stunden der im Monat bei euch abreißen muss, verbleibender / genommener Urlaub usw.) dann bräuchtest du eine Statusklasse, in der du angeben kannst (Frei, Urlaub, Arbeit, Fortbildung etc.). Eine View für den Mitarbeiter, eine View für alle Mitarbeiter, quasi als Gesamtansicht, die Möglichkeit Mitarbeiter zu bearbeiten, und eben die Möglichkeit einen Schichtplan zu erstellen, das ganze musste dir dann eben jeweils als Excel Datei erstellen lassen, so kannst du als Ausgabe weiter ne Excel verwenden, wenn nötig, hast die Daten aber in deinem Programm, das lässt sich dann, wenn du z.B. einen IDataService verwendest später ganz einfach von Excel auf Datenbank um stellen oder eben wieder andersrum.
    Machbar ist dein vorhaben, aber die Frage meiner Vorposter bleibt, wie ist dein Wissensstand, lässt sich so etwas für dich erstmal in groben Zügen definieren, usw. usw.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    andseta schrieb:


    All zu viele funtionen soll dieses Projekt erstmal garnicht haben wie Ruhepausen etc. lediglich ersichtlich, welcher Mitarbeiter ist an Tag XY vor Ort/Urlaub/Schulung etc.
    Wenn das geschafft ist wird jedes Info wie U,Urlaub N,Nachtischt usw. in eine Datenbank geschrieben damit mehrere den aktuellen zugriff haben etc.

    Deswegen nochmal die Frage zur Gestaltung mehrerer Zellen für U=Urlaub,N,S usw...

    Ideen?

    danke vorab


    hier eine Idee mit einem Datagridview
    dies hier ist eine Ansicht für einen Mitarbeiter


    aber du bist dir im klaren das du einen richtigen brocken an der backe hast, bist du allein oder sind noch mehr
    Programmierer involviert
    ... when i was not clear enough!

    andseta schrieb:

    ... bevor hier irgendwas mit Datenbanken...
    Offsichtlich liege ich richtig mit meiner Einschätzung, dass Datenmodellierung dir ein neuer Begriff ist.
    Sonst hättest du jetzt nicht mit 'Datenbanken' angefangen.
    Das ist der ganz typische Kurzschluss von diesbezüglichen Neulingen: dass sie 'Datenbank' hören, wenn ich 'Datenmodell' sage.
    'Datenmodellierung' ist aber etwas ganz anderes als 'Datenbank' - also hat mit 'Datenbank' ungefähr so viel zu tun wie 'Obst-Anbau' mit 'Kühlschrank'.