Autor Beitrag
NellC
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 22.10.12 09:45 
Hallo,
ich habe erst vor kurzem angefangen C# zu lernen, habe davor gar nicht programmiert und kenne mich da sehr wenig aus.
Ich habe die Aufgabe, einen Button auf einem bestehenden Programm zu erstellen, mitdem ich 2 Excel Dateien vergleichen kann. Sind diese Dateien gleich kann mit einer Meldung "Finish" das Programm geschlossen werden.
Sind die beiden Dateien ungleich, dann sollen die ungleichen Zellen in ein DatagridView rot angezeigt werden.

Ich steh jetzt ziemlich am Anfang meines Programms und der Code sieht folgendermaßen aus: (funktioniert nicht)

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using ToolCollection.DAO;
using ToolCollection.Behaviour;

using Excel = Microsoft.Office.Interop.Excel;
using EETestmanagementIO.XLSHandler;
using EETestmanagementIO.CSVHandler;


namespace ToolCollection

{
    public partial class CompareFiles : Form
    {

        List<DataTable> File1 = new List<DataTable>();
        List <DataTable> File2 = new List <DataTable>();
        DataTable table = new DataTable("Difference");
        

        private static bool compareDataTable(DataTable a, DataTable b)
        {

            for (int i = 0; i < a.Rows.Count; ++i)
            {
                DataRow rowA = a.Rows[i];
                DataRow rowB = b.Rows[i];


                for (int k = 0; k < rowA.ItemArray.Length; ++k)
                {
                    if (!rowA[k].ToString().Equals(rowB[k].ToString()))
                    {
                        return false;
                    }
                }
            }
            return true;
        }

        private static List<DataTable> ReadFile(string file2read)
        {
            List<DataTable> file = new List<DataTable>();
            if (file2read.EndsWith(".csv"))
            {
                List<DataTable> result = new List<DataTable>();
                file.Add(CSVhandler.Read(file2read, ';'false));
     

                return result;
            }
            else if ((file2read.EndsWith(".xls")) || (file2read.EndsWith(".xlsx")))
            {

                XlsHandler handler = new XlsHandler(file2read);
                file = handler.ReadData();
                handler.CloseWithoutSaving();

                return file;
            }
            else
            {
                return null;
            }
        }


        public CompareFiles()
        {
            InitializeComponent();
        }

        private void btnChooseFile1_Click(object sender, EventArgs e)
        {
            OpenFileDialog choosefile1= new OpenFileDialog();
            choosefile1.InitialDirectory = "C:\\";
            choosefile1.CheckFileExists = true;
            
          

            if (choosefile1.ShowDialog() == DialogResult.OK)
            {
                lbxFiles.Items.Add(choosefile1.FileName);

                btnChooseFile1.Enabled = false;

            }


        }

        private void btnChooseFile2_Click(object sender, EventArgs e)
        {
            OpenFileDialog choosefile2= new OpenFileDialog();
            choosefile2.InitialDirectory = "C:\\";
            choosefile2.CheckFileExists = true;
            

            if (choosefile2.ShowDialog() == DialogResult.OK)
            {
                lbxFiles.Items.Add(choosefile2.FileName);
                btnChooseFile2.Enabled = false;
            }
        }

        private void lbxFiles_SelectedIndexChanged(object sender, EventArgs e)
        {
        }

        private void btnCompareFiles_Click(object sender, EventArgs e)

        {
                       
            int counter = 0;
            if (counter == 0 || compareDataTable(File1[1], File2[1]))
            {
                MessageBox.Show("Finish!");
            }
            else
            {
                MessageBox.Show("Files are different.");
            }

            ++counter;

        }

        private void tbFiles_TextChanged(object sender, EventArgs e)

        {
        }

        private void lbxFiles_SelectedIndexChanged_1(object sender, EventArgs e)
        {
        }
    }
}

Kann mir bitte bitte jemand helfen?

Moderiert von user profile iconGausi: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 22.10.12 12:51 
Hallo NellC :welcome:

was ist denn deine genaue Frage (außer "funktioniert nicht")?

Hast du denn schon mal den Debugger benutzt, um dein Programm schrittweise zu testen?
Tutorials dazu gibt es z.B. unter
Visual Studio Debugging
Mastering Debugging in Visual Studio 2010 - A Beginner's Guide

Inhaltlich fällt mir aber als erstes auf, daß du m.E. unnötigerweise eine List<> verwendest, du willst doch nur jeweils eine Datei (DataTable) mit einer anderen vergleichen, oder?
Dann wäre dir auch der Fehler bei compareDataTable(File1[1], File2[1]) nicht passiert, denn (Array- bzw. Listen-) Indizes sind in .NET nullbasiert.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 22.10.12 13:04 
Zitat:
Kann mir bitte bitte jemand helfen?


Wenn du eine konkrete Frage stellst ja ;)

Ich antwoerte mal auf eine Frage die du nicht gestellt hast. Du wirst insbesondere compareDataTable intelligenter gestalten müssen. Einfach ja nein als Ergebnis reicht da nicht. Du musst dir als Ergebnis schon die Zellen merken die unterschiedlich sind um sie nachher visualisieren zu können.

Zitat:
Sind die beiden Dateien ungleich, dann sollen die ungleichen Zellen in ein DatagridView rot angezeigt werden.


Meinst du nicht 2 DataGridViews um den Unterschied zwischen 2 Sheets anzeigen zu können?. Was sollte denn sonst in der einen Zelle stehen die du als ungleich festgestellt hast? Beide Werte?

Zitat:
Inhaltlich fällt mir aber als erstes auf, daß du m.E. unnötigerweise eine List<> verwendest, du willst doch nur jeweils eine Datei (DataTable) mit einer anderen vergleichen, oder?


Eine Exceldatei besteht aus mehreren Sheets. Also vermutlich je Sheet eine DataTable.
NellC Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 22.10.12 13:51 
@TH69

hallo -
ja das Debuggen hab ich versucht - im Moment ist es einfach so, dass die Dateien gar nicht gelesen werden - also bei File1/File2 steht bei Count= 0!
Darf ja nicht sein oder?

Das Problem ist ich kann da keine konkrete Frage stellen, da eben das ganze Programm noch nicht funktioniert.

Also ich kann File 1 durchsuchen und wählen, dann dasselbe bei File 2 - so dann wenn ich auf den Button "Compare Files" klicke, kommt dann die Meldung "Finish!" ohne dass die Dateien wirklich vergliechen werden, denn sie sind unterschiedlich und da müsste ja die zweite Meldung "Different Files" angezeigt werden oder ?

Das Programm wird mit Meldung "Finish!" sofort beendet ohne dass vorher die Dateien gelesen/vergliechen werden.

Moderiert von user profile iconNarses: Beiträge zusammengefasst

@Ralf

Hallo!
Danke für die Antwort - wie oben schon erwähnt, ich kann irgendwie keine konkrete Frage stellen weil ich mich beim Programmieren sehr wenig auskenne und erstmal nur so Kleinigkeiten wie Oberfläche und Buttons usw. erstellen kann.


Bei den Zellen die ungleich sind, hab ich freie Wahl wie ich das ungefähr gestalte.
Das heißt ich kann das entweder so darstellen, dass die Zellen die ungleich sind in 2 Gridviews angezeigt werden (also der Inhalt der Zellen wird in rot angezeigt)
oder es kann im DatagridView angezeigt werden - zb Datei 1, Zeile 6,Spalte C ist ungleich der Datei 2 .

Aber das Problem ist dass ich noch lange nicht soweit bin, da ich jetzt nicht mehr weiter weiß :(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 22.10.12 14:47 
Zitat:
also bei File1/File2 steht bei Count= 0


Wo füllst du denn File1/File2? Stimmt nirgends. Du musst schon deine ReadFile Methoden an der richtigen Stelle in btnCompareFiles_Click aufrufen. Das sollte als Starthilfe reichen.
NellC Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 22.10.12 15:45 
Ralf das -->
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private static List<DataTable> ReadFile(string file2read)
{
    List<DataTable> file = new List<DataTable>();
    if (file2read.EndsWith(".csv"))
    {
        List<DataTable> result = new List<DataTable>();
        file.Add(CSVhandler.Read(file2read, ';'false));
        return result;
    }
    else if ((file2read.EndsWith(".xls")) || (file2read.EndsWith(".xlsx")))
    {
        XlsHandler handler = new XlsHandler(file2read);
        file = handler.ReadData();
        handler.CloseWithoutSaving();
        return file;
    }           
    else
    {
        return null
    }
}

darf ich ja nicht in btnCompareFiles_Click einsetzen .. geht gar nicht :S

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 22.10.12 15:52 
Zitat:
darf ich ja nicht in btnCompareFiles_Click einsetzen .. geht gar nicht :S


Äh. Ja :gruebel: Das ist eine Methode und die sollst du aufrufen. Wenn du die geschrieben hast solltest du auch wissen wie man die aufruft. Wenn du die nicht geschrieben hast und nicht weiß wie man diese Methode aufruft oder dir grundsätzlich nicht sicher bist wie man Methoden aufruft wäre es vielleicht besser noch mal einen Schritt zurückzutreten und sich erst noch mal ein Paar Grundlagen anzueigenen (Was sind Klassen, was sind Instanzen von Klassen, was sind Typen, was sind Variablen, was sind Methoden, was sind Parameter etc.) und dann einen 2.ten Anlauf zu wagen.
NellC Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 31.10.12 14:50 
Also ich hab das Programm jetzt soweit dass die Dateien gelesen und richtig vergliechen werden. Das funktioniert jetzt super.

Mein nächster Schritt ist es, dass der Inhalt der Dateien in eine neue Excel/CSV-Datei reingeschrieben wird und die Zellen, die ungleich sind rot markiert sind und drin soll stehen: Datei 1: x, Datei 2: y
So dass man sieht, dass an dieser Stelle die Zellen der beiden Dateien nicht übereinstimmen.

Wie geh ich da vor? Kann mir da bitte jemand weiterhelfen?
san-software
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 3



BeitragVerfasst: Mi 31.10.12 14:57 
CSV geht gar nicht, denn das sind reine Textdateien. Da kann man nichts farbig machen.
Ich denke, da fehlen die PC-Grundlagen noch gewaltig.

Man muß das also direkt mit Excel machen. Google da doch mal nach Excel-Automatisierung.
Da findest Du sicher einige Tips.
NellC Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 31.10.12 15:04 
Mein Problem ist nicht Excel - sondern das Programmieren! Danke trotzdem !!!!!!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 31.10.12 15:32 
Der Hinweis auf Excel-Automatisierung bezieht sich auf die Programmierung gegen die Excel API und nicht die Bedienung von Excel.