Frage

Gibt es eine kostenlose oder Open-Source-Bibliothek zum direkten Lesen von Excel-Dateien (.xls) aus einem C#-Programm?

Es muss nicht allzu ausgefallen sein, einfach ein Arbeitsblatt auszuwählen und die Daten als Zeichenfolgen zu lesen.Bisher habe ich die Textfunktion „In Unicode exportieren“ von Excel verwendet und die resultierende (durch Tabulatoren getrennte) Datei analysiert, möchte den manuellen Schritt jedoch eliminieren.

War es hilfreich?

Lösung

var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();

adapter.Fill(ds, "anyNameHere");

DataTable data = ds.Tables["anyNameHere"];

Das ist es, was ich normalerweise verwende.Es ist etwas anders, weil ich normalerweise ein AsEnumerable() an die Bearbeitung der Tabellen anhänge:

var data = ds.Tables["anyNameHere"].AsEnumerable();

Dadurch kann ich LINQ verwenden, um Strukturen aus den Feldern zu suchen und zu erstellen.

var query = data.Where(x => x.Field<string>("phoneNumber") != string.Empty).Select(x =>
                new MyContact
                    {
                        firstName= x.Field<string>("First Name"),
                        lastName = x.Field<string>("Last Name"),
                        phoneNumber =x.Field<string>("Phone Number"),
                    });

Andere Tipps

Wenn es sich nur um einfache Daten handelt, die in der Excel-Datei enthalten sind, können Sie die Daten über ADO.NET lesen.Sehen Sie sich die hier aufgeführten Verbindungszeichenfolgen an:

http://www.connectionstrings.com/?carrier=excel2007oderhttp://www.connectionstrings.com/?carrier=excel

-Ryan

Aktualisieren:Dann können Sie das Arbeitsblatt einfach über etwas wie lesen select * from [Sheet1$]

Der ADO.NET-Ansatz ist schnell und einfach, weist jedoch einige Besonderheiten auf, die Sie beachten sollten, insbesondere im Hinblick auf die Handhabung von Datentypen.

Dieser hervorragende Artikel hilft Ihnen, einige häufige Fallstricke zu vermeiden:http://blog.lab49.com/archives/196

Folgendes habe ich für Excel 2003 verwendet:

Dictionary<string, string> props = new Dictionary<string, string>();
props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
props["Data Source"] = repFile;
props["Extended Properties"] = "Excel 8.0";

StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> prop in props)
{
    sb.Append(prop.Key);
    sb.Append('=');
    sb.Append(prop.Value);
    sb.Append(';');
}
string properties = sb.ToString();

using (OleDbConnection conn = new OleDbConnection(properties))
{
    conn.Open();
    DataSet ds = new DataSet();
    string columns = String.Join(",", columnNames.ToArray());
    using (OleDbDataAdapter da = new OleDbDataAdapter(
        "SELECT " + columns + " FROM [" + worksheet + "$]", conn))
    {
        DataTable dt = new DataTable(tableName);
        da.Fill(dt);
        ds.Tables.Add(dt);
    }
}

Wie wäre es mit Excel Data Reader?

http://exceldatareader.codeplex.com/

Ich habe es in einer Produktionsumgebung verwendet, um große Datenmengen aus einer Vielzahl von Excel-Dateien in SQL Server Compact zu ziehen.Es funktioniert sehr gut und ist ziemlich robust.

Hier ist ein Code, den ich vor ein paar Jahren in C# mit .NET 1.1 geschrieben habe.Ich bin mir nicht sicher, ob das genau das ist, was Sie brauchen (und vielleicht nicht mein bester Code :)).

using System;
using System.Data;
using System.Data.OleDb;

namespace ExportExcelToAccess
{
    /// <summary>
    /// Summary description for ExcelHelper.
    /// </summary>
    public sealed class ExcelHelper
    {
        private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";";

        public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName)
        {
            OleDbConnection objConnection = new OleDbConnection();
            objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName));
            DataSet dsImport = new DataSet();

            try
            {
                objConnection.Open();

                DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if( (null == dtSchema) || ( dtSchema.Rows.Count <= 0 ) )
                {
                    //raise exception if needed
                }

                if( (null != sheetName) && (0 != sheetName.Length))
                {
                    if( !CheckIfSheetNameExists(sheetName, dtSchema) )
                    {
                        //raise exception if needed
                    }
                }
                else
                {
                    //Reading the first sheet name from the Excel file.
                    sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();
                }

                new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection ).Fill(dsImport);
            }
            catch (Exception)
            {
                //raise exception if needed
            }
            finally
            {
                // Clean up.
                if(objConnection != null)
                {
                    objConnection.Close();
                    objConnection.Dispose();
                }
            }


            return dsImport.Tables[0];
            #region Commented code for importing data from CSV file.
            //              string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + System.IO.Path.GetDirectoryName(fullFileName) +";" +"Extended Properties=\"Text;HDR=YES;FMT=Delimited\"";
            //
            //              System.Data.OleDb.OleDbConnection conText = new System.Data.OleDb.OleDbConnection(strConnectionString);
            //              new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(fullFileName).Replace(".", "#"), conText).Fill(dsImport);
            //              return dsImport.Tables[0];

            #endregion
        }

        /// <summary>
        /// This method checks if the user entered sheetName exists in the Schema Table
        /// </summary>
        /// <param name="sheetName">Sheet name to be verified</param>
        /// <param name="dtSchema">schema table </param>
        private static bool CheckIfSheetNameExists(string sheetName, DataTable dtSchema)
        {
            foreach(DataRow dataRow in dtSchema.Rows)
            {
                if( sheetName == dataRow["TABLE_NAME"].ToString() )
                {
                    return true;
                }   
            }
            return false;
        }
    }
}

Koogra ist eine in C# geschriebene Open-Source-Komponente, die Excel-Dateien liest und schreibt.

Während Sie ausdrücklich nach .xls gefragt haben, also den älteren Dateiformaten, sind die OpenXML-Formate (z. B.xlsx) Ich empfehle das OpenXML SDK (http://msdn.microsoft.com/en-us/library/bb448854.aspx)

Ich habe vor einiger Zeit viel aus Excel-Dateien in C# gelesen und wir haben zwei Ansätze verwendet:

  • Die COM-API, über die Sie direkt auf Excel-Objekte zugreifen und diese über Methoden und Eigenschaften bearbeiten können
  • Der ODBC-Treiber, der es ermöglicht, Excel wie eine Datenbank zu verwenden.

Letzterer Ansatz war viel Schneller:Das Lesen einer großen Tabelle mit 20 Spalten und 200 Zeilen würde über COM 30 Sekunden und über ODBC eine halbe Sekunde dauern.Daher würde ich den Datenbankansatz empfehlen, wenn Sie nur die Daten benötigen.

Prost,

Carl

ExcelMapper ist ein Open-Source-Tool (http://code.google.com/p/excelmapper/), mit dem Excel-Arbeitsblätter als stark typisierte Objekte gelesen werden können.Es unterstützt sowohl XLS- als auch XLSX-Formate.

Ich möchte eine einfache Methode zum Lesen von XLS/XLSX-Dateien mit .NET zeigen.Ich hoffe, dass das Folgende für Sie hilfreich sein wird.

 private DataTable ReadExcelToTable(string path)    
 {

     //Connection String

     string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  
     //the same name 
     //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 

     using(OleDbConnection conn = new OleDbConnection(connstring))
     {
        conn.Open();
        //Get All Sheets Name
        DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  

        //Get the First Sheet Name
        string firstSheetName = sheetsName.Rows[0][2].ToString(); 

        //Query String 
        string sql = string.Format("SELECT * FROM [{0}]",firstSheetName); 
        OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);
        DataSet set = new DataSet();
        ada.Fill(set);
        return set.Tables[0];   
   }
 }

Code stammt aus Artikel: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/.Weitere Einzelheiten können Sie daraus entnehmen.

Nicht kostenlos, aber mit dem neuesten Office gibt es eine sehr schöne Automatisierung .Net API.(Es gab schon seit langem eine API, aber es war ein fieses COM.) Sie können im Code alles tun, was Sie wollen/brauchen, während die Office-App ein versteckter Hintergrundprozess bleibt.

Verzeihen Sie mir, wenn ich hier falsch liege, aber ist das nicht das Richtige? Büro-PIAs sind für?

In letzter Zeit, teilweise um bei LINQ besser zu werden ...Ich habe die Automatisierungs-API von Excel verwendet, um die Datei als XML-Tabelle zu speichern und diese Datei dann mit LINQ to XML zu verarbeiten.

SpreadsheetGear für .NET ist eine Excel-kompatible Tabellenkalkulationskomponente für .NET.Was unsere Kunden über die Leistung sagen, können Sie auf der rechten Seite unserer Seite sehen Produktseite.Sie können es selbst mit der kostenlosen, voll funktionsfähigen Version ausprobieren Auswertung.

SmartXLS ist eine weitere Excel-Tabellenkalkulationskomponente, die die meisten Funktionen von Excel-Diagrammen und Formel-Engines unterstützt und das OpenXML-Format von Excel2007 lesen/schreiben kann.

Die .NET-Komponente Excel Reader .NET könnte Ihre Anforderungen erfüllen.Es ist gut genug zum Lesen von XLSX- und XLS-Dateien.Probieren Sie es also aus:

http://www.devtriogroup.com/ExcelReader

Ich empfehle die FileHelpers-Bibliothek, eine kostenlose und benutzerfreundliche .NET-Bibliothek zum Importieren/Exportieren von Daten aus Excel, Datensätzen mit fester Länge oder durch Trennzeichen in Dateien, Zeichenfolgen oder Streams und mehr.

Der Abschnitt zur Dokumentation von Excel-Datenverknüpfungen http://filehelpers.sourceforge.net/example_exceldatalink.html

Sie können diese Open-Source-Lösung ausprobieren, die den Umgang mit Excel viel sauberer macht.

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear ist großartig.Ja, es ist zwar kostspielig, aber im Vergleich zum Hantieren mit diesen anderen Lösungen ist es die Kosten wert.Es ist schnell, zuverlässig, sehr umfassend und ich muss sagen, nachdem ich dieses Produkt über eineinhalb Jahre lang in meinem Vollzeitjob als Softwareentwickler verwendet habe, ist der Kundensupport fantastisch!

Die von uns verwendete Lösung musste:

  • Erlauben Lesen Schreiben von Excel erstellten Dateien
  • Sei Schnell in der Leistung (nicht wie bei der Verwendung von COMs)
  • Seien Sie MS Office Unabhängig (muss ohne Clients nutzbar sein, auf denen MS Office installiert ist)
  • Sei Frei oder Open Source (aber aktiv entwickelt)

Es gibt mehrere Möglichkeiten, aber wir haben sie gefunden NPoi (.NET-Port von Java ist schon lange vorhanden Poi Open-Source-Projekt), um das Beste zu sein:http://npoi.codeplex.com/

Es ermöglicht auch die Arbeit mit den Dateiformaten .doc und .ppt

Wenn es sich nur um tabellarische Daten handelt.Ich würde File Data Helper von Marcos Melli empfehlen, die heruntergeladen werden können Hier.

Zu spät zur Party, aber ich bin ein Fan von LinqToExcel

Sie könnten eine Excel-Tabelle schreiben, die eine bestimmte Excel-Tabelle lädt und als CSV speichert (anstatt dies manuell zu tun).

dann könnten Sie das von c# aus automatisieren.

und sobald es im CSV-Format ist, kann das C#-Programm das erfassen.

(Wenn Sie außerdem aufgefordert werden, in Excel zu programmieren, tun Sie am besten so, als wüssten Sie nicht, wie)

(bearbeiten:Ach ja, Rob und Ryan haben beide Recht)

Ich weiß, dass zu diesem Zweck eine Excel-„Erweiterung“ erstellt wurde.
Sie erstellen in Excel mehr oder weniger eine Schaltfläche mit der Aufschrift „In Programm X exportieren“ und exportieren und senden die Daten dann in einem Format, das das Programm lesen kann.

http://msdn.microsoft.com/en-us/library/ms186213.aspx sollte ein guter Anfang sein.

Viel Glück

Ich habe gerade ein kurzes Demoprojekt durchgeführt, bei dem einige Excel-Dateien verwaltet werden mussten.Die .NET-Komponente der GemBox-Software war für meine Bedürfnisse ausreichend.Es gibt eine kostenlose Version mit einigen Einschränkungen.

http://www.gemboxsoftware.com/GBSpreadsheet.htm

Excel-Paket ist eine Open-Source-Komponente (GPL) zum Lesen/Schreiben von Excel 2007-Dateien.Ich habe es für ein kleines Projekt verwendet und die API ist unkompliziert.Funktioniert nur mit XLSX (Excel 200&), nicht mit XLS.

Der Quellcode scheint auch gut organisiert und leicht zu umgehen zu sein (wenn Sie die Funktionalität erweitern oder kleinere Probleme beheben müssen, wie ich es getan habe).

Zuerst habe ich den ADO.Net-Ansatz (Excel-Verbindungszeichenfolge) ausprobiert, aber er war mit fiesen Hacks behaftet – zum Beispiel if zweite Enthält die Zeile eine Zahl, werden Ganzzahlen für alle Felder in der Spalte darunter zurückgegeben und alle Daten, die nicht passen, werden stillschweigend gelöscht.

Wir gebrauchen ClosedXML in ziemlich großen Systemen.

  • Frei
  • Einfach zu installieren
  • Einfache Codierung
  • Sehr reaktionsschneller Support
  • Entwicklerteam ist extrem offen für neue Vorschläge.Oftmals werden neue Funktionen und Fehlerbehebungen innerhalb derselben Woche implementiert

Take.io Spreadsheet erledigt diese Arbeit kostenlos für Sie.Schauen Sie einfach mal vorbei Das.

Ich habe es gerade verwendet ExcelLibrary um eine XLS-Tabelle in ein DataSet zu laden.Hat bei mir super funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top