C# zum Lesen von Excel-Dateien und zum Exportieren von Daten in DataTable und Datenbank

2024-01-25 07:14:39 Administrator

Das Lesen von Excel-Dateien in C# ist eine häufige Anforderung für viele Anwendungen, sei es für Datenanalyse, Berichterstattung oder Datenbankintegration. Während die Interop-Bibliotheken von Microsoft verwendet werden können, haben sie Einschränkungen (z. B. die Notwendigkeit, dass Excel installiert ist). Stattdessen werden wir einen effizienteren Ansatz mit Spire.XLS untersuchen, einer .NET-Bibliothek, die das Lesen und Schreiben von Excel-Dateien ohne Interop ermöglicht. Dieser Artikel behandelt:

C# .NET-Bibliothek zum Lesen von Excel ohne Interop

Microsofts Excel Interop erfordert, dass Excel auf dem Computer installiert ist, was es für serverseitige Anwendungen ungeeignet macht. Stattdessen bieten Bibliotheken wie Spire.XLS eine leichtgewichtige, hochleistungsfähige Lösung ohne Abhängigkeiten von Excel.

Warum Spire.XLS verwenden?

  • Keine Excel-Installation erforderlich – Funktioniert unabhängig.
  • Unterstützt .NET Core & .NET Framework – Plattformübergreifende Kompatibilität.
  • Excel-Dateien lesen/schreiben – Unterstützt .xls, .xlsx und .xlsm.
  • Import in DataTable & Datenbanken – Nahtlose Integration mit ADO.NET.

Installation von Spire.XLS

Um zu beginnen, installieren Sie die Bibliothek über den NuGet Package Manager:

Install-Package Spire.XLS

Alternativ können Sie Spire.XLS für .NET von unserer offiziellen Website herunterladen und die DLL-Datei manuell referenzieren.

Wie man eine Excel-Datei in C# liest

Dieser Abschnitt zeigt, wie man eine Excel-Datei in C# mit der Spire.XLS-Bibliothek liest. Der Prozess umfasst das Laden der Datei, den Zugriff auf Arbeitsblätter und das programmgesteuerte Abrufen von Zellwerten. Dies ist nützlich für die Automatisierung der Datenextraktion, die Verarbeitung von Excel-Berichten oder die Integration von Tabellenkalkulationsdaten in Anwendungen.

Schritt 1. Notwendigen Namespace importieren

Um die Funktionalität von Spire.XLS zu nutzen, müssen Sie dessen Namespace importieren. Dies ermöglicht den Zugriff auf Klassen wie Workbook und Worksheet, die für Excel-Dateioperationen unerlässlich sind.

  • C#
using Spire.Xls;

Schritt 2. Eine Excel-Datei laden

Um eine Excel-Datei zu laden, erstellen Sie ein Workbook-Objekt und rufen Sie die Methode LoadFromFile auf. Dadurch wird die Datei in den Speicher gelesen, was eine weitere Bearbeitung ermöglicht.

  • C#
Workbook wb = new Workbook();
wb.LoadFromFile("input.xlsx");

Schritt 3. Ein bestimmtes Arbeitsblatt abrufen

Excel-Dateien können mehrere Arbeitsblätter enthalten. Sie können auf ein bestimmtes Blatt zugreifen, indem Sie die Worksheets-Sammlung indizieren (nullbasiert). Das erste Blatt befindet sich am Index 0, das zweite am Index 1 und so weiter.

  • C#
Worksheet sheet = wb.Worksheets[0]; //Erstes Blatt

Schritt 4. Wert einer bestimmten Zelle abrufen

Um den Wert einer Zelle abzurufen, verwenden Sie die Eigenschaft CellRange.Value. Geben Sie die Zeilen- und Spaltenindizes (beginnend bei 1) an, um die Zelle zu lokalisieren. Dies ist nützlich zum Extrahieren strukturierter Daten wie Kopfzeilen oder einzelner Datensätze.

  • C#
CellRange cell = sheet.Range[1, 1]; // Zeile1, Spalte 1 (A1)
string value = cell.Value;

Unten finden Sie ein vollständiges Beispiel zum Lesen von Daten aus einem gesamten Arbeitsblatt und zum Ausgeben in der Konsole:

  • C#
using Spire.Xls;

namespace ReadExcelData
{
    class Program
    {
        static void Main(string[] args)
        {
            // Erstellen Sie ein Workbook-Objekt
            Workbook wb = new Workbook();

            // Laden Sie eine vorhandene Excel-Datei
            wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

            // Holen Sie sich das erste Arbeitsblatt
            Worksheet sheet = wb.Worksheets[0];

            // Holen Sie sich den Zellbereich, der Daten enthält
            CellRange locatedRange = sheet.AllocatedRange;

            // Iterieren Sie durch die Zeilen
            for (int i = 0; i < locatedRange.Rows.Length; i++)
            {
                // Iterieren Sie durch die Spalten
                for (int j = 0; j < locatedRange.Rows[i].ColumnCount; j++)
                {
                    // Holen Sie sich die Daten einer bestimmten Zelle
                    string cellValue = locatedRange[i + 1, j + 1].Value?.ToString() ?? "N/A";

                    // Richten Sie die Ausgabe mit einer Breite von 22 aus
                    Console.Write($"{cellValue,-22}");
                }
                Console.WriteLine();
            }
        }
    }
}

Ergebnis:

Excel-Datei in C# lesen

Excel-Daten in eine DataTable einlesen

Das Exportieren von Excel-Daten in eine DataTable ermöglicht eine nahtlose Integration mit UI-Steuerelementen wie DataGridView oder der Backend-Datenverarbeitung. Spire.XLS vereinfacht diesen Prozess mit seiner integrierten Methode ExportDataTable(), die Arbeitsblattdaten automatisch in eine strukturierte DataTable konvertiert und dabei Spaltenüberschriften und Datentypen beibehält.

Schritt 1. Notwendigen Namespace importieren

Fügen Sie den Spire.XLS-Namespace hinzu, um auf wesentliche Klassen zuzugreifen.

  • C#
using Spire.Xls;

Schritt 2. Ein Formular und ein Button-Klick-Ereignis erstellen

Erstellen Sie ein Formular (z. B. Form1) und fügen Sie eine Schaltfläche mit einem Ereignishandler zum Lesen der Excel-Datei hinzu.

  • C#
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Der Code kommt hierher
    }
}

Schritt 3. Das Arbeitsbuch laden

Erstellen Sie innerhalb des Button-Klick-Ereignisses ein Workbook-Objekt und laden Sie die Excel-Datei.

  • C#
Workbook wb = new Workbook();
wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

Schritt 4. Daten in DataTable exportieren

Greifen Sie über seinen Index auf ein bestimmtes Arbeitsblatt zu und exportieren Sie seine Daten mit der Methode ExportDataTable in eine DataTable.

  • C#
DataTable dataTable = wb.Worksheets[0].ExportDataTable();

Schritt 5. Daten an DataGridView binden

Angenommen, Sie haben ein DataGridView-Steuerelement in Ihrem Formular, binden Sie die DataTable an das DataGridView, um die Daten anzuzeigen.

  • C#
dataGridView1.DataSource = dataTable;

Das Folgende ist der vollständige Code zum Lesen von Daten aus einer Excel-Datei in eine DataTable und zum Anzeigen in einem Windows Forms DataGridView-Steuerelement:

  • C#
using Spire.Xls;
using System.Data;

namespace ReadExcelIntoDataTable
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Erstellen Sie ein Workbook-Objekt
            Workbook wb = new Workbook();

            // Laden Sie eine vorhandene Excel-Datei
            wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

            // Holen Sie sich das erste Arbeitsblatt
            Worksheet sheet = wb.Worksheets[0];

            // Exportieren Sie Daten aus dem Arbeitsblatt in eine DataTable
            DataTable dataTable = sheet.ExportDataTable();

            // Binden Sie die DataTable an das DataGridView
            dataGridView1.DataSource = dataTable;

            // Geben Sie Ressourcen frei
            wb.Dispose();
        }
    }
}

Ergebnis:

Die Excel-Daten werden in einer MySQL-Tabelle angezeigt.

Excel-Daten in eine Datenbank einlesen

Die Integration von Excel-Daten in eine Datenbank kann die Datenverwaltung optimieren. Im Folgenden führen wir Sie durch den Prozess des Lesens einer Excel-Datei und des Imports ihres Inhalts in eine MySQL-Datenbank. Diese Methode ist ideal für die Automatisierung der Datenmigration, die Berichterstellung oder die Synchronisierung von Excel-Daten mit einer strukturierten Datenbank.

Schritt 1. MySQL-Datenbibliothek installieren

Um mit MySQL-Datenbanken in Ihren .NET-Anwendungen zu interagieren, müssen Sie die Bibliothek MySql.Data installieren. Dieses NuGet-Paket stellt die notwendigen Klassen und Methoden zur Verfügung, um eine Verbindung zu MySQL-Datenbanken herzustellen und diese zu bearbeiten.

  • C#
Install-Package MySql.Data

Schritt 2. Notwendige Namespaces importieren

Bevor Sie mit Excel-Dateien und MySQL arbeiten, müssen Sie die erforderlichen Namespaces einbinden. Spire.XLS wird für Excel-Operationen verwendet, während MySql.Data.MySqlClient die Konnektivität zu MySQL-Datenbanken ermöglicht.

  • C#
using Spire.Xls;
using MySql.Data.MySqlClient;

Schritt 3. Kopfzeilen und Daten aus Excel extrahieren

Der folgende Codeausschnitt zeigt, wie Kopfzeilen und Daten aus der Excel-Datei extrahiert werden. Die Kopfzeilen werden bereinigt, um Konflikte bei der Benennung von MySQL-Spalten zu vermeiden, während die Daten in einem strukturierten Format für das spätere Einfügen gespeichert werden.

  • C#
// Erstellen Sie ein Workbook-Objekt
Workbook wb = new Workbook();

// Laden Sie ein Excel-Dokument
wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

// Holen Sie sich ein bestimmtes Blatt
Worksheet sheet = wb.Worksheets[0];

// Rufen Sie die Kopfzeilen ab
List<string> headers = new List<string>();
for (int col = 1; col <= sheet.LastColumn; col++)
{
    string header = sheet.Range[1, col].Value?.ToString();
    // Leerzeichen entfernen, um Konflikte mit MySQL-Spaltennamen zu vermeiden
    string cleanHeader = header?.Replace(" ", "");
    headers.Add($"`{cleanHeader}`");
}

// Rufen Sie die Daten ab
List<List<string>> data = new List<List<string>>();
for (int row = 2; row <= sheet.LastRow; row++) {
    List<string> record = new List<string>();
    for (int col = 1; col <= sheet.LastColumn; col++)
    {
        record.Add(sheet.Range[row, col].Value?.ToString() ?? string.Empty);
    }
    data.Add(record);
}

Schritt 4. Mit einer MySQL-Datenbank verbinden

Eine Verbindung zur MySQL-Datenbank wird über eine Verbindungszeichenfolge hergestellt, die Serverdetails, Anmeldeinformationen und den Namen der Zieldatenbank enthält. Die using-Anweisung stellt die ordnungsgemäße Freigabe von Ressourcen sicher.

  • C#
string connectionString = "server=localhost;user=root;password=yourpassword;database=yourdatabase;";
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
    connection.Open();
    // Die Verbindung ist hergestellt; führen Sie hier Datenbankoperationen durch
}

Schritt 5. Dynamisch eine Tabelle in MySQL erstellen

Dieser Schritt generiert dynamisch eine MySQL-Tabelle mit Spalten, die den Excel-Kopfzeilen entsprechen. Der Einfachheit halber werden alle Spalten als VARCHAR(255) festgelegt, aber die Datentypen können je nach Anforderungen angepasst werden.

  • C#
// Erstellen Sie eine Tabelle mit dynamischen Spalten basierend auf den Kopfzeilen
List<string> columns = new List<string>();
foreach (string header in headers)
{
    // Annahme, dass alle Kopfzeilenwerte zur Vereinfachung VARCHAR sind; passen Sie die Typen nach Bedarf an
    columns.Add($"{header} VARCHAR(255)");
}

// Erstellen Sie eine Tabelle in der Datenbank
string columnsSql = string.Join(", ", columns);
string createTableQuery = $ @"
    CREATE TABLE IF NOT EXISTS my_table (
        id INT AUTO_INCREMENT PRIMARY KEY,
        {columnsSql}
)";

// Führen Sie die Abfrage zum Erstellen der Tabelle aus
using (MySqlCommand createCommand = new MySqlCommand(createTableQuery, connection))
{
    createCommand.ExecuteNonQuery();
}

Schritt 6. Die Tabelle mit Daten füllen

Die extrahierten Excel-Daten werden mithilfe parametrisierter Abfragen in die MySQL-Tabelle eingefügt, um SQL-Injection zu verhindern. Jede Zeile aus der Excel-Datei wird einem entsprechenden Datenbankdatensatz zugeordnet.

  • C#
// Bereiten Sie die SQL-INSERT-Anweisung vor
string placeholders = string.Join(", ", new string[headers.Count].Select(h => "?"));
string insertQuery = $"INSERT INTO my_table ({string.Join(", ", headers.Select(h => h.Trim('`')))}) VALUES ({placeholders})";

// Fügen Sie Daten in die Tabelle ein
foreach (List<string> record in data)
{
    using (MySqlCommand insertCommand = new MySqlCommand(insertQuery, connection))
    {
        for (int i = 0; i < record.Count; i++)
        {
            insertCommand.Parameters.AddWithValue($" @2024\本地文件打包__20180302\Spire.Web\trunk\src\website\components\com_virtuemart\themes\default\templates\browse\includes\browse_searchparameter_form.tpl.php{i}", record[i]);
        }
        insertCommand.ExecuteNonQuery();
    }
}

Hier ist der vollständige Code zum Importieren von Daten aus einer Excel-Datei in eine MySQL-Tabelle:

  • C#
using Spire.Xls;
using MySql.Data.MySqlClient;

namespace ExcelToMySQL
{
    class Program
    {
        static void Main(string[] args)
        {
            // Erstellen Sie ein Workbook-Objekt
            Workbook wb = new Workbook();

            // Laden Sie ein Excel-Dokument
            wb.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.xlsx");

            // Holen Sie sich ein bestimmtes Blatt
            Worksheet sheet = wb.Worksheets[0];

            // Rufen Sie die Kopfzeilen ab
            List<string> headers = new List<string>();
            for (int col = 1; col <= sheet.LastColumn; col++)
            {
                string header = sheet.Range[1, col].Value?.ToString();
                // Leerzeichen entfernen, um Konflikte mit MySQL-Spaltennamen zu vermeiden
                string cleanHeader = header?.Replace(" ", "");
                headers.Add($"`{cleanHeader}`");
            }

            // Rufen Sie die Daten ab
            List<List<string>> data = new List<List<string>>();
            for (int row = 2; row <= sheet.LastRow; row++)
            {
                List<string> record = new List<string>();
                for (int col = 1; col <= sheet.LastColumn; col++)
                {
                    record.Add(sheet.Range[row, col].Value?.ToString() ?? string.Empty);
                }
                data.Add(record);
            }

            // Stellen Sie eine Verbindung zur MySQL-Datenbank her
            string connectionString = "server=localhost;user=root;password=admin;database=excel_db;";
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                connection.Open();

                // Erstellen Sie eine Tabelle mit dynamischen Spalten basierend auf den Kopfzeilen
                List<string> columns = new List<string>();
                foreach (string header in headers)
                {
                    // Annahme, dass alle Kopfzeilenwerte zur Vereinfachung VARCHAR sind; passen Sie die Typen nach Bedarf an
                    columns.Add($"{header} VARCHAR(255)");
                }

                // Erstellen Sie eine Tabelle in der Datenbank
                string columnsSql = string.Join(", ", columns);
                string createTableQuery = $ @"
                    CREATE TABLE IF NOT EXISTS my_table (
                        id INT AUTO_INCREMENT PRIMARY KEY,
                        {columnsSql}
                    )";

                // Führen Sie die Abfrage zum Erstellen der Tabelle aus
                using (MySqlCommand createCommand = new MySqlCommand(createTableQuery, connection))
                {
                    createCommand.ExecuteNonQuery();
                }

                // Bereiten Sie die SQL-INSERT-Anweisung vor
                string placeholders = string.Join(", ", new string[headers.Count].Select(h => "?"));
                string insertQuery = $"INSERT INTO my_table ({string.Join(", ", headers.Select(h => h.Trim('`')))}) VALUES ({placeholders})";

                // Fügen Sie Daten in die Tabelle ein
                foreach (List<string> record in data)
                {
                    using (MySqlCommand insertCommand = new MySqlCommand(insertQuery, connection))
                    {
                        for (int i = 0; i < record.Count; i++)
                        {
                            insertCommand.Parameters.AddWithValue($" @2024\本地文件打包__20180302\Spire.Web\trunk\src\website\components\com_virtuemart\themes\default\templates\browse\includes\browse_searchparameter_form.tpl.php{i}", record[i]);
                        }
                        insertCommand.ExecuteNonQuery();
                    }
                }
            }

            Console.WriteLine("Daten erfolgreich exportiert!");
        }
    }
}

Ergebnis:

Die Excel-Daten werden in einer MySQL-Tabelle angezeigt.

Fazit

Das Lesen von Excel-Dateien in C# war noch nie einfacher, dank Bibliotheken wie Spire.XLS. Dieser Leitfaden hat Sie durch den Prozess des Ladens von Excel-Dateien, des Lesens ihrer Inhalte und sogar des Imports der Daten in eine MySQL-Datenbank geführt. Mit diesen Techniken können Sie die Datenverarbeitungsfähigkeiten Ihrer Anwendungen erheblich verbessern.

FAQs

F1: Kann ich passwortgeschützte Excel-Dateien lesen?

A: Ja, Spire.XLS unterstützt das Lesen verschlüsselter Excel-Dateien mit:

  • C#
wb.OpenPassword = "psd";
wb.LoadFromFile("file.xlsx");

F2: Wie lese ich Formelergebnisse anstelle der Formel selbst?

A: Sie haben zwei Möglichkeiten, Formelergebnisse abzurufen:

Für einzelne Zellen:

Prüfen Sie mit CellRange.HasFormula, ob eine Zelle eine Formel enthält, und rufen Sie den Wert mit CellRange.FormulaValue ab:

  • C#
CellRange cell = sheet.Range[1, 1];
if (cell.HasFormula)
{
    string result = cell.FormulaValue.ToString();
}

Für den Massenexport in eine DataTable:

Verwenden Sie Worksheet.ExportDataTable() mit computedFormulaValue: true, um berechnete Werte zu exportieren:

  • C#
DataTable data = sheet.ExportDataTable(range, exportColumnNames: true, computedFormulaValue: true);

F3: Wie kann ich Excel-Daten in eine DataTable einlesen?

A: Verwenden Sie die von Spire.XLS bereitgestellte Methode Worksheet.ExportDataTable().

F4: Wie kann ich eine Excel-Datei zeilenweise lesen?

A: Beziehen Sie sich auf den folgenden Code:

  • C#
Workbook workbook = new Workbook();
workbook.LoadFromFile("input.xlsx");
Worksheet sheet = workbook.Worksheets[0];

for (int row = 1; row <= sheet.LastRow; row++)
{
    for (int col = 1; col <= sheet.LastColumn; col++)
    {
        string cellValue = sheet.Range[row, col].Value?.ToString() ?? string.Empty;
        Console.WriteLine(cellValue);
    }
}

Holen Sie sich eine kostenlose Lizenz

Um die Funktionen von Spire.XLS für .NET ohne Evaluierungseinschränkungen vollständig zu erleben, können Sie eine kostenlose 30-Tage-Testlizenz anfordern.

Siehe auch