.Net offre la possibilité de piloter Excel via l'espace de nom Office.Interop.Excel, mais malgré cette implémentation son utilisation reste assez lourde.
Je vous propose ici une classe encapsulant toute les contraintes d'utilisations courante comme les casts, les lignes de code à rallonge, etc...
Cette classe est loin d'être un produit fini, mais peut être facilement agrémentée de fonctionnalités par vos soins.
En espérant vous avoir apporté quelque chose ?
Source / Exemple :
' ---------------------------------------------------------------------
' Class ElgExcel - Permet de piloter Excel simplement
' Version 1.0
'
' Ecrit par LEVEUGLE Damien [ Elguevel ]
' http://elguevel.free.fr/
' Elguevel Software (c) 2010
' ---------------------------------------------------------------------
Imports System.IO
Imports Microsoft.Office
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Excel
Public Class ElgExcel
Implements IDisposable
#Region "Attributs"
Private _Application As Excel.Application
Private _WorkBooks As Workbooks
Private _WorkBook As Workbook
Private _PagesDuClasseur As Sheets ' Collection de toutes les pages du classeur
Private _PageEnCours As Worksheet ' Page actuellement selectionné
#End Region
#Region "Méthodes"
''' <summary>
''' Lance une nouvelle instance d'Excel
''' </summary>
''' <param name="Visible">Rend Excel visible ou pas à son demarrage</param>
''' <param name="Nom">Nom que va porter le classeur Excel</param>
''' <remarks></remarks>
Public Sub OuvreExcel(Optional ByVal Visible As Boolean = True, Optional ByVal Nom As String = "")
_Application = New Excel.Application
_Application.DisplayAlerts = False
_Application.Visible = Visible
If (_Application Is Nothing) Then
Throw New Exception("Excel ne peut pas démarrer !")
End If
If (Nom.Trim.Length > 0) Then
_Application.Caption = Nom
End If
_WorkBooks = _Application.Workbooks
_WorkBook = _WorkBooks.Add(XlWBATemplate.xlWBATWorksheet)
_PagesDuClasseur = _WorkBook.Sheets
If (_PagesDuClasseur Is Nothing) Then
Throw New Exception("Impossible de créer le classeur Excel")
End If
' Par defaut on recupere la première feuille comme page principale
Me._PageEnCours = Me._PagesDuClasseur.Item(1)
End Sub
''' <summary>
''' Créer une page dans le classeur et la selectionne
''' </summary>
''' <remarks></remarks>
Public Sub AjouterPage(Optional ByVal Nom As String = "")
Me._PageEnCours = _PagesDuClasseur.Add(After:=_PagesDuClasseur(_PagesDuClasseur.Count))
Me.RenommerPage(Nom)
End Sub
''' <summary>
''' Supprime une page via son nom
''' </summary>
''' <remarks></remarks>
Public Sub SupprimerPage(ByVal NomPage As String)
_PagesDuClasseur(NomPage).Delete()
End Sub
''' <summary>
''' Renomme la page en cours
''' </summary>
''' <param name="NouveauNom">Nom à donner à la page en cours</param>
''' <remarks></remarks>
Public Sub RenommerPage(ByVal NouveauNom As String)
If (NouveauNom.Trim.Length > 0) Then
_PageEnCours.Name = NouveauNom
End If
End Sub
''' <summary>
''' Renvoi nombre de page dans le classeur
''' </summary>
''' <remarks></remarks>
Public Function NombrePage() As Integer
Return _PagesDuClasseur.Count
End Function
''' <summary>
''' Active ou desactive le calcul automatique dans Excel
''' </summary>
''' <param name="Actif">Etat du calcul auto.</param>
''' <remarks>Cette methode peut etre utilisée pour desactiver le calcul auto,
''' et gagner en performance en evitant des calculs en temps réel</remarks>
Public Sub SetCalculAutomatique(ByVal Actif As Boolean)
If (Actif) Then
_Application.Calculation = XlCalculation.xlCalculationAutomatic
Else
_Application.Calculation = XlCalculation.xlCalculationManual
End If
End Sub
''' <summary>
''' Redimmenssionne une plage de colonnes
''' </summary>
''' <param name="Colonne1">Colonne de départ</param>
''' <param name="Colonne2">Colonne d'arrivée</param>
''' <param name="Largeur">Largeur des colonnes (Si 0, alors elles sont redimenssionées automatiquement)</param>
''' <remarks></remarks>
Public Sub SetLargeurColonne(ByVal Colonne1 As Integer, ByVal Colonne2 As Integer, Optional ByVal Largeur As Integer = 0)
' On verifie que les données soit cohérentes
If (Colonne1 > 0 AndAlso Colonne2 >= Colonne1) Then
' Auto ou manuelle ?
If (Largeur > 0) Then
_PageEnCours.Range(_PageEnCours.Columns(Colonne1), _PageEnCours.Columns(Colonne2)).ColumnWidth = Largeur
Else
_PageEnCours.Range(_PageEnCours.Columns(Colonne1), _PageEnCours.Columns(Colonne2)).AutoFit()
End If
End If
End Sub
''' <summary>
''' Rend Excel visible ou invisible à l'utilisateur
''' </summary>
''' <param name="Visible">Classeur visible ou pas</param>
''' <remarks>Cette méthode ne ferme pas Excel</remarks>
Public Sub SetVisible(ByVal Visible As Boolean)
_Application.Visible = Visible
End Sub
''' <summary>
''' Selectionne une page
''' </summary>
''' <param name="IndexPage">Index de la feuille Excel à selectionner (base 1)</param>
''' <remarks></remarks>
Public Sub SelectPage(ByVal IndexPage As Integer)
Me._PageEnCours = CType(Me._PagesDuClasseur.Item(IndexPage), Worksheet)
End Sub
''' <summary>
''' Selectionne une page
''' </summary>
''' <param name="NomPage">Nom de la feuille Excel à selectionner</param>
''' <remarks></remarks>
Public Sub SelectPage(ByVal NomPage As String)
For Each P As Worksheet In _PagesDuClasseur
If (P.Name.Equals(NomPage)) Then
Me._PageEnCours = P
Exit For
End If
Next
End Sub
''' <summary>
''' Enregistre le fichier
''' </summary>
''' <param name="Fichier">Fichier Excel à créer</param>
''' <remarks></remarks>
Public Sub Enregistrer(ByVal Fichier As String)
_WorkBook.Saved = True
If (Fichier.Trim.Length = 0) Then
Fichier = Path.ChangeExtension(Path.GetTempFileName, "xls")
End If
_WorkBook.SaveCopyAs(Fichier)
End Sub
''' <summary>
''' Ecrit une valeur dans une cellule
''' </summary>
''' <param name="Ligne">Ligne de la cellule</param>
''' <param name="Colonne">Colonne de la cellule</param>
''' <param name="Valeur">Texte à ecrire</param>
''' <remarks></remarks>
Public Sub Ecrire(ByVal Ligne As Integer, ByVal Colonne As Integer, ByVal Valeur As String)
Dim Cellule As Range = _PageEnCours.Cells(Ligne, Colonne)
Cellule.Value = Valeur
End Sub
''' <summary>
''' Ecrit une valeur dans une cellule avec un format specifique
''' </summary>
''' <param name="Ligne">Ligne de la cellule</param>
''' <param name="Colonne">Colonne de la cellule</param>
''' <param name="Valeur">Texte à ecrire</param>
''' <param name="Style">Objet <c>ElgFormatExcel</c> à appliquer sur la cellule pour lui donner un format</param>
''' <remarks></remarks>
Public Sub Ecrire(ByVal Ligne As Integer, ByVal Colonne As Integer, ByVal Valeur As String, ByVal Style As ElgFormatExcel)
Dim Cellule As Range = _PageEnCours.Cells(Ligne, Colonne)
Cellule.Value = Valeur
Cellule.Font.Bold = Style.Gras
Cellule.Font.Italic = Style.Italique
Cellule.Font.Color = Style.CouleurTexte
Cellule.Interior.Color = Style.CouleurFond
Cellule.HorizontalAlignment = Style.Alignement
Cellule.Font.Size = Style.Taille
End Sub
''' <summary>
''' Lit une valeur dans une cellule Excel
''' </summary>
''' <param name="Ligne">Ligne de la cellule à lire</param>
''' <param name="Colonne">Colonne de la cellule à lire</param>
''' <remarks></remarks>
Public Function Lire(ByVal Ligne As Integer, ByVal Colonne As Integer) As String
Dim Cellule As Range = _PageEnCours.Cells(Ligne, Colonne)
Return Cellule.Value
End Function
''' <summary>
''' Applique un style à une ligne complete
''' </summary>
''' <param name="Ligne">Index de la ligne (base 1)</param>
''' <param name="Style">Objet <c>ElgFormatExcel</c> qui contient le format à appliquer</param>
''' <remarks></remarks>
Public Sub SetFormatLigne(ByVal Ligne As Integer, ByVal Style As ElgFormatExcel)
Dim LigneRange As Range = _PageEnCours.Rows(Ligne)
LigneRange.Font.Bold = Style.Gras
LigneRange.Font.Italic = Style.Italique
LigneRange.Font.Color = Style.CouleurTexte
LigneRange.Interior.Color = Style.CouleurFond
LigneRange.HorizontalAlignment = Style.Alignement
LigneRange.Font.Size = Style.Taille
End Sub
''' <summary>
''' Applique un style à une colonne complete
''' </summary>
''' <param name="Colonne">Index de la colonne (base 1)</param>
''' <param name="Style">Objet <c>ElgFormatExcel</c> qui contient le format à appliquer</param>
''' <remarks></remarks>
Public Sub SetFormatColonne(ByVal Colonne As Integer, ByVal Style As ElgFormatExcel)
Dim ColonneRange As Range = _PageEnCours.Columns(Colonne)
ColonneRange.Font.Bold = Style.Gras
ColonneRange.Font.Italic = Style.Italique
ColonneRange.Font.Color = Style.CouleurTexte
ColonneRange.Interior.Color = Style.CouleurFond
ColonneRange.HorizontalAlignment = Style.Alignement
ColonneRange.Font.Size = Style.Taille
End Sub
''' <summary>
''' Applique un style à un groupe de cellules contigues
''' </summary>
''' <param name="Ligne1">Index de la première ligne (base 1)</param>
''' <param name="Colonne1">Index de la première colonne (base 1)</param>
''' <param name="Ligne2">Index de la seconde ligne (base 1)</param>
''' <param name="Colonne2">Index de la seconde colonne (base 1)</param>
''' <param name="Style">Objet <c>ElgFormatExcel</c> qui contient le format à appliquer</param>
''' <remarks></remarks>
Public Sub SetFormatRange(ByVal Ligne1 As Integer, ByVal Colonne1 As Integer, ByVal Ligne2 As Integer, ByVal Colonne2 As Integer, ByVal Style As ElgFormatExcel)
If (Ligne2 >= Ligne1 AndAlso Colonne2 >= Colonne1) Then
If (Ligne1 > 0 AndAlso Colonne1 > 0) Then
Dim Cellules As Range = _PageEnCours.Range(_PageEnCours.Cells(Ligne1, Colonne1), _PageEnCours.Cells(Ligne2, Colonne2))
Cellules.Font.Bold = Style.Gras
Cellules.Font.Italic = Style.Italique
Cellules.Font.Color = Style.CouleurTexte
Cellules.Interior.Color = Style.CouleurFond
Cellules.HorizontalAlignment = Style.Alignement
Cellules.Font.Size = Style.Taille
End If
End If
End Sub
''' <summary>
''' Fusionne un groupe de cellules
''' </summary>
''' <param name="Ligne1">Index de la première ligne (base 1)</param>
''' <param name="Colonne1">Index de la première colonne (base 1)</param>
''' <param name="Ligne2">Index de la seconde ligne (base 1)</param>
''' <param name="Colonne2">Index de la seconde colonne (base 1)</param>
''' <remarks></remarks>
Public Sub Fusionner(ByVal Ligne1 As Integer, ByVal Colonne1 As Integer, ByVal Ligne2 As Integer, ByVal Colonne2 As Integer)
If (Ligne2 >= Ligne1 AndAlso Colonne2 >= Colonne1) Then
If (Ligne1 > 0 AndAlso Colonne1 > 0) Then
Dim Cellules As Range = _PageEnCours.Range(_PageEnCours.Cells(Ligne1, Colonne1), _PageEnCours.Cells(Ligne2, Colonne2))
Cellules.Merge()
End If
End If
End Sub
''' <summary>
''' Reglage de l'impression
''' </summary>
''' <param name="Orient">Orientation : Paysage / Portrait</param>
''' <remarks>Méthode à completer</remarks>
Public Sub SetPrinting(ByVal Orient As XlPageOrientation)
_PageEnCours.PageSetup.Orientation = Orient
_PageEnCours.PageSetup.CenterHorizontally = True
End Sub
#End Region
#Region "Constructeur"
''' <summary>
''' Constructeur par defaut
''' </summary>
''' <remarks></remarks>
Public Sub New()
End Sub
#End Region
#Region "Destructeur"
Private disposedValue As Boolean = False
''' <summary>
''' Dispose
''' </summary>
''' <remarks></remarks>
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
If (Not _Application Is Nothing) Then
_Application.DisplayAlerts = True
End If
_WorkBook.Close()
_WorkBooks.Close()
_Application.Quit()
End If
_Application = Nothing
_WorkBooks = Nothing
_WorkBook = Nothing
_PagesDuClasseur = Nothing
_PageEnCours = Nothing
End If
Me.disposedValue = True
End Sub
''' <summary>
''' Dispose
''' </summary>
''' <remarks>Méthode à appeler en fin d'edition pour fermer le classeur Excel</remarks>
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
''' <summary>
''' Finalize
''' </summary>
''' <remarks></remarks>
Protected Overrides Sub Finalize()
Me.Dispose(False)
End Sub
#End Region
End Class
' ---------------------------------------------------------------------
' Class ElgFormatExcel - Formatage des cellules pour la classe ElgExcel
' Version 1.0
'
' Ecrit par LEVEUGLE Damien [ Elguevel ]
' http://elguevel.free.fr/
' Elguevel Software (c) 2010
' ---------------------------------------------------------------------
Public Class ElgFormatExcel
#Region "Attributs"
Private _CouleurFond As Excel.XlRgbColor
Private _CouleurTexte As Excel.XlRgbColor
Private _Gras As Boolean
Private _Italique As Boolean
Private _Alignement As Excel.XlHAlign
Private _Taille As Integer
#End Region
#Region "Proprietes"
''' <summary>
''' Couleur de fond
''' </summary>
''' <remarks></remarks>
Public Property CouleurFond() As Excel.XlRgbColor
Get
Return _CouleurFond
End Get
Set(ByVal value As Excel.XlRgbColor)
_CouleurFond = value
End Set
End Property
''' <summary>
''' Couleur du texte
''' </summary>
''' <remarks></remarks>
Public Property CouleurTexte() As Excel.XlRgbColor
Get
Return _CouleurTexte
End Get
Set(ByVal value As Excel.XlRgbColor)
_CouleurTexte = value
End Set
End Property
''' <summary>
''' Caractères gras
''' </summary>
''' <remarks></remarks>
Public Property Gras() As Boolean
Get
Return _Gras
End Get
Set(ByVal value As Boolean)
_Gras = value
End Set
End Property
''' <summary>
''' Caractere en italique
''' </summary>
''' <remarks></remarks>
Public Property Italique() As Boolean
Get
Return _Italique
End Get
Set(ByVal value As Boolean)
_Italique = value
End Set
End Property
''' <summary>
''' Alignement horizontal
''' </summary>
''' <remarks></remarks>
Public Property Alignement() As Excel.XlHAlign
Get
Return _Alignement
End Get
Set(ByVal value As Excel.XlHAlign)
_Alignement = value
End Set
End Property
''' <summary>
''' Taille de la police
''' </summary>
''' <remarks></remarks>
Public Property Taille() As Integer
Get
Return _Taille
End Get
Set(ByVal value As Integer)
_Taille = value
End Set
End Property
#End Region
#Region "Méthodes"
''' <summary>
''' Met tous les attributs à leur valeurs par defaut
''' </summary>
''' <remarks></remarks>
Public Sub ResetAttributes()
_Gras = False
_Italique = False
_CouleurTexte = XlRgbColor.rgbBlack
_CouleurFond = XlRgbColor.rgbWhite
_Alignement = XlHAlign.xlHAlignLeft
_Taille = 10
End Sub
#End Region
#Region "Constructeur"
''' <summary>
''' Constructeur par defaut
''' </summary>
''' <remarks></remarks>
Public Sub New()
' On defini une valeur par defaut pour les attributs
ResetAttributes()
End Sub
#End Region
End Class
Conclusion :
N'oublie pas dans vos projets d'ajouter une référence sur l'assembly Microsoft.Office.Interop.Excel (v 12.0.0.0 pour ma part)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.