C# und Excel, Allgemeine Fragen & Spezielle Rahmenbedingungen



  • Hallo,

    es geht mir hier nicht um vorgefertigte Lösungen, sondern Informationen wie kompliziert und umfangreich eine Realisierung unter .Net und C# ist, da ich hier bislang nur teils sehr schlechte Erfahrungen unter einer stark veralteten C++ Umgebung mit sehr speziellen Bibliotheken (bei der zudem auch im Internet nur sehr spärlich überhaupt noch Informationen zu finden sind) habe.

    Grundsätzlich geht es um eine recht simple Aufgabe:
    Tabellen aus Excel einlesen. Wichtig ist hierbei aber das möglichst alle derzeit verbreiteten Excelversionen unterstützt werden müssen. Die benötigte Informationen sind lediglich Spaltenformat und Spalteninhalt von einer einfachen Tabellenstuktur).
    Wie leicht/schwer ist es in C# auf unterschiedliche Excelversionen zuzugreifen?

    Ich weiß das es mindestens zwei Arten gibt auf die Informationen zuzugreifen. Einmal über Datenbanktreiber (Wobei ich hier nicht weiß wie kompliziert eine temporäre "Datenbank"-konfiguration ist, da ich mich mit so etwas noch nicht beschäftigen musste) und einmal über die Excelautomatisierung.

    cu André



  • relativ einfach schau dir das mal an:
    http://www.mycsharp.de/wbb2/thread.php?threadid=19410
    Weiter Besipiele, Code Snippets findest du mit der Suchfunktion



  • asc schrieb:

    Grundsätzlich geht es um eine recht simple Aufgabe:
    Tabellen aus Excel einlesen.

    Ich verwende seit Jahren eine Komponente von tmssoftware und bin SEHR zufrieden damit. Wirf doch mal einen Blick auf:

    http://www.tmssoftware.com/go.asp?flexcelnet



  • easys schrieb:

    relativ einfach schau dir das mal an:
    http://www.mycsharp.de/wbb2/thread.php?threadid=19410
    Weiter Besipiele, Code Snippets findest du mit der Suchfunktion

    Gerade das von dir gezeigte deckt beim ersten Überfliegen bereits nicht die Rahmenbedingungen ab (Wie "möglichst alle derzeit verbreiteten Excelversionen"). Ja, auf die Seite als solche bin ich auch schon gestoßen.

    Alles was ich bislang gefunden habe sagt mir folgendes:
    a) COM / Späte Bindung
    oder
    b) Externe Bibliothek

    Damit wäre ich fast wieder beim Ausgangspunkt, nur das es für C# ein paar Beispiele mehr gibt (Wobei der überwiegende Teil dennoch wegen den Rahmenbedingungen rausfällt). C# hat sich aber eh heute wieder erledigt, mal sehen was Morgen gilt, wobei das Übermorgen auch wieder hinfällig sein könnte...

    cu André



  • Was ist denn Deiner Meinung nach: "Alle derzeit verbreiteten Excel Versionen" ?



  • Knuddlbaer schrieb:

    Was ist denn Deiner Meinung nach: "Alle derzeit verbreiteten Excel Versionen" ?

    Ich würde mal sagen etwa ab 2000 an.

    cu André



  • Gehen dafür nicht die MS Office PIA's?



  • Der Zugriff auf Excel über die Microsoft Office Interop Assemblies ist an sich sehr gut dokumentiert. Die PIA's sind rückwertskompatibel, d.h. wenn Du dein Projekt mit den PIA's zu Office 2003 kompilierst, wird Deine Anwendung auch dann laufen, wenn auf dem Zielcomputer die Office 2007 PIA's installiert sind. Da es hier nur um COM Interop geht, und die Anwendung Excel auf dem Rechner installiert sein muss, werden alle Excel-Versionen unterstützt, welche das installierte Microsoft Office-Paket auch unterstützt. Wenn Du dir nicht sicher sein kannst, dass Excel auf dem Zielrechner installiert ist, solltest Du die PIA's nicht verwenden, sie bringen nichts. COM-Interop ist langsam, wenn Du Performanz brauchst, ist es keine gute Idee. COM-Interop hat seine Tücken. Wenn Du z.B. eine aus .NET über Automatisierung geöffnete Excel-Instanz schließen willst, MUSST Du als Interop-Akrobat begabt sein. Machst Du hier Fehler, wird die Excel-Instanz nicht geschlossen und ein Speicher-Leck beginnt. Ein Beispiel. Dieser Code öffnet eine Datei, formatiert die erste Zelle um und schließt die Datei bzw. Excel. Und so sieht es aus:

    using System;
    using System.Runtime.InteropServices;
    using Microsoft.Office.Interop.Excel;
    
    namespace ExcelCharacters
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                ApplicationClass exApp = new ApplicationClass();
    
                Workbook workbook = exApp.Workbooks.Open(
                    System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Data.xls"),
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing,
                    Type.Missing
                    );
    
                Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
    
                object missing = Type.Missing;
    
                Range firstCell = worksheet.get_Range("A1", missing);
                int length = firstCell.Value2.ToString().Length;
    
                Console.WriteLine(String.Format("Formatting '{0}'", firstCell.Value2.ToString()));
    
                for (int i = 1; i <= length; i = i + 2)
                {
                    firstCell.get_Characters(i, 1).Font.ColorIndex = 32;
                    firstCell.get_Characters(i, 1).Font.Bold = true;
                }
    
                workbook.Save();
    
                // Hexenküche...
    
                GC.Collect();
                GC.WaitForPendingFinalizers();
    
                Marshal.FinalReleaseComObject(firstCell);
                firstCell = null; 
    
                Marshal.FinalReleaseComObject(worksheet);
                worksheet = null; 
    
                workbook.Close(false, Type.Missing, Type.Missing); 
    
                Marshal.FinalReleaseComObject(workbook);
                workbook = null; 
    
                exApp.Quit();
    
                Marshal.FinalReleaseComObject(exApp);
                exApp = null; 
    
                Console.WriteLine("Press ENTER");
                Console.ReadLine();
            }
        }
    }
    

    Wenn Du sowas brauchst, dann ist dies der richtige Weg. 🙂


Anmelden zum Antworten