Lire et écrire un fichier Excel à l’aide de NetOffice.Excel

Logo_Microsoft_Excel_2013

05403751-photo-net-framework

Nous allons voir dans cet article comment utiliser le composant NetOffice.Excel (https://www.nuget.org/packages/NetOffice.Excel/) afin de piloter la lecture et l’écriture de fichier Excel via une application .NET.

Prérequis :

La première étape est d’ajouter le package NetOffice.Excel au sein de votre solution :

nuget

Nous ajouterons en entête de notre classe de lecture ou d’écriture l’inclusion suivante :

using NetOffice.ExcelApi;

Lecture d’un fichier Excel :

Une fois l’ajout du package effectué, nous allons pouvoir déclarer un objet Excel Application afin de travailler avec l’application Excel. Nous déclarerons aussi l’affichage des alertes à false pour éviter l’apparition d’invite de commande de fenêtre surgissant durant l’utilisation de notre application :

// Objet de gestion d'Excel.
Using(Application excelApplication = new Application())
{
   // Non affichage des messages et des fenêtres d'alertes.
   excelApplication.DisplayAlerts = false;

Ensuite nous chargeons le fichier, à l’aide de l’instruction Open de la classe static Workbooks de notre objet application Excel :

// Chemin du fichier.
string fichierCible = "d:\\test.xls";

// Chargement du fichier
ExcelApi.Workbook book = excelApplication.Workbooks.Open(fichierCible);

Nous avons désormais accès à l’ensemble des données de notre fichier Excel. Il ne nous reste plus qu’à parcourir les différents onglets en effectuant un foreach sur les éléments Worksheets et en parcourant les lignes et les colonnes de l’onglet traité à l’aide de la propriété UsedRange nous retournant les dimensions du document.

foreach (NetOffice.ExcelApi.Worksheet sheet in book.Worksheets)
{
	// Récupération des dimensions de la grille.
	Range xlActiveRange = sheet.UsedRange;
	object[,] objRangeSheet = xlActiveRange.Value as object[,];

	// Parcours des colonnes et des lignes.
	for (int numeroColonne = 1; numeroColonne <= objRangeSheet.GetLength(1); numeroColonne++)
	{
		for (int numeroLigne = 1; numeroLigne <= objRangeSheet.GetLength(0); numeroLigne++)
		{
			if (sheet.Cells[numeroLigne, numeroColonne].Value != null)
			{
				Console.WriteLine(sheet.Cells[numeroLigne, numeroColonne].Value.ToString());
			}
		}
	}
}

 

Traitement des erreurs Excel :

Lorsque nous accédons aux données du document Excel, il peut être intéressant de rajouter un traitement pour prendre en compte les différentes erreurs que l’on pourrait être amené à rencontrer. Voici donc la liste des erreurs que l’on peut rencontrer lors de l’utilisation d’un fichier Excel :

Excel.xlCVErr  Range.Value  Coerced to .NET
-------------  -----------  ---------------
2000         #NULL!       -2146826288
2007         #DIV/0!      -2146826281
2015         #VALUE!      -2146826273
2023         #REF!        -2146826265
2029         #NAME?       -2146826259
2036         #NUM!        -2146826252
2042         #N/A         -2146826246

Nous allons rajouter un traitement à notre programme de lecture afin de prendre en compte ces erreurs et d’éviter la levée d’exception. Au préalable nous déclarons un  dictionnaire contenant l’ensemble de ces erreurs.

Dictionary<string, string> listErrorExcel = new Dictionary<string, string>();
listErrorExcel.Add("-2146826288", "#NULL!");
listErrorExcel.Add("-2146826281", "#DIV/0!");
listErrorExcel.Add("-2146826273", "#VALUE!");
listErrorExcel.Add("-2146826265", "#REF!");
listErrorExcel.Add("-2146826259", "#NAME?");
listErrorExcel.Add("-2146826252", "#NUM!");
listErrorExcel.Add("-2146826246", "#N/A");

Et nous rajoutons à notre précédent code un contrôle sur la donnée :

if (listErrorExcel.ContainsKey(sheet.Cells[numeroLigne, numeroColonne].Value.ToString()))
{
	// Echec de lecture des données.
	Console.WriteLine("Une erreur est survenue lors du traitement de la ligne " + (numeroLigne) + " et de la colonne : " + (numeroColonne));
}
else
{
	Console.WriteLine(sheet.Cells[numeroLigne, numeroColonne].Value.ToString());
}

 

Fin du traitement :

Il faudra penser à quitter l’application Excel à la fin de tous les traitements :

excelApplication.Quit();

Ecriture d’un fichier Excel :

Maintenant nous allons voir comment écrire un fichier Excel directement à partir de .NET. Nous l’utiliserons pour réaliser une grille contenant les 10 principales langues parlées dans le monde et nous générerons un diagramme à partir de ces données.

Tout d'abord nous instancions la classe de gestion des fichiers Excel :
using (var excelApplication = new NetOffice.ExcelApi.Application())
{
...
}
Puis nous créons le fichier de travail à l'aide de la fonction Add et nous nous positionnons sur le premier onglet du document (la liste des onglets est contenue dans la propriété Worksheets, attention les onglets commencent à la position 1):
// Création du fichier de travail.
var workBook = excelApplication.Workbooks.Add();
// Positionnement sur le premier onglet.
var workSheet = (NetOffice.ExcelApi.Worksheet)workBook.Worksheets[1];
Puis nous ajoutons des données dans la grille en passant par la propriété Cells de l'onglet sélectionné. Cette propriété attend un numéro de ligne et un numéro de colonne afin de positionner sa valeur à l'aide de la propriété Value.
// Ajout des données dans les différentes cellules.
workSheet.Cells[1, 2].Value = "Langues (en millions de locuteurs) :";
workSheet.Cells[2, 1].Value = "Mandarin";
workSheet.Cells[2, 2].Value = "860";
workSheet.Cells[3, 1].Value = "Espagnol";
workSheet.Cells[3, 2].Value = "469";
workSheet.Cells[4, 1].Value = "Anglais";
workSheet.Cells[4, 2].Value = "362";
workSheet.Cells[5, 1].Value = "Arabe";
workSheet.Cells[5, 2].Value = "276";
workSheet.Cells[6, 1].Value = "Bengali";
workSheet.Cells[6, 2].Value = "270";
workSheet.Cells[7, 1].Value = "Hindi";
workSheet.Cells[7, 2].Value = "269";
workSheet.Cells[8, 1].Value = "Portugais";
workSheet.Cells[8, 2].Value = "222";
workSheet.Cells[9, 1].Value = "Russe";
workSheet.Cells[9, 2].Value = "150";
workSheet.Cells[10, 1].Value = "Japonais";
workSheet.Cells[10, 2].Value = "125";
workSheet.Cells[11, 1].Value = "Lahnda/Pendjabi";
workSheet.Cells[11, 2].Value = "112";
Une fois les données positionnées, il ne vous reste plus qu'à générer le diagramme en camembert via la fonction Add de la propriété ChartObjects de votre onglet, en lui spécifiant une position d'insertion, puis en lui appliquant un type (ici camembert) via sa propriété ChartType, et enfin en associant au diagramme les données de la grille.
// Ajout d'un diagramme et positionnement.
var chart = ((NetOffice.ExcelApi.ChartObjects)workSheet.ChartObjects()).Add(150, 200, 500, 400);
// Définition du type de diagramme.
chart.Chart.ChartType = NetOffice.ExcelApi.Enums.XlChartType.xlPie;
// Association du diagramme aux données de la grille.
chart.Chart.SetSourceData(workSheet.Range("A1:B11"));
Il ne vous reste plus qu'à enregistrer votre fichier à l'aide de la fonction SaveAs et à tester le résultat dans VisualStudio.
// Enregistrement du fichier.
workBook.SaveAs(@"d:\test.xlsx");

Exemples complets :

Vous pouvez retrouver les deux exemples complets sur Dotnet Fiddle aux adresses ci-dessous (attention le code n'est fonctionnel qu'au sein de Visual Studio) :

 

3 commentaires

  1. Ton « sheet » lors du traitement des lignes et colonne du document, il sort d’ou. Utilisant Vs express 2015 pour le web le seul type semblable que j’ai c’est « Sheets ».

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.