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 .