Code Kürzer

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Moin Leute also mein Programm funktioniert einband frei :)
    Wollte nur mal fragen ob man den Code Kürzer schreiben kann oder ob ich es auch einfach zu schwer mir selber gemacht hab :)
    Zum Programm ich lese aus einer Excel Tabelle Pro tag immer 3 Spalten das heißt wenn der Aktuelle Monat 5 tage hat lese ich 15 cellen aus einer Reihe aus und wenn das fertig ist dann lese ich die nächste reihe aus :)
    Es geht für mich auch nur hauptsächlich um die Funktion :

    C#-Quellcode

    1. async Task<bool> ReadVariabletest()



    Spoiler anzeigen

    C#-Quellcode

    1. public partial class MainWindow : System.Windows.Window
    2. {
    3. //Pfad von der Excel Datei
    4. public string excelpath = @"C:\Users\tb\Desktop\excelvs\test.xlsx";
    5. public string excelpathcopy = @"C:\Users\tb\Desktop\excelvs\test2222.xlsx";
    6. public List<Double> row1 = new List<Double>();
    7. public List<Double> row2 = new List<Double>();
    8. public MainWindow()
    9. {
    10. InitializeComponent();
    11. Task<bool> task = ReadVariabletest();
    12. startdatum();
    13. }
    14. //start timer für Aktuellen Tag anzeigen
    15. private void startdatum()
    16. {
    17. DispatcherTimer timer = new DispatcherTimer();
    18. timer.Interval = TimeSpan.FromSeconds(1);
    19. timer.Tick += datenow24oee;
    20. timer.Start();
    21. }
    22. private void datenow24oee(object sender, EventArgs e )
    23. {
    24. int actuallyday = DateTime.Now.Day;
    25. for (int i = 1; i <= actuallyday; i++)
    26. {
    27. if (i== 1)
    28. {
    29. e1.Text = row1[0].ToString("P0");
    30. e2.Text = row1[1].ToString("P0");
    31. e3.Text = row1[2].ToString("P0");
    32. e1_Copy.Text = row2[0].ToString("P0");
    33. e2_Copy.Text = row2[1].ToString("P0");
    34. e3_Copy.Text = row2[2].ToString("P0");
    35. }
    36. else if (i == 2)
    37. {
    38. e4.Text = row1[3].ToString("P0");
    39. e5.Text = row1[4].ToString("P0");
    40. e6.Text = row1[5].ToString("P0");
    41. e4_Copy.Text = row2[3].ToString("P0");
    42. e5_Copy.Text = row2[4].ToString("P0");
    43. e6_Copy.Text = row2[5].ToString("P0");
    44. }
    45. else if (i == 3)
    46. {
    47. e7.Text = row1[6].ToString("P0");
    48. e8.Text = row1[7].ToString("P0");
    49. e9.Text = row1[8].ToString("P0");
    50. e7_Copy.Text = row2[6].ToString("P0");
    51. e8_Copy.Text = row2[7].ToString("P0");
    52. e9_Copy.Text = row2[8].ToString("P0");
    53. }
    54. else if (i == 4)
    55. {
    56. e10.Text = row1[9].ToString("P0");
    57. e11.Text = row1[10].ToString("P0");
    58. e12.Text = row1[11].ToString("P0");
    59. e10_Copy.Text = row2[9].ToString("P0");
    60. e11_Copy.Text = row2[10].ToString("P0");
    61. e12_Copy.Text = row2[11].ToString("P0");
    62. }
    63. else if (i == 5)
    64. {
    65. e13.Text = row1[12].ToString("P0");
    66. e14.Text = row1[13].ToString("P0");
    67. e15.Text = row1[14].ToString("P0");
    68. e13_Copy.Text = row2[12].ToString("P0");
    69. e14_Copy.Text = row2[13].ToString("P0");
    70. e15_Copy.Text = row2[14].ToString("P0");
    71. }
    72. else if (i == 6)
    73. {
    74. e16.Text = row1[15].ToString("P0");
    75. e17.Text = row1[16].ToString("P0");
    76. e18.Text = row1[17].ToString("P0");
    77. e16_Copy.Text = row2[15].ToString("P0");
    78. e17_Copy.Text = row2[16].ToString("P0");
    79. e18_Copy.Text = row2[17].ToString("P0");
    80. }
    81. }
    82. }
    83. async Task<bool> ReadVariabletest()
    84. {
    85. bool succeeded = false;
    86. while (!succeeded)
    87. {
    88. //Kopiert die Excel Datai
    89. File.Copy(excelpath, excelpathcopy);
    90. //open file excel using microsoft dll
    91. Application app = new Application();
    92. //open workbook
    93. Workbook wk = app.Workbooks.Open(excelpathcopy);
    94. //get first sheet
    95. Worksheet sh = wk.Worksheets[1];
    96. //get cell
    97. // Cells[unten/rechts] Example: [1,2] = B1
    98. int actuallyday = DateTime.Now.Day;
    99. int daystart = 1;
    100. int excelStartRow = 1;
    101. int excelEndRow = 3;
    102. int excelStartSpalte = 1;
    103. int excelEndSpalte = 3;
    104. for (int sp = excelStartSpalte; sp < excelEndSpalte; sp++)
    105. {
    106. for (int i = daystart; i <= actuallyday; i++)
    107. {
    108. for (int a = excelStartRow; a <= excelEndRow; a++)
    109. {
    110. var aExcel = sh.Cells[sp, a];
    111. //reihe eins
    112. if (sp == 1)
    113. {
    114. if (aExcel.Text == String.Empty)
    115. {
    116. double value = 0.0;
    117. row1.Add(value);
    118. }
    119. else
    120. {
    121. double value = Convert.ToDouble(aExcel.Value.ToString());
    122. row1.Add(value);
    123. }
    124. }
    125. //reihe zwei
    126. if (sp == 2)
    127. {
    128. if (aExcel.Text == String.Empty)
    129. {
    130. double value = 0.0;
    131. row2.Add(value);
    132. }
    133. else
    134. {
    135. double value = Convert.ToDouble(aExcel.Value.ToString());
    136. row2.Add(value);
    137. }
    138. }
    139. }
    140. excelEndRow++;
    141. excelEndRow++;
    142. excelEndRow++;
    143. excelStartRow++;
    144. excelStartRow++;
    145. excelStartRow++;
    146. }
    147. excelStartRow = 1;
    148. excelEndRow = 3;
    149. daystart = 1;
    150. }
    151. //Excel wieder schließen ohne zu speichern!
    152. app.DisplayAlerts = false;
    153. wk.Close(0);
    154. app.Quit();
    155. //Delete the excel copy
    156. File.Delete(excelpathcopy);
    157. KillSpecificExcelFileProcess("");
    158. await Task.Delay(10000);
    159. //Der Durchlauf geht alle 30 Minuten
    160. //await Task.Delay(108000000);
    161. }
    162. return succeeded;
    163. }
    164. private void KillSpecificExcelFileProcess(string excelFileName)
    165. {
    166. var processes = from p in Process.GetProcessesByName("EXCEL")
    167. select p;
    168. foreach (var process in processes)
    169. {
    170. if (process.MainWindowTitle == excelFileName)
    171. process.Kill();
    172. }
    173. }
    174. }


    ich hab das eine in den text nur bis tag 6 als test gemacht :)
    Dateien
    • excelvs.7z

      (41,83 kB, 76 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „MrLaTuNiX“ ()

    @MrLaTuNiX Suboptimal.
    Wenn wir Dir helfen wollen, wollen wir auch den Code in eine Form packen.
    Leider wimmelt es da von Fehlern, weil die Controls nicht da sind.
    Diese manuell nachzuerstellen ist sehr nervig.
    Kannst Du einfach das Projekt bereinigt und gezippt (ohne bin, obj, vs-Verzeichnisse) posten?
    Erweiterte Antwort - Dateianhänge - Hochladen
    Und
    Editiere Deinen Post, markiere den Quellcode und drück auf den Spoiler-Button, (der 8. links neben dem C#-Button).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    C#-Quellcode

    1. excelEndRow++;
    2. excelEndRow++;
    3. excelEndRow++;
    4. excelStartRow++;
    5. excelStartRow++;
    6. excelStartRow++;

    Das ist schon mal ziemlich … ausbaufähig - für sich genommen:

    C#-Quellcode

    1. excelEndRow += 3;
    2. excelStartRow += 3;


    Naja, und der Rest:
    if (i== 1)
    {
    e1.Text = row1[0].ToString("P0");
    e2.Text = row1[1].ToString("P0");
    e3.Text = row1[2].ToString("P0");
    e1_Copy.Text = row2[0].ToString("P0");
    e2_Copy.Text = row2[1].ToString("P0");
    e3_Copy.Text = row2[2].ToString("P0");

    (explizit nicht in CodeTags, wegen der Markierung)
    Da kannst Du selber schon mal eine "Formel" erstellen.
    Und wenn Du die e1 und e1_Copy und Co in jeweilige Control-Arrays packst, kannst Du die über einen numerischen Index ansprechen und den Rest bekommst Du bestimmt selber hin.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Oki das mit den Bereinigen hab ich gemacht dann komm das ? das sagt mir doch das mein Programm funktioniert richtig ?
    Bereinigen gestartet...
    1>------ Bereinigen gestartet: Projekt: Montage_OEE, Konfiguration: Debug Any CPU ------
    ========== Bereinigen: 1 erfolgreich, 0 fehlerhaft, 0 übersprungen ==========

    und hab jetzt die Zip Datei hochgeladen
    und danke @VaporiZed aber allerdings verstehe ich nicht so ganz was du meinst mit den textboxen ?
    Du könntest so arbeiten:

    C#-Quellcode

    1. System.Windows.Controls.TextBox[] TextBoxes = { e1, e2, e3 };
    2. TextBoxes[0].Text = "Foo";
    3. TextBoxes[1].Text = "Bar";
    4. TextBoxes[2].Text = "Baz";

    So kannst Du also z.B. TextBoxen mit verschiedenen Namen zusammenfassen und nur über eine Zahl (Array-Index) auf sie zugreifen.

    In der WPF glaub ich aber nicht, dass das ganze Konzept insgesamt so sinnvoll ist …

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Naja, auch dieser Teil ist ziemlich redundant:

    C#-Quellcode

    1. if (sp == 1)
    2. {
    3. if (aExcel.Text == String.Empty)
    4. {
    5. double value = 0.0;
    6. row1.Add(value);
    7. }
    8. else
    9. {
    10. double value = Convert.ToDouble(aExcel.Value.ToString());
    11. row1.Add(value);
    12. }
    13. }
    14. //…

    -->

    C#-Quellcode

    1. double value = 0.0;
    2. if (aExcel.Text != String.Empty) value = Convert.ToDouble(aExcel.Value.ToString());
    3. if (sp == 1) row1.Add(value)
    4. else if (sp == 2) row2.Add(value);

    so ungefähr, keine Ahnung, ob die C#-Syntax da jetzt 100 %ig richtig ist. Aber auch dann am Ende kann man sicherlich diese If-Geschichte durch Arrays wegrationalisieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    sieht für mich gut aus. Allerdings habe ich es mir abgewöhnt auf String.Empty zu prüfen.

    C#-Quellcode

    1. value = aExcel.Text.Length > 0 ? Convert.ToDouble(Value.ToString()) : 0d;


    Auf Länge zu prüfen soll schneller sein, ehrlicherweise habe ich es nie geprüft, ich finde es aber eleganter.
    Wäre value nicht ohnehin schon 0 dann könnte man mit obiger Anweisung (geht auch in VB meines Wissens) die moderne Form des IIF nachbilden.