Forum: PC-Programmierung Programm Excel Listen auslesen


von Nikolas W. (nikolas)


Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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...

von Gascht (Gast)


Lesenswert?

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

von Wühlhase (Gast)


Lesenswert?

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.

von Wühlhase (Gast)


Lesenswert?

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.

von 900ss (900ss)


Lesenswert?

Mit Python lassen sich auch recht bequem Exceltabellen lesen und 
schreiben.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

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

von Karl II (Gast)


Lesenswert?

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.

von Sheeva P. (sheevaplug)


Lesenswert?

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.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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

von Philipp K. (philipp_k59)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Excellent (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.