Jump to content
  • 0
Melde dich an, um diesem Inhalt zu folgen  

Excel-Tabelle auslesen C#

Frage

Moinsen,

Ich hatte schonmal ein Projekt indem mein Programm eine Excel-Datei erstellen und verändern sollte.

Damals habe ich Office's Interop benutzt - und es war zum Haare raus reißen.

Jetzt brauche ich wieder ein programm, diesmal muss aber nur eine Excel-Tabelle (quasi eine csv, aber ist leider eine xls-Datei) ausgelesen und bestenfalls in einer DataTable gespeichert werden. Mich interessiert absolut nur der Inhalt der Zellen.

Im Internet habe ich nun etwas mit OleDb gefunden, aber das scheint mit Office 365 (Office 2016) null zu funktionieren, entweder bekomme ich die Meldung das der Provider auf meinem PC nicht eingerichtet ist oder dass ISAM nicht installiert ist. Ich hab zahlreiche OleDb-Connectionstrings versucht, aber alles was ich dazu finde ist veraltet (Office 2008/2010) udn auch wenn ich es sinngemäß auf Office 2016 übertragen möchte - es tut nicht.

Weiß jemand was mir fehlt oder gibt es vielleicht einen ganz anderen Ansatz um die Excel-Datei auszulesen (auf der Ziel-Maschine ist kein Excel installiert)?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

18 Antworten auf diese Frage

Empfohlene Beiträge

  • 0

Hallo @Tician!

Kommt evtl. R mit RStudio in Frage? Das wäre extrem leichtgewichtig und relativ simpel. 

Was genau war an den Interop Services das Problem?

Programmiersprache R – Einführung in R für C#-Programmierer

R Tools for Visual Studio

R Tools for Visual Studio - Doku

Gruß, Goulasz :goulasz: 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

R bringt hier nichts, weil R nicht das alte binäre Excel-format unterstützt.

Interop würde ich auch vermeiden wollen. Wir arbeiten damit noch und es macht bei unseren Kunden nur Probleme. Zu mal seit Office 2013 Microsoft die Architektur von Office geändert hat und noch mehr Probleme verursacht. 

Beim alten binären Excel-format fällt mir aber selber keine andere Möglichkeit ein, als Interop, weil das Format nicht Quelloffen ist und Excel somit das einzige Programm ist, was die Dateien zuverlässig öffnen kann.

Sonst kenne nur noch Spreadsheetgear, was ohne Excel auskommt aber das ist kostenpflichtig.

Wo genau liegen aber die Probleme mit Interop?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Hallo @Whiz-zarD!

Es ist 365 bzw. 2016 im Einsatz, wenn ich das richtig gelesen habe. 

vor 6 Stunden schrieb Tician:

[...]Im Internet habe ich nun etwas mit OleDb gefunden, aber das scheint mit Office 365 (Office 2016) null zu funktionieren,[...]

 

vor 6 Stunden schrieb Tician:

[...]Ich hab zahlreiche OleDb-Connectionstrings versucht, aber alles was ich dazu finde ist veraltet (Office 2008/2010) udn(sic!) auch wenn ich es sinngemäß auf Office 2016 übertragen möchte - es tut nicht.[...]

Gruß, Goulasz :goulasz: 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 28 Minuten schrieb Goulasz:

Hallo @Whiz-zarD!

Es ist 365 bzw. 2016 im Einsatz, wenn ich das richtig gelesen habe. 

Tach auch,

dürfte aber egal sein, weil:

Zitat

(auf der Ziel-Maschine ist kein Excel installiert)

Oder verstehe ich da wieder was aus der Programmiererecke nicht?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 16 Minuten schrieb Chief Wiggum:

Oder verstehe ich da wieder was aus der Programmiererecke nicht?

Das kommt auf die Zielumgebung an. Viele libraries in R bieten Basisfunktionalitäten zum Auslesen von Excel-Dateien an. CSV-Dateien kann man logischerweise immer mit Basisfunktionen einlesen. Für das gepackte xlsx kann es nötig sein, zusätzliche packages zu laden. Die kann man aber bundlen, sodass die Zielmaschine nicht irgendwelche Pakete z.B. vom CRAN ziehen muss.

Leider weiß ich nicht, wie genau die Zielumgebung aussieht.

Wenn ich geschlafen hab, suche ich mal 1, 2 Beispiele raus, wenn es für die Zielumgebung passt.

Gruß und gut Nacht, Goulasz :goulasz: 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 15 Stunden schrieb Tician:

(auf der Ziel-Maschine ist kein Excel installiert)

Oh, das habe ich vollkommen überlesen. Für Interop benötigt man eine Excel-Installation, weil hier ein Excel-Prozess gestartet wird und per COM mit Excel kommuniziert wird.

vor 7 Stunden schrieb Goulasz:

Das kommt auf die Zielumgebung an. Viele libraries in R bieten Basisfunktionalitäten zum Auslesen von Excel-Dateien an. CSV-Dateien kann man logischerweise immer mit Basisfunktionen einlesen. Für das gepackte xlsx kann es nötig sein, zusätzliche packages zu laden. Die kann man aber bundlen, sodass die Zielmaschine nicht irgendwelche Pakete z.B. vom CRAN ziehen muss.

Es kommt immer darauf an, was man mit den Daten vorhat. Ggf. ist R die bessere Wahl als C#. Wenn ich mir die R-Bibliotheken anschaue, dann wird fürs Einlesen des alten BIFF-Formats libxls genommen, was eine C-Bibliothek ist. Die Bibliothek beinhaltet das Kommandozeilen-Tool xls2csv, was eine xls-Datei in eine csv-Datei umwandelt. Wenn es unbedingt C# sein muss, dann könnte man mit diesem Tool versuchen, die xls-Datei in eine csv-Datei zu wandeln und dann diese dann mit der .Net-Bibliothek CsvHelper einlesen.

 

bearbeitet von Whiz-zarD

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Guten Morgen zusammen!

Ich glaube an dieser Stelle ist @Tician am Drücker, ein bisschen Input zu liefern. :)

Ich bin bei datenverarbeitenden Themen im alten Job ein großer Fan von R gewesen, weil es schnell, flexibel und relativ simpel in der Handhabung ist, wenn man die grundlegenden Themen der Datenstrukturen erstmal "drin" hat.

Gruß, Goulasz :goulasz: 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Huff, ihr braucht mehr Infos wenn ich das richtig sehe?

Das Dateiformat ist .xls und das immer (kein .xlsx). Wie gesagt auf der Maschine auf der das Programm laufen soll ist kein Excel installiert (Windows Server 2016), mir steht es frei welche Programmiersprache ich benutze oder ob zusätzliche Bibliotheken mit eingebunden werden müssen. Wobei die Idee die XML in eine CSV umzuwandeln mich gerade am ehesten interessieren würde weil für CSV habe ich bereits den Code - aber auch da scheine ich um Interop und OleDb nicht drum rum zu kommen.

Das Problem mit Interop (heute natürlich weil Excel nicht installiert ist) war, dass egal wie ich es versucht hab die Prozesse nicht beendet wurden und es die Klasse "Mashal" nicht (mehr?) gibt, die 90% der Beispiele ausmachen um die Prozesse sauber zu beenden.

Wenn ich das richtig sehe wird (auch durch den Faktor das es xls und keine xlsx-Dateien sind) wohl auf R hinaus laufen und bei heise hab ich gesehen dass das seit letztem Jahr auch von Visual Studio unterstützt wird.

Welche Infos braucht ihr denn?

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Guten Morgen @Tician!

xls heißt also doch BIFF, also altes Format. 

vor 40 Minuten schrieb Whiz-zarD:

[...]Wenn ich mir die R-Bibliotheken anschaue, dann wird fürs Einlesen des alten BIFF-Formats libxls genommen,[...]

Damit hat das Relevanz.

vor 5 Minuten schrieb Tician:

[...]Wobei die Idee die XML in eine CSV umzuwandeln mich gerade am ehesten interessieren würde weil für CSV habe ich bereits den Code[...]

Wie kommst du jetzt zu XML? Wenn du ein csv hast, kannst du in R einfach über read.csv die Dateien einlesen. Da brauchst du gar keine zusätzlichen packages mehr. 

Mit den R Tools in Visual Studio habe ich noch nicht gearbeitet, aber mit R Studio selbst habe ich gute Erfahrungen gemacht.

Gruß, Goulasz :goulasz: 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Für PHP gibt es https://github.com/PHPOffice/PHPExcel zum Lesen und Verarbeiten von Excel-Dateien. Funktioniert auch gut, benutze ich in verschiedenen Projekten im Job.

Da ergeben sich dann  noch ein paar Brainstorm-Möglichkeiten.

 

PHP-Skript auf beliebigen Webserver packen, Excel-Datei per

  • Formular auf Website
  • HTTP(S)-Request aus C#

an das Skript übergeben. Dort per PHPExcel die Daten extrahieren und

  • auf die Datenbank verbinden und die Daten direkt wegschreiben
  • Daten in ein beliebiges anderes Format (csv, whatever) übertragen und
    • direkt als neue Datei zurück geben
    • erstmal auf dem Server ablegen um sie "später" runterzuladen

Nachteil: Da müssen viele Daten rumgeschubst werden. Um sich vom Webserver auf die Datenbank zu verbinden reißt man vielleicht Sicherheitslücken ins System auf dem die Datenbank liegt. Generell Fragen der Datensicherheit.

 

Man könnte PHP auch auf dem lokalen Rechner installieren und das obige als Konsolenprogramm entwickeln.

Nachteile:  Es müsste PHP auf den Rechnern installiert werden, die Library müsste runtergeladen werden, das ganze müsste an den verschiedenen Rechnern aktualisiert werden wenn man Updates will.

Generell ist der Aufwand für einen PHP-Ansatz recht hoch.

 

Wäre vielleicht VBA eine Alternative? Damit habe ich vor ~6Jahren nur kurz gearbeitet. Aber ich weiß, dass man mit einem VBA-Programm verschiedene Excel-Dateien einlesen und deren Inhalt in andere Dateien schreiben kann.

Ich kann mir vorstellen, dass das Übertragen der Werte aus Excel in eine Textdatei nicht sooo aufwendig ist.

edit: nvm. Soll ja kein Excel installiert sein.

bearbeitet von PVoss

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Evtl. fehlen die passenden Data Access Components - gerade auf 64 Bit Systemen fehlen die mal (64Bit Office ist auch ne Pest).

Die Fehlermeldungen sind bei OLE/ADO leider oft nicht sonderlich hilfreich, da z.B. das Initialisieren einfachfehlschlägt, wenn z.B. nur der Pfad zur Datei nicht richtig ist oder bei CSVs die Schema.ini mit den Definitionen fehlt.

Ich spicke bei Connectionstrings gern hier: https://www.connectionstrings.com/

Da sind neben OLE auch eben ADO und andere Wrapper gelistet.

 

 

 

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Das hier hatte wohl gefehlt, um unter Server 2016 via OLEDB zuzugreifen:

https://www.microsoft.com/en-us/download/details.aspx?id=13255

Zitat

This download will install a set of components that facilitate the transfer of data between existing Microsoft Office files such as Microsoft Office Access 2010 (*.mdb and *.accdb) files and Microsoft Office Excel 2010 (*.xls, *.xlsx, and *.xlsb) files to other data sources such as Microsoft SQL Server. Connectivity to existing text files is also supported. ODBC and OLEDB drivers are installed for application developers to use in developing their applications with connectivity to Office file formats.

Connectionstring siehe mein voriges Posting. Office selbst braucht nicht installiert zu werden.

Beispiele hier: https://stackoverflow.com/questions/37195033/oledb-connection-string-for-excel-2016-in-c-sharp

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Ich krieg das Kotzen :(

R ohne irgendwelchen Zusatz zu installieren reicht nicht aus.

Müsste ich für die Lösung von RipperFox das Paket auch auf dem Server installieren auf dem das Programm laufen soll? Ich such immer noch nach einer Lösung um eine XLS-Datei automatisch in eine CSV-Datei umzuwandeln - und das ohne irgendetwas besonderes installieren zu müssen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Mit RipperFox' Methode konnte ich mich auf die Excel-Tabelle verbinden, aber weil ich es nicht hinbekommen habe die auszulesen hat sich das jetzt erledigt, mein Ausbilder hat es mit Perl innerhalb von 10 Minuten mit einem Parser geschafft :/

Feels bad >.<

 

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Du kommentierst als Gast. Wenn du bereits einen Account hast kannst du dich hier anmelden.
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoticons maximum are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Melde dich an, um diesem Inhalt zu folgen  

×