5/5 (7 avis)
Vue 14 209 fois - Téléchargée 1 041 fois
' --------------------------------------------------------------------- ' 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
22 sept. 2012 à 11:02
Mon séparateur est le ; donc c'est Semicolon:=True, _ et non Comma:=True
17 sept. 2012 à 22:46
J'essaie de rajouter l'ouverture d'un fichier de type csv
Mon code dans la class
''' <summary>
''' Lance une nouvelle instance d'Excel
''' </summary>
''' description des colonnes à importer
''' Nom du fichier Csv à ouvrir
''' Rend Excel visible ou pas à son demarrage
''' <remarks></remarks>
Public Sub OuvreCsvExcel(ByVal columnarray(,) As Integer, ByVal Nom As String, Optional ByVal Visible As Boolean = True)
_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
_WorkBooks = _Application.Workbooks
_Application.Caption = Nom
_WorkBook = _WorkBooks.Add(XlWBATemplate.xlWBATWorksheet)
_PagesDuClasseur = _WorkBook.Sheets
' Par defaut on recupere la première feuille comme page principale
Me._PageEnCours = Me._PagesDuClasseur.Item(1)
_WorkBooks.OpenText(Filename:=Nom, Origin:=437, StartRow:=1, DataType:=Excel.XlTextParsingType.xlDelimited, _
TextQualifier:=Excel.XlTextQualifier.xlTextQualifierNone, ConsecutiveDelimiter:=False, _
Tab:=True, Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo:=columnarray, TrailingMinusNumbers:=True)
If (_PagesDuClasseur Is Nothing) Then
Throw New Exception("Impossible de créer le classeur Excel")
End If
End Sub
Je ne comprends pas : mon code s'execute sans anomalie mais j'ai rien dans le fichier générer alors qu'il n'est pas vide.
Quelqu'un aurait une idée ?
29 août 2012 à 19:47
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 ;)
10 déc. 2010 à 10:16
geodidier
10 déc. 2010 à 10:14
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.
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.