Heim > Backend-Entwicklung > C++ > Wie kann ich Excel-Tabellen effizient in eine Datentabelle in C# oder VB.NET einlesen?

Wie kann ich Excel-Tabellen effizient in eine Datentabelle in C# oder VB.NET einlesen?

Patricia Arquette
Freigeben: 2024-12-31 21:50:17
Original
709 Leute haben es durchsucht

How can I efficiently read Excel sheets into a DataTable in C# or VB.NET?

Excel-Tabellen in eine DataTable einlesen: Leistung und Effizienz optimieren

Sie sind auf eine häufige Herausforderung gestoßen – das schnelle und effiziente Importieren von Excel-Daten in eine DataTable. Ihre aktuelle VB-Lösung mit dem Microsoft Excel-Treiber ist ein praktikabler Ansatz, aber lassen Sie uns einige alternative Methoden untersuchen, die möglicherweise Verbesserungen bieten.

C#-Implementierung

Wenn Sie C# bevorzugen, finden Sie hier einen von Ciarán angepassten Ausschnitt Walshs Antwort:

string sSheetName = null;
string sConnection = null;
DataTable dtTablesList = default(DataTable);
OleDbCommand oleExcelCommand = default(OleDbCommand);
OleDbDataReader oleExcelReader = default(OleDbDataReader);
OleDbConnection oleExcelConnection = default(OleDbConnection);

sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.xls;Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\"";

oleExcelConnection = new OleDbConnection(sConnection);
oleExcelConnection.Open();

dtTablesList = oleExcelConnection.GetSchema("Tables");

if (dtTablesList.Rows.Count > 0)
{
    sSheetName = dtTablesList.Rows[0]["TABLE_NAME"].ToString();
}

dtTablesList.Clear();
dtTablesList.Dispose();


if (!string.IsNullOrEmpty(sSheetName))
{
    oleExcelCommand = oleExcelConnection.CreateCommand();
    oleExcelCommand.CommandText = "Select * From [" + sSheetName + "]";
    oleExcelCommand.CommandType = CommandType.Text;
    oleExcelReader = oleExcelCommand.ExecuteReader();
    nOutputRow = 0;

    while (oleExcelReader.Read())
    {
    }
    oleExcelReader.Close();
}
oleExcelConnection.Close();
Nach dem Login kopieren

Alternativen für Effizienz

Erwägen Sie die Verwendung der NPOI-Bibliothek, die sowohl eine verwaltete Excel-Bibliothek für .NET als auch Unterstützung für die neuesten Excel-Dateiformate bietet. NPOI bietet möglicherweise eine höhere Geschwindigkeit im Vergleich zur Verwendung des ODBC-Treibers.

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

public static DataTable ReadExcelSheet(string filePath, string sheetName)
{
    var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    var workbook = new HSSFWorkbook(stream);
    var sheet = workbook.GetSheet(sheetName);
    var table = new DataTable();

    var firstRow = sheet.GetRow(0);
    for (int i = 0; i < firstRow.Cells.Count; i++)
    {
        table.Columns.Add(firstRow.Cells[i].ToString());
    }

    for (int i = 1; i <= sheet.LastRowNum; i++)
    {
        var row = sheet.GetRow(i);
        var dataRow = table.NewRow();
        for (int j = 0; j < row.Cells.Count; j++)
        {
            dataRow[j] = row.Cells[j].ToString();
        }
        table.Rows.Add(dataRow);
    }

    return table;
}
Nach dem Login kopieren

Objektentsorgung

Was Ihre Frage zur Objektentsorgung betrifft, müssen Sie Dispose() nicht explizit aufrufen oder Variablen festlegen auf Nothing in Ihrem VB-Code, da die Objekte automatisch entsorgt werden, wenn der using-Block verlassen wird. Im Allgemeinen empfiehlt es sich jedoch, Objekte explizit zu entsorgen, um eine ordnungsgemäße Ressourcenverwaltung sicherzustellen.

CSV-Konvertierung für schnelleres Lesen

Wenn Geschwindigkeit ein entscheidender Faktor ist, sollten Sie die Konvertierung der Excel-Datei in eine CSV-Datei in Betracht ziehen (.csv), bevor Sie es in die DataTable importieren. CSV-Dateien sind reine Textdateien mit einfacher Struktur, die die Lesegeschwindigkeit deutlich verbessern können. Sie können die TextFieldParser-Klasse verwenden, um CSV-Dateien effizient zu lesen:

public static DataTable GetDataTableFromCSVFile(string csv_file_path)
{
    var csvData = new DataTable();
    using (var csvReader = new TextFieldParser(csv_file_path))
    {
        csvReader.SetDelimiters(new string[] { "," });
        csvReader.HasFieldsEnclosedInQuotes = true;

        var colFields = csvReader.ReadFields();
        foreach (var column in colFields)
        {
            var dataColumn = new DataColumn(column);
            dataColumn.AllowDBNull = true;
            csvData.Columns.Add(dataColumn);
        }

        while (!csvReader.EndOfData)
        {
            var fieldData = csvReader.ReadFields();
            //Making empty value as null
            for (int i = 0; i < fieldData.Length; i++)
            {
                if (fieldData[i] == string.Empty)
                {
                    fieldData[i] = null;
                }
            }
            csvData.Rows.Add(fieldData);
        }
    }
    return csvData;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich Excel-Tabellen effizient in eine Datentabelle in C# oder VB.NET einlesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage