Vous êtes tombé sur un défi courant : importer des données Excel dans un DataTable avec rapidité et efficacité. Votre solution VB actuelle utilisant le pilote Microsoft Excel est une approche viable, mais explorons quelques méthodes alternatives qui peuvent offrir des améliorations.
Si vous préférez C#, voici un extrait adapté de Ciarán Réponse de Walsh :
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();
Envisagez d'utiliser la bibliothèque NPOI, qui offre à la fois une bibliothèque Excel gérée pour .NET et la prise en charge des derniers formats de fichiers Excel. NPOI peut offrir une vitesse améliorée par rapport à l'utilisation du pilote ODBC.
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; }
En ce qui concerne votre question sur l'élimination des objets, vous n'avez pas besoin d'appeler explicitement Dispose() ou de définir des variables à Nothing dans votre code VB car les objets seront automatiquement supprimés à la sortie du bloc using. Cependant, il est généralement recommandé de supprimer explicitement les objets pour garantir une bonne gestion des ressources.
Si la vitesse est un facteur critique, envisagez de convertir le fichier Excel en fichier CSV. (.csv) avant de l'importer dans le DataTable. Les fichiers CSV sont des fichiers texte brut avec une structure simple, qui peuvent améliorer considérablement la vitesse de lecture. Vous pouvez utiliser la classe TextFieldParser pour lire efficacement les fichiers 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; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!