Excel mehrere Dateien Auslesen

  • C#
  • .NET 5–6

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von MrLaTuNiX.

    Excel mehrere Dateien Auslesen

    Hi Leute kurze frage ich lese unterschiedliche Excel Dateien aus ich mache das grad so

    C#-Quellcode

    1. ​ File.Copy(test, testcopy);
    2. Application app = new Application();
    3. Workbook wk = app.Workbooks.Open(testcopy);
    4. Worksheet sh = wk.Worksheets[1];
    5. for (int eStartRow = 3; eStartRow <= eEndRow; eStartRow++)
    6. {
    7. var aExcel = sh.Cells[e_Spalte_Bauteil1, eStartRow];
    8. if (aExcel.Text == String.Empty)
    9. {
    10. int value = 0;
    11. list.Add(value);
    12. }
    13. else
    14. {
    15. int value = Convert.ToInt16(aExcel.Value.ToString());
    16. list.Add(value);
    17. }
    18. }
    19. app.DisplayAlerts = false;
    20. wk.Close(0);
    21. app.Quit();
    22. File.Delete(testcopy);
    23. KillSpecificExcelFileProcess("");


    so meine frage ist muss ich das jetzt immer komplett die funktion einfügen für die anderen Excel Dateien ? oder geht das einfacher weil es sehe dann so aus bei mir :

    C#-Quellcode

    1. ​ File.Copy(test, testcopy);
    2. Application app = new Application();
    3. Workbook wk = app.Workbooks.Open(testcopy);
    4. Worksheet sh = wk.Worksheets[1];
    5. for (int eStartRow = 3; eStartRow <= eEndRow; eStartRow++)
    6. {
    7. var aExcel = sh.Cells[e_Spalte_Bauteil1, eStartRow];
    8. if (aExcel.Text == String.Empty)
    9. {
    10. int value = 0;
    11. list.Add(value);
    12. }
    13. else
    14. {
    15. int value = Convert.ToInt16(aExcel.Value.ToString());
    16. list.Add(value);
    17. }
    18. }
    19. app.DisplayAlerts = false;
    20. wk.Close(0);
    21. app.Quit();
    22. File.Delete(testcopy);
    23. KillSpecificExcelFileProcess("");
    24. File.Copy(test2, tes2tcopy);
    25. Application app = new Application();
    26. Workbook wk2 = app2.Workbooks.Open(test2copy);
    27. Worksheet sh2 = wk2.Worksheets[1];
    28. for (int eStartRow = 3; eStartRow <= eEndRow; eStartRow++)
    29. {
    30. var aExcel = sh.Cells[e_Spalte_Bauteil1, eStartRow];
    31. if (aExcel.Text == String.Empty)
    32. {
    33. int value = 0;
    34. list2.Add(value);
    35. }
    36. else
    37. {
    38. int value = Convert.ToInt16(aExcel.Value.ToString());
    39. list2.Add(value);
    40. }
    41. }
    42. app2.DisplayAlerts = false;
    43. wk2.Close(0);
    44. app2.Quit();
    45. File.Delete(test2copy);
    46. KillSpecificExcelFileProcess("");


    ich muss halt immer wieder eine neue Apllication und so erstellen geht das auch weniger ?
    Wenn du direkt in Excel arbeitest und hintereinander mehrere Arbeitsmappen bearbeitest, dann musst du ja auch nicht Excel schliessen und wieder mit der nächsten Mappe öffnen, das geht aus auch der App-Likation heraus. Und ich habe es absichtlich als Gedankenanstoß so geschrieben. Du musst schon wissen was du machst.
    Ausserdem würde ich mir für diese Arbeiten mal ersthaft überlegen, ob nicht andere Tools, zum Beispiel EpPlus für dich eine Alternative wären. EpPlus benötigt gar kein Excel, es schreibt dennoch Excel-Dateien, was ja auch nicht so unmöglich erscheint wenn man weiß, dass die Excel-Dateien eigentlich "nur" gezippte XML-Dateien sind.
    Sowas kann man in eine eigene Methode auslagern, die als Parameter den Dateinamen enthält und eine List (Of Integer) zurück gibt. Diese Methode ruft man dann für jede Datei auf und verarbeitet den Rückgabewert.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    C#-Quellcode

    1. ​ File.Copy(test, testcopy);
    2. Application app = new Application();
    3. Workbook wk = app.Workbooks.Open(testcopy);
    4. Worksheet sh = wk.Worksheets[1];
    5. for (int eStartRow = 3; eStartRow <= eEndRow; eStartRow++)
    6. {
    7. var aExcel = sh.Cells[e_Spalte_Bauteil1, eStartRow];
    8. //Reihe D7a 438 Ist
    9. if (aExcel.Text == String.Empty)
    10. {
    11. int value = 0;
    12. intlist.Add(value);
    13. }
    14. else
    15. {
    16. int value = Convert.ToInt16(aExcel.Value.ToString());
    17. intlist.Add(value);
    18. }
    19. }
    20. app.DisplayAlerts = false;
    21. wk.Close(0);
    22. app.Quit();
    23. KillSpecificExcelFileProcess("");
    24. File.Delete(testcopy);
    25. File.Copy(test2,test2copy);
    26. app = new Application();
    27. wk = app.Workbooks.Open(test2copy);
    28. sh = wk.Worksheets[1];
    29. for (int eStartRow = 3; eStartRow <= eEndRow; eStartRow++)
    30. {
    31. var aExcel = sh.Cells[e_Spalte_Bauteil1, eStartRow];
    32. if (aExcel.Text == String.Empty)
    33. {
    34. int value = 0;
    35. intlist2.Add(value);
    36. }
    37. else
    38. {
    39. int value = Convert.ToInt16(aExcel.Value.ToString());
    40. intlist2.Add(value);
    41. }
    42. }
    43. app.DisplayAlerts = false;
    44. wk.Close(0);
    45. app.Quit();
    46. File.Delete(testcopy2);
    47. KillSpecificExcelFileProcess("");


    hab das jetzt so gemacht das ist aufjedenfall mal besser da ich ja nicht wk oder so neu bennen muss
    und zu den anderen ich habe ja sehr viele unterschiedliche Excel dateien und nicht unterschiedliche Worksheets in den Excel dateien außer ich hab das jetzt falsch verstanden
    Aber ich muss doch sobald ich eine neue Excel datei hab den befehl ausführen
    app = new Application();
    oder ?
    wenn ich das nicht mache kriege ich einen Error, mein Problem ist ich habe mit excel nicht viel erfahrung und will einfach nur werte auslsesen von 20- 30 dateien und wollte halt meinen code nur kürzer machen weil an sich klappt das ganze programm
    Excel ist ein Programm (Application), natürlich brauchst du eine Instanz vom Programm um überhaupt ein Workbook öffnen oder neu erstellen zu können.
    Wenn du aber mehrere Workbooks nacheinander bearbeiten willst, brauchst du halt nur diese eine Instanz der Applikation und nicht immer wieder eine neue.
    Wenn du innerhalb eines Workbook mehrere Tabellenblätter (Worksheet) bearbeiten willst, brauchst du auch nicht mehrere Instanzen des Objekts "Workbook".
    Und so weiter.

    docs.microsoft.com/de-de/offic…cepts-excel-vba-reference

    Dksksm schrieb:

    Wenn du aber mehrere Workbooks nacheinander bearbeiten willst, brauchst du halt nur diese eine Instanz der Applikation und nicht immer wieder eine neue.
    Das geht sogar noch darüber hinaus:
    Selbst wenn du mehrere Workbooks gleichzeitig bearbeiten willst, brauchst du nur eine Application,
    Die Excel Application hat eine Collection Workbooks, die alle in Excel geöffnete Workbooks enthält.
    Application.Workbooks.Open
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich wollte es nicht zu komplex werden lassen. @MrLaTuNiX hat ja so schon schwierigkeiten genug die "Zwiebeligkeit" der Excel-Objekte zu sehen.
    Ich benutze Interop.Excel nur, wenn es sich gar nicht anders (für mich) lösen läßt, das ist nur bei "in einer Arbeitsmappe eingebetten Objekten" und "Drucken aus Excel als PDF" der Fall.
    Ansonsten ist Epplus für mich das Mittel meiner Wahl.
    okay wenn ich aber verusche ein neues workbook zu öffnen und keine neue Applikation mache kriege ich ein fehler ? also muss ich doch das alter schließen und ein neues machen ich meine ich lösche die Datei ja nachdem lesen dierekt und hole mir eine neue und kopeire die liegt daran das sich die werte immer ändern aber das ist ja auch egal ....