Heim >Backend-Entwicklung >C++ >Wie kann ich Excel-Tabellen effizient in eine Datentabelle in C# oder VB.NET einlesen?
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.
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();
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; }
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.
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; }
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!