Classe pour piloter excel simplement

Soyez le premier à donner votre avis sur cette source.

Vue 11 384 fois - Téléchargée 826 fois

Description

.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)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_bidouille007
Messages postés
263
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
22 décembre 2012
1 -
cela semble sympathique, mais cette classe fonctionne t'elle sur un pc sans excel ?

y a t'il la nécessité pour un logiciel qui intégrerait cette classe d'avoir un dll à l'extérieur du programme pour fonctionner ?

sinon le boulot semble bien fait et suffisamment commenté
elguevel
Messages postés
735
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3 -
Non, comme dit dans le titre cette source pilote Excel, elle ne permet pas de generer des fichiers sans cette application.

Sinon pour integrer automatiquement les assembly Office, il suffit de créer un projet de deploiement, celui-ci integrera automatiquement les dependances necessaires si la machine sur laquelle tu installes ton application ne les possèdes pas déja.

Merci pour ton commentaire :-)
geodidier
Messages postés
2
Date d'inscription
mardi 21 octobre 2003
Statut
Membre
Dernière intervention
10 décembre 2010
-
De geodidier pour Elguevel.
Merci énormément pour cette classe Excel que je trouve géniale et je vous en félicite.
Je suis retraité, 68 ans et radio amateur (F6GYD)et bien entendu j'ai des listes de carte (QSL) que j'aimerai inclure dans un programme réalisé en VS 2010, mais voilà je ne sais pas importer
un fichier texte avec vôtre classe.
Celà fait 4 mois que j'essaie de programmer.

Merci beaucoup pour le dérangement.
Cordialement.
geodidier
Messages postés
2
Date d'inscription
mardi 21 octobre 2003
Statut
Membre
Dernière intervention
10 décembre 2010
-
Excusez-moi j'avais oublié la note : 9.75/10
geodidier
speyrard
Messages postés
20
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
3 mars 2012
-
Très bon, Franchement !

Depuis mon passage en VB Studio 2010, mon application plantait à cause d'Excel. Je n'arrivais pas à reproduire le pilotage d'Excel qui fonctionnait en 2008 (je ne passais pas par une classe mais j'obtenais la même chose)

2 petites remarques :
- la valeur Excel.xlRgColor n'est pas reconnu, je ne comprends pas pourquoi, tu as peut-être une idée ? (pour l'instant, j'ai enlevé la partie sur les couleurs : j'y reviendrais qd j'aurais un moment)
- quand tu quittes Excel, le process n'est pas terminé (il tourne en fantôme qd tu regarde le gestionnaire des tâches => tu ne peux ouvrir excel)

J'ai rajouté le bout de code suivant :

Sub ForceExcelToQuit()
Dim proc As System.Diagnostics.Process

For Each proc In System.Diagnostics.Process.GetProcessesByName("EXCEL")
If proc.MainWindowTitle.Trim() = "" Then
proc.Kill()
End If
Next
End Sub

Pour l'instant, je ne l'ai pas mis dans la classe

En tout ca merci

P.S. : et je n'ai pas trouvé que c'était du niveau débutant car ca fait un moment que j'en fait et là je callais (je regardais pas au bon endroit mais qd même)

+1 ;)

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.