You are not logged in.

  • Login

1

Friday, February 27th 2009, 10:02am

Auslesen einer Excel-Tabelle vereinfachen??

Hallo

Das Programm an sich funktioniert soweit.
-> Es liest Zellen aus einer Excel-Tabelle aus und soll diese in ein txt-Doc speichern.
Vielleicht weiß einer eine Möglichkeit den Text zu vereinfachen.
Und wie ich anschließend die Werte in eine txt.-datei schreiben kann.
Und wie ich überprüfen kann, ob die nächste Spalte/Zeile leer ist.
Ich hoffe mir kann jemand helfen!

Dank schon mal

C# Quellcode

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
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
            excel.Visible = false;
            object missing = Missing.Value;
            string fileName = Path.Combine(System.Windows.Forms.Application.StartupPath, tDateipfad.Name);
            Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(fileName, missing, missing, missing,
                missing, missing, missing, missing, missing, missing, missing, missing, missing,
                missing, missing);
            object sheet = excel.GetType().InvokeMember("ActiveSheet", BindingFlags.GetProperty, null, excel, new object[0]);
            StreamWriter myFile = new StreamWriter(tspeicherpfad.Name);
            string domain = "Domain";
            string wert = "Wert";
            string deutsch = "deutsch";
            string englisch = "englisch";
            //Domain
            object DomainA1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "A1", Missing.Value });
            string dA1 = Convert.ToString(DomainA1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainA1, new object[0]));
            if (dA1 != domain)
            {
                object DomainB1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "B1", Missing.Value });
                string dB1 = Convert.ToString(DomainB1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainB1, new object[0]));
                if (dB1 != domain)
                {
                    object DomainC1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "C1", Missing.Value });
                    string dC1 = Convert.ToString(DomainC1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainC1, new object[0]));
                    if (dC1 != domain)
                    {
                        object DomainD1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "D1", Missing.Value });
                        string dD1 = Convert.ToString(DomainD1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainD1, new object[0]));
                        if (dD1 != domain)
                        {
                            object DomainE1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "E1", Missing.Value });
                            string dE1 = Convert.ToString(DomainE1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainE1, new object[0]));
                            if (dE1 != domain)
                            {
                                object DomainF1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "F1", Missing.Value });
                                string dF1 = Convert.ToString(DomainF1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainF1, new object[0]));
                                if (dF1 != domain)
                                {
                                    object DomainG1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "G1", Missing.Value });
                                    string dG1 = Convert.ToString(DomainG1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainG1, new object[0]));
                                    if (dG1 != domain)
                                    {
                                        object DomainH1 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "H1", Missing.Value });
                                        string dH1 = Convert.ToString(DomainH1.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, DomainH1, new object[0]));
                                        if (dH1 != domain)
                                        {
                                            MessageBox.Show("Domain nicht enthalten");
                                        }
                                        else
                                        {
                                            object domainH2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "H2", Missing.Value });
                                            string doH2 = Convert.ToString(domainH2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainH2, new object[0]));
                                            if (doH2 == "") { goto NEXT; }
...bis H12
                                        }
                                    }
                                    else 
                                    {
                                        object domainG2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "G2", Missing.Value });
                                        string doG2 = Convert.ToString(domainG2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainG2, new object[0]));
                                        if (doG2 == "") { goto NEXT; }
...bis G12
                                    }
                                }
                                else 
                                {
                                    object domainF2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "F2", Missing.Value });
                                    string doF2 = Convert.ToString(domainF2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainF2, new object[0]));
                                    if (doF2 == "") { goto NEXT; }
...bis F12
                                }
                            }
                            else 
                            {
                                object domainE2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "E2", Missing.Value });
                                string doE2 = Convert.ToString(domainE2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainE2, new object[0]));
                                if (doE2 == "") { goto NEXT; }
...bis E12
                            }
                        }
                        else 
                        {
                            object domainD2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "D2", Missing.Value });
                            string doD2 = Convert.ToString(domainD2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainD2, new object[0]));
                            if (doD2 == "") { goto NEXT; }
...bis D12
                        }
                    }
                    else
                    {
                        object domainC2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "C2", Missing.Value });
                        string doC2 = Convert.ToString(domainC2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainC2, new object[0]));
                        if (doC2 == "") { goto NEXT; }
...bis C12
                    }
                }
                else 
                {
                    object domainB2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "B2", Missing.Value });
                    string doB2 = Convert.ToString(domainB2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainB2, new object[0]));
                    if (doB2 == "") { goto NEXT; }
...bis B12
                }
            }
            else 
            {
                object domainA2 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "A2", Missing.Value });
                string doA2 = Convert.ToString(domainA2.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainA2, new object[0]));
                if (doA2 == "") { goto NEXT; }
...bis A12
                object domainA12 = sheet.GetType().InvokeMember("Range", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { "A12", Missing.Value });
                string doA12 = Convert.ToString(domainA12.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, domainA12, new object[0]));
                if (doA12 == "") { goto NEXT; }
            }
            NEXT:
            //Wert
           NEXT1:
            //deutsch
           NEXT2:
            //englisch
//3 weitere Abfragen (das selbe)
End:
            //Werte in txt-Datei schreiben
            myFile.Close();
            excel.Quit();

2

Friday, February 27th 2009, 11:05am

Hallo Hexe145.

Nur mal so als Anregung. Wäre es nicht einfacher die exel-datei mit einem StreamReader zu öffnen und zeilenweise den Stream auszulesen. Die Spalten werden mit eine einem ; getrennt und das Zeilenende wird mit einem Environment.NewLine gekennzeichnet.

Um in eine Textdatei zu schreiben benutzt du am besten einen StreamWriter

Deine anderen Fragen dürften sich von selbst lösen, wenn du einen StreamReader zum auslesen der exel-datei und einen StreamWriter zum schreiben in eine Textdatei benutzt ;)

3

Friday, February 27th 2009, 11:21am

Hallo IchRogue81.

Vielen Dank für deine schnelle Antwort.
Habe es gleich mal so ausprobiert.
Leider ist das ganze sehr schwer zu lesen.
Im Anhang schicke ich dir mal das Ergebnis.

Vll. kennt jemand noch ne andere Lösung.

Bin für alle Vorschläge offen.
Vll. noch ein kleiner Hinweis: Die Excel-Tabellen sind nicht immer gleich!
Hexe145 has attached the following file:
  • Test1.txt (17.68 kB - 146 times downloaded - latest: May 18th 2012, 11:31pm)

4

Sunday, September 12th 2010, 3:32pm

Hi,

das Thema ist älter, ich weiss... Leichenschädung, aber noch als kleine Ergänzung die ich gerne genannt haben möchte:

Ich finde, dass ein Problem vorgeben sollte in welcher Sprache man es löst und nicht umgekehrt, denn was bringt es den Heldentod zu sterben? Damit meine ich, dass ich deinen Code für totalen Overkill empfinde. In anderen Sprachen wäre das ein vier-Zeiler und hier so ein Monster an Code nur um etwas auszulesen und neu abzuspeichern? :S

Tipp: R dafür nutzen ;)

5

Sunday, September 12th 2010, 10:57pm

Wenn du das Thema nochmal eröffnest... Ich weiß nicht genau welches Excel ihr so benutzt aber das von Microsoft speichert seine Daten normalerweise nicht in Semikolon-separierten Dateien ab. Excel kann das zwar, man kann aber nicht davon ausgehen immer solche Dateien bekommen. Also ist der Ansatz es mit VSTO und .NET zumachen vollkommen richtig gewählt und kaum in 4 Zeilen zu schaffen. Außerdem würde es keinen Sinn machen, CSV-Dateien einlesen und dann so wieder wegzuspeichern - so eine Frage würde doch hier niemand stellen?
Der Code der hier verwendet wird ist natürlich allerunterste Schublade, mit GOTOs programmiert man seit Jahren nichts mehr. Ich würde jetzt ohne es ausführen zu wollen behaupten, dass es mehr Faktoren gibt die Wahl der Programmiersprache beeinflussen als die problemorientiertheit. In diesem Fall kann man natürlich wenn man pfiffig ist auf die Idee kommen den Excel-CSV Exporter mittels VSTO anzusprechen, dann können es vielleicht doch mit biegen ein brechen ein 4-Zeiler werden.


P.S. Also wenn wir schon bei Problemorientierung sind. R hat einen völlig anderen Fokus und ich denke es gehört so ziemlich mit zu dem ungünstigsten Was man auswählen könnte.

Similar threads

Social bookmarks