Hallo, ich bräuchte eure Hilfe. Das Ziel meines Projektes ist, dass ich ein Eingabefenster habe indem ich zwei Eingaben mache und dadurch aus zirka 100 Excel Listen mir die relevanten Zeilen ausgegeben werden. Ich hätte geplant es mit C zu Programmieren, da dies die einzige Sprache ist in der ich grundlegende Kenntnisse habe. Bin aber für produktive Vorschläge offen falls es mit einer anderen Sprache viel einfacher geht. Ich wäre sehr verbunden wenn mir da jemand helfen könnte. Danke im Voraus
Nikolas W. schrieb: > Ich hätte geplant es mit C zu Programmieren, da dies die einzige Sprache > ist in der ich grundlegende Kenntnisse habe. Super umständlich. Mit Java oder Kotlin mithilfe der Apache POI geht das elegant und schnell. Mit den Microsoft-Sprachen wie C# oder VB könnte man zwar via Automation direkt auf Excel zugreifen und darüber auf die Dateien, was in der Theorie die sauberere Lösung ist und garantiert mit allen Dateien klarkommt, aber in der Praxis leider langsam und mit diversen Fallstricken versehen: * Wenn die Excel-Datei Makros oder externe Verweise enthält, besteht Excel darauf beim Öffnen jeder einzelnen Datei ein Nachfrage-Fenster anzuzeigen, was man manuell bestätigen muss * Man kann nicht mehrere Dateien gleichen Namens öffnen * Excel muss installiert sein * Irgendwelche lustigen Zeichensatz-Probleme gibt's auch Es ist aber ewig her dass ich das gemacht habe, kann sein dass das mittlerweile anders ist.
Programmierer schrieb: > Mit den Microsoft-Sprachen wie C# oder VB könnte man zwar via Automation > direkt auf Excel zugreifen und darüber auf die Dateien, was in der > Theorie Nicht nur in der Theorie. Man kann damit ALLES machen mit Excel. Hier der Befehlssatz : https://docs.microsoft.com/de-de/dotnet/api/microsoft.office.interop.excel?view=excel-pia Ich mache es meist so. Ich zeichne das was ich will via Makro auf, dann in den Makroeditor und den aufgezeichneten Befehl an das INTEROP System anpassen. Einfacher als die Befehle rauszusuchen ;) Ich habe auf die Weise Software geschrieben die Datenbanken von AS400-Servern gezogen haben, diese in VB Analysiert haben, und das Ergebnis an eine NEUE Excel-Datei übergeben haben. Diese Excel-Datei wurde so von meiner Software erstellt das sie automatisch perfekte Ausdrucke mit Diagrammen hatte. Der Grund war eine Statistik für die Jährliche Präsentation. Die hätte ich auch via Befehl direkt in Powerpoint einbinden können, aber da der Chef jedes Jahr Änderungen haben wollte war das nicht effektiv. Was ich damit sagen will. Es geht alles. Wenn man coden kann relativ Problemlos. Was die Makros angeht. Wenn die Datei auf den Rechner 1 x in Excel als vertrauenswürdig gekennzeichnet ist, stören die nicht mehr. Allerdings gebe ich dir(Programmierer) in einen Punkt recht. Das schnellste ist es nicht. Da kannst du viel Kaffee trinken und den entsorgen bis der fertig ist. Ich habe diese Analysen immer im Hintergrund laufen lassen. Sie fressen kaum Rechenpower (was mich heute noch wundert). Ein VB-Programm was 30.000 Excel-Zeilen in eine SQL-Datenbank (200.000 Datensätze) übernehmen soll (Preisanpassung) mit den Befehl neuer_preis = excel.Rows(zeile).cells(2).value ' liest Zelle 2, in Zeile x artikel_nr = excel.Rows(zeile).cells(1).value ' liest Zelle 1, in Zeile x aus Sql_befehl = "Update Artikel set Preis = " + str(neuer_preis) + " where Arikel_nr = '" + artikel_nr +"'" dauert schon mal locker 10-20 Minuten. Der Grund ist das INTEROP.-System von MS. Das muss du in das Programm #include machen. Ansprechen geht dann wie eine eins. Und vor allen Dingen habe ich seit Win-2000 noch nie Probleme gehabt damit. Egal welche Excel + Windows-System. Da ist die Berechnungszeit mir eigentlich egal. Zu Speed unter C kann ich nix sagen, aber da es die selbe Schnittstelle ist, denke ich nicht das sich da was tut.
Schlaumaier schrieb: > Man kann damit ALLES machen mit Excel. > Hier der Befehlssatz : Ja das ist klar. So eine ähnliche Sache hab ich bei einer ehemaligen Arbeit gemacht; ein Export aus einer DB in 1000 Excel-Tabellen für die einzelnen Kunden... die Dateien waren auf einem Netzlaufwerk und enthielten Makros, das war erst mit VB gemacht und war so quälend langsam und diese elenden Abfragen haben mich verrückt gemacht! Das habe ich dann mit Java und POI neu gemacht und es war dann superschnell und problemlos. Sehr hilfreich beim Debugging...
Ich habe mal etwas ähnliches hier abgehangen. Ich habe es etwas gekürzt, kann also sein, dass ich zu viel gekürzt habe. Nichtsdestotrotz solltest du dich anhand der Befehle gut entlanghangeln können und es für dich anpassen Probiere das einfach mal in einer neuen Excel Mappe aus, die hoffentlich nicht bei den anderen liegt^^
1 | Option Explicit |
2 | |
3 | 'Constant Description |
4 | '&H0001 Only file system folders can be selected. If this bit is set, the OK button is disabled if the user selects a folder that doesn't belong to the file system (such as the Control Panel folder). |
5 | '&H0002 The user is prohibited from browsing below the domain within a network (during a computer search). |
6 | '&H0004 Room for status text is provided under the text box. (I haven't found a way to show the status, however.) |
7 | '&H0008 Returns file system ancestors only. |
8 | '&H0010 Shows an edit box in the dialog box for the user to type the name of an item. |
9 | '&H0020 Validate the name typed in the edit box. |
10 | '&H1000 Enables the user to browse the network branch of the shell's namespace for computer names. |
11 | '&H2000 Enables the user to browse the network branch of the shell's namespace for printer names. |
12 | '&H4000 Allows browsing for everything. |
13 | |
14 | 'Constant Description |
15 | '0 The Desktop (virtual) folder is the root directory. Using this constant along with &H0001 for the third parameter circumvents problems with the OK button. |
16 | '1 Internet Explorer is the root. |
17 | '2 The Programs folder of the Start menu is the root. |
18 | '3 The Control Panel folder is the root. The third parameter must be set to &H4000 (browse for everything). |
19 | '4 The Printers folder is the root. The third parameter must be set to &H4000 (browse for everything). |
20 | '5 The Documents folder of the Start menu is the root. |
21 | '6 The Favorites folder of the Start menu is the root. |
22 | '7 The Startup folder of the Start menu is the root. The third parameter must be set to &H4000 (browse for everything). |
23 | '8 The Recent folder is the root. The third parameter must be set to &H4000 (browse for everything). |
24 | '9 The SendTo folder is the root. The third parameter must be set to &H4000 (browse for everything). |
25 | '10 The Recycle Bin folder is the root. The third parameter must be set to &H4000 (browse for everything). |
26 | '11 The Start menu folder is the root. |
27 | '16 The Desktop (physical) folder is the root. |
28 | '17 My Computer is the root. |
29 | '18 Network Neighborhood is the root. |
30 | '19 The Nethood folder is the root. |
31 | '20 The Fonts folder is the root. |
32 | '21 The Templates folder is the root. |
33 | |
34 | Function OpenFileDlg() As String |
35 | Dim AppShell As Object |
36 | Dim BrowseDir As Variant |
37 | |
38 | On Error Resume Next |
39 | Set AppShell = CreateObject("Shell.Application") |
40 | Set BrowseDir = AppShell.BrowseForFolder(0, "Ordner auswählen", &H1000, 17) |
41 | OpenFileDlg = BrowseDir.items().Item().Path |
42 | End Function |
43 | |
44 | |
45 | Sub GetCells() |
46 | Dim strPath As String |
47 | Dim FS As Object |
48 | Dim Folder As Object |
49 | Dim File As Object |
50 | Dim objExcel As Excel.Application |
51 | Dim objCell As Object |
52 | Dim i As Long |
53 | Dim j As Long |
54 | |
55 | Dim strString As String |
56 | Dim rngCell As Range |
57 | |
58 | Dim wkbOrig As Workbook |
59 | Dim wkbTarg As Workbook |
60 | |
61 | strPath = OpenFileDlg() |
62 | If strPath <> "" Then |
63 | Set FS = CreateObject("Scripting.FileSystemObject") |
64 | Set Folder = FS.GetFolder(strPath) |
65 | j = 1 |
66 | For Each File In Folder.Files |
67 | If InStr(UCase(File.Name), ".XLS") > 0 Then |
68 | 'MsgBox File.NameWortliste |
69 | 'On Error Resume Next |
70 | Set objExcel = GetObject(, "Excel.Application") |
71 | If Err Then Set objExcel = CreateObject("Excel.Application") |
72 | objExcel.EnableEvents = False |
73 | objExcel.DisplayAlerts = False |
74 | Set wkbOrig = ThisWorkbook |
75 | Set wkbTarg = objExcel.Workbooks.Open(strPath + "\" + File.Name) |
76 | For i = 1 To wkbTarg.Sheets.Count |
77 | j = j + 1 |
78 | strTeilstring = wkbTarg.Sheets(i).Range(objCell.Address).Value |
79 | wkbOrig.Sheets(2).Range("A" + CStr(j)).Value = strTeilstring |
80 | wkbOrig.Sheets(2).Range("B" + CStr(j)).Value = wkbTarg.Sheets(i).Range(objCell.Address).Value |
81 | wkbOrig.Sheets(2).Range("C" + CStr(j)).Value = objCell.Address |
82 | wkbOrig.Sheets(2).Range("D" + CStr(j)).Value = File.Name |
83 | Next |
84 | Set objCell = Nothing |
85 | wkbOrig.Save |
86 | wkbTarg.Close |
87 | Set wkbTarg = Nothing |
88 | Set wkbOrig = Nothing |
89 | Set objExcel = Nothing |
90 | End If |
91 | Next |
92 | Set File = Nothing |
93 | Set Folder = Nothing |
94 | End If |
95 | MsgBox "Ready!" |
96 | End Sub |
Ich würde dir auch raten es mit VBA zu machen. Ja, es ist im Vergleich zu Java sehr langsam, wobei ich in Java noch nie eine Exceltabelle angefasst habe. Aber bis du elegant Java programmieren kannst wenn du bisher nur C gemacht hast, da hast du dein VB-Makro fertig und durchgelaufen ist es auch. Java ist von der Syntax her zwar zu C sehr ähnlich, aber das war es auch schon an Ähnlichkeit. Allein um aus der prozeduralen Denke rauszukommen, das dauert etwas und erfordert Übung. VBA unterstützt zwar angeblich auch Objektorientierung, aber so wirklich ausgeprägt ist das nicht. Mit deiner prozeduralen Denke kommst du da recht weit, wie du sie von C kennst. Und VBA ist leicht zu erlernen. Um Längen leichter als Java. Ich mag VBA nicht besonders, im Gegensatz zu Java, das mag ich sehr, habe aber trotzdem so Einiges in VBA realisiert und nach deiner Aufgabenstellung wäre es trotzdem meine erste Wahl.
PS: VBA lernst du am Besten, indem du es einfach machst. Wenn du nicht weiter weißt, einfach Google mit sowas wie "VBA if else" oder "VBA switch" oder "VBA neue Exceldatei öffnen" oder "VB Zellbereich kopieren" ... füttern. Du mußt da noch nicht einmal englischsprachige Foren bemühen.
Mit Python lassen sich auch recht bequem Exceltabellen lesen und schreiben.
Wühlhase schrieb: > Ich würde dir auch raten es mit VBA zu machen. Für mich hört sich das ganze auch eher nach einem (nicht genau genannten) Problem das man besser direkt in Excel realisiert und keine Externes Programm dafür verwendet. Aber dennoch ist sowas schon verhältnissmäsig einfach zu machen wenn man der Grundprinzip von dem ganzen OLE-Automations Zeugs mal verstanden hat. https://support.microsoft.com/en-us/help/196776/office-automation-using-visual-c
900ss D. schrieb: > Mit Python lassen sich auch recht bequem Exceltabellen lesen und > schreiben. Da gibt es diverse Bibliotheken, z.B. pandas oder xlrd, Tutorials finden sich massenhaft im Netz.
Nikolas W. schrieb: > Das Ziel meines Projektes ist, dass ich ein Eingabefenster habe indem > ich zwei Eingaben mache und dadurch aus zirka 100 Excel Listen mir die > relevanten Zeilen ausgegeben werden. > > Ich hätte geplant es mit C zu Programmieren, da dies die einzige Sprache > ist in der ich grundlegende Kenntnisse habe. Bin aber für produktive > Vorschläge offen falls es mit einer anderen Sprache viel einfacher geht. Naja, sagen wir mal so: vermutlich wäre es mit allen Sprachen einfacher als mit C, ausgenommen Brainfuck, APL und Assembler... Nun, wie dem auch sei, Microsoft Excel (und übrigens auch LibreOffice) bieten bereits eigene Programmierschnittstellen an, die genau auf die jeweiligen Anwendungsprogramme zugeschnitten sind. Wenn die Anzeige also auf einem System erfolgen soll, auf welchem eine dieser Office-Lösungen installiert ist, dürfte es wohl das Einfachste sein diese Schnittstellen zu benutzen. Eine andere und plattformunabhängige Möglichkeit könnte eine schnelle, moderne Skriptsprache wie Python sein. Dort gibt es bereits fertige Module, die Exceldateien lesen können, und auch alles andere, was Du brauchst. Wenn Du zusätzlich noch Deine Daten in hübsche Grafen plotten oder schnelle Statistiken berechnen möchtest, böte sich unter Python die Bibliothek Pandas an, die übrigens auch eine fertige Funktion zum Einlesen von Exceldateien mitbringt.
Vielleicht sagt von Nikolas ja mal, was er genau möchte : Er hat ein Fenster mit 2 Editierfeldern. Die Suchstrings werden aus den 2 Feldern ausgelesen und mit dem Inhalt der Exceldateien verglichen. Ist das so richtig ? Oder braucht er nur einen String, den er in den Dateien sucht ? Mit 2 Strings wirds schon anstrengender, da sowohl der erste String als erstes auftauchen kann oder auch der zweite als erster. Da kommt man ohne doppeltes Parsen der Datei nicht drum herum.
VERGISS VBA. !! Nimm VB = Visual Basic oder VC = Visual C VB + VC darf man sich legal in der EXPRESS Version (heißt aktuell glaub ich anders) herunter ziehen bei MS. Unter Basic geht das so. Wie oben geschrieben das INTEROP einbinden mit ********** Imports Microsoft.Office.Interop.Excel.XlApplicationInternational Public class hauptprg Public excel As New Microsoft.Office.Interop.Excel.Application Sub Suchen_click call verz_einlesen excel.visible = true ' wenn man zugucken will ansonsten false ABER NICHT ANKLICKEN. !!!! Sonst absturz. For i = 1 to anz_dateien call excel_lesen (Dateiname(i)) ' alle Excel_dateien der reihe nach wie eingelesen next i excel.quit end sub Sub verz_einlesen ' einlesen der Verzeichnisse in ein Array (geht auch ohne aber ich mag es hübsch). anz_Dateien = X End sub Sub excel_lesen (such_datei as string) excel.Workbooks.Open(such_datei) letztespalte = excel.Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Column letztezelle = excel.Range("A1").SpecialCells(xlCellTypeLastCell).Address for i = 1 to letztespalte for ii = 1 top letztezelle gefunden = false if instr(lcase(excel.Rows(ii).cells(i).value)) = lcase(Such_feld1.text) then gefunden = true if instr(lcase(excel.Rows(ii).cells(i).value)) = lcase(Such_feld2.text) then gefunden = true If gefunden = true then ' mach was damit end if next ii next i excel.Workbooks.close end sub end class **************************** Anmerkung : Diese Suchroutinen sucht das der Zeichenkette im Text der Zelle. Groß/Kleinschreibung wird ignoriert. Instr = Befehl eine Zeichenkette zu suchen lcase = Setzt den Text in Kleinbuchstaben Beides kann man weglassen. Der Code ist nicht vollständig (Ich mach nicht die ganze Arbeit) aber so funktioniert es in etwa. Der Code sollte in VC ähnlich funktionieren bloss mit viel zu viel blöden Klammern deshalb mag ich C nicht ;) Einziger Nachteil des ganzen SCHNELL IST DAS NICHT
In fast jeder Programmiersprache gibt es eine Import und Export library für Office.. Auch in c. Kommt noch darauf an ob sich die Tabellen noch ändern oder fix sind.. Wenn fix lohnt es sich die mit zum Beispiel soffice in csv umzuwandeln und in sqlite zu importieren.
Nikolas W. schrieb: > Das Ziel meines Projektes ist, dass ich ein Eingabefenster habe indem > ich zwei Eingaben mache und dadurch aus zirka 100 Excel Listen mir die > relevanten Zeilen ausgegeben werden. Hast du MS-Office pro? Falls ja, ist die einfachste Lösung, Access zu benutzen. Damit brauchst du nämlich fast nichts zu programmieren. Access bietet bereits alles, um ein GUI zu basteln, um Excel-Tabellen als Datenquelle und Datenziel zu verwenden und um eine Abfrage auf die Quelltabelle(n) in einem GUI zusammenzuklicken. Alles, was noch zu programmieren bleibt, ist das Iterieren über mehrere Quelltabellen.
Sie Deine Dateien im XLSX oder XLS Format? Wenn xlsx, dann sind das doch einfach nur XML Dateien, die Du in C mit einem Parser Deiner Wahl parsen kannst. Das ist keineswegs kompliziert oder aufwendig. Ansonsten wirst Du Dich mit Deinen C Kenntnissen ja auch in Perl oder PHP zurecht finden. Da gibts jeweils auch ext. Module zum Parsen von XLS Dateien.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.