您偶然發現了一個常見的挑戰- 快速且有效率地將Excel 資料匯入到數據表中。您目前使用 Microsoft Excel 驅動程式的 VB 解決方案是一種可行的方法,但讓我們探索一些可能提供增強功能的替代方法。
如果您更喜歡C#,這裡有一個改編自Ciarán 的程式碼片段沃爾什的答案:
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();
考慮使用NPOI 函式庫,它提供了適用於.NET 的託管Excel 程式庫並支援最新的Excel 檔案格式。與使用 ODBC 驅動程式相比,NPOI 可以提供更高的速度。
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; }
關於您有關物件處置的問題,您不需要明確呼叫Dispose() 或設定變數在VB 程式碼中將其設為Nothing,因為退出using區塊時將自動釋放物件。但是,明確處置物件以確保正確的資源管理通常是一種很好的做法。
如果速度是關鍵因素,請考慮將 Excel 檔案轉換為 CSV 檔案(.csv),然後將其匯入資料表。 CSV檔案是純文字文件,結構簡單,可以顯著提高讀取速度。您可以使用 TextFieldParser 類別來高效讀取 CSV 檔案:
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; }
以上是如何在 C# 或 VB.NET 中有效地將 Excel 工作表讀取到 DataTable 中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!