您偶然发现了一个常见的挑战 - 快速高效地将 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中文网其他相关文章!