85 votes

La meilleure façon de lire un fichier Excel (.xls/.xlsx)

Je sais qu'il existe différentes façons de lire un fichier Excel :

  • Iterop
  • Oledb
  • Open Xml SDK

La compatibilité n'est pas un problème car le programme sera exécuté dans un environnement contrôlé.

Mon besoin :
Lire un fichier dans un DataTable / CUstom Entitie s (je ne sais pas comment créer des propriétés/champs dynamiques pour un objet [les noms des colonnes varieront dans un fichier Excel])

Utilice DataTable/Custom Entities pour effectuer certaines opérations à partir de ses données.

Mise à jour DataTable avec les résultats des opérations

Le renvoyer à excel file .

Ce qui serait plus simple.

Si possible, donnez-moi également des conseils sur les entités personnalisées (ajout de propriétés/champs à un objet de manière dynamique).

79voto

Enigmativity Points 26345

Jetez un coup d'œil à Linq-to-Excel . C'est très intéressant.

var book = new LinqToExcel.ExcelQueryFactory(@"File.xlsx");

var query =
    from row in book.Worksheet("Stock Entry")
    let item = new
    {
        Code = row["Code"].Cast<string>(),
        Supplier = row["Supplier"].Cast<string>(),
        Ref = row["Ref"].Cast<string>(),
    }
    where item.Supplier == "Walmart"
    select item;

Il permet également l'accès à des lignes fortement typées.

33voto

Dan Points 1740

Je sais que cette question a été posée il y a près de 7 ans, mais elle figure toujours parmi les premiers résultats de recherche sur Google pour certains mots-clés concernant l'importation de données Excel avec C#, c'est pourquoi j'ai voulu proposer une alternative basée sur des développements technologiques récents.

L'importation de données Excel est devenue une tâche tellement courante dans mon travail quotidien que j'ai rationalisé le processus et documenté la méthode sur mon blog : la meilleure façon de lire un fichier excel en c# .

Utilizo NPOI parce qu'il peut lire/écrire des fichiers Excel sans que Microsoft Office soit installé et qu'il n'utilise pas COM+ ou d'autres interfaces. Cela signifie qu'il peut fonctionner dans le nuage !

Mais la vraie magie vient de l'association avec NPOI Mapper de Donny Tian parce qu'il me permet de faire correspondre les colonnes Excel à des propriétés dans mes classes C# sans écrire de code. C'est magnifique.

Voici l'idée de base :

Je crée une classe .net qui fait correspondre/mapper les colonnes Excel qui m'intéressent :

        class CustomExcelFormat
        {
            [Column("District")]
            public int District { get; set; }

            [Column("DM")]
            public string FullName { get; set; }

            [Column("Email Address")]
            public string EmailAddress { get; set; }

            [Column("Username")]
            public string Username { get; set; }

            public string FirstName
            {
                get
                {
                    return Username.Split('.')[0];
                }
            }

            public string LastName
            {
                get
                {
                    return Username.Split('.')[1];
                }
            }
        }

Remarquez qu'il me permet d'établir une correspondance basée sur le nom de la colonne si je le souhaite !

Ensuite, lorsque je traite le fichier Excel, tout ce que j'ai à faire est quelque chose comme ceci :

        public void Execute(string localPath, int sheetIndex)
        {
            IWorkbook workbook;
            using (FileStream file = new FileStream(localPath, FileMode.Open, FileAccess.Read))
            {
                workbook = WorkbookFactory.Create(file);
            }

            var importer = new Mapper(workbook);
            var items = importer.Take<CustomExcelFormat>(sheetIndex);
            foreach(var item in items)
            {
                var row = item.Value;
                if (string.IsNullOrEmpty(row.EmailAddress))
                    continue;

                UpdateUser(row);
            }

            DataContext.SaveChanges();
        }

Il est vrai que mon code ne modifie pas le fichier Excel lui-même. Je sauvegarde plutôt les données dans une base de données en utilisant Entity Framework (c'est pourquoi vous voyez "UpdateUser" et "SaveChanges" dans mon exemple). Mais il y a déjà une bonne discussion sur SO sur la façon de enregistrer/modifier un fichier à l'aide du NPOI .

30voto

FSX Points 6786

En utilisant OLE Query, c'est assez simple (par exemple, sheetName est Sheet1) :

DataTable LoadWorksheetInDataTable(string fileName, string sheetName)
{           
    DataTable sheetData = new DataTable();
    using (OleDbConnection conn = this.returnConnection(fileName))
    {
       conn.Open();
       // retrieve the data using data adapter
       OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "$]", conn);
       sheetAdapter.Fill(sheetData);
       conn.Close();
    }                        
    return sheetData;
}

private OleDbConnection returnConnection(string fileName)
{
    return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\"");
}

Pour les versions plus récentes d'Excel :

return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=Excel 12.0;");

Vous pouvez également utiliser Lecteur de données Excel un projet open source sur CodePlex. Il fonctionne très bien pour exporter des données à partir de feuilles Excel.

L'exemple de code donné sur le lien spécifié :

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//...
//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

//5. Data Reader methods
while (excelReader.Read())
{
//excelReader.GetInt32(0);
}

//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();

Référence : Comment importer d'Excel vers un DataSet en utilisant Microsoft.Office.Interop.Excel ?

6voto

Hark.Tenl Points 69

Essayez d'utiliser ce moyen gratuit, https://freenetexcel.codeplex.com

 Workbook workbook = new Workbook();

 workbook.LoadFromFile(@"..\..\parts.xls",ExcelVersion.Version97to2003);
 //Initialize worksheet
 Worksheet sheet = workbook.Worksheets[0];

 DataTable dataTable = sheet.ExportDataTable();

5voto

davewasthere Points 2210

Si vous pouvez vous limiter aux fichiers *.xlsx (format Open Office XML), la bibliothèque la plus populaire est probablement la suivante EPPLus .

En prime, il n'y a pas d'autres dépendances. Il suffit de l'installer en utilisant nuget :

Install-Package EPPlus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X