Maison > développement back-end > C++ > Comment puis-je lire efficacement des feuilles Excel dans un DataTable en C# ou VB.NET ?

Comment puis-je lire efficacement des feuilles Excel dans un DataTable en C# ou VB.NET ?

Patricia Arquette
Libérer: 2024-12-31 21:50:17
original
727 Les gens l'ont consulté

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

Lecture de feuilles Excel dans un DataTable : optimisation des performances et de l'efficacité

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.

Implémentation C#

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();
Copier après la connexion

Alternatives pour l'efficacité

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;
}
Copier après la connexion

Élimination des objets

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.

Conversion CSV pour une lecture plus rapide

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;
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal