All posts tagged dotnet

Manipuler Excel en dotnet : utiliser l’automation

Attardons-nous aujourd’hui sur le langage haut de gamme Microsoft, dotnet. Que ce soit du VB.net ou du C#, qu’importe, les principes sont exactement les mêmes. Nous pouvons au sein d’un projet Visual Studio (toutes versions) manipuler Excel presque de la même manière que dans l’éditeur VBA d’Excel, c’est l’Automation (on manipule Excel à l’aide de son modèle objet)

Il faut au préalable importer les références Excel (au même titre que dans l’éditeur VBA Excel, nous importons parfois les références « dll » d’autres logiciels tels que Business Objects ou Word).

Pour cela, ajoutons la référence COM à Microsoft Excel. Ce n’est pas une référence .NET ! Nous verrons que cela a une incidence.

Validons par OK. En ajoutant la référence dans notre code :

Imports Excel = Microsoft.Office.Interop.Excel

Nous pourrons utiliser ainsi un code très proche du VBA, comme en témoignent les quelques lignes ci-dessous.

Dim MonExcel As New Excel.Application
MonExcel.Visible = True
Dim MonFichier As Excel.Workbook = MonExcel.Workbooks.Open(MonPath)
Dim MaFeuille As Excel.Worksheet = MonFichier.Sheets(1)
Dim MaPlage As Excel.Range = MaFeuille.Range(MaFeuille.Cells(2, 1), & _
 MaFeuille.Cells(2, 1).End(Excel.XlDirection.xlToRight).End(Excel.XlDirection.xlDown))
Dim MonEntete As Excel.Range = MaFeuille.Range(MaFeuille.Cells(1, 1), & _
 MaFeuille.Cells(1, 1).End(Excel.XlDirection.xlToRight))

A titre d’exemple, nous proposons ici un code simpliste qui ouvre Excel, accède à un fichier Excel choisi par l’utilisateur, et affiche le contenu du fichier (pour peu que ce contenu soit sous forme de table) dans un composant DATAGRIDVIEW d’une application Windows.

Le code VB.net proposé pour l’exemple (pas de classe, pas de gestion des erreurs) est :

Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'CHOIX DU FICHIER EXCEL
Dim MonOpenFileDialog As New Windows.Forms.OpenFileDialog()
MonOpenFileDialog.Filter = "Fichiers Excel (*.xls)
*.xls"
MonOpenFileDialog.ShowDialog()
Dim MonPath As String = MonOpenFileDialog.FileName
'DECLARATION OBJETS EXCEL
Dim MonExcel As New Excel.Application
MonExcel.Visible = True
Dim MonFichier As Excel.Workbook = MonExcel.Workbooks.Open(MonPath)
Dim MaFeuille As Excel.Worksheet = MonFichier.Sheets(1)
Dim MaPlage As Excel.Range = MaFeuille.Range(MaFeuille.Cells(2, 1), & _ 
 MaFeuille.Cells(2, 1).End(Excel.XlDirection.xlToRight).End(Excel.XlDirection.xlDown))
Dim MonEntete As Excel.Range = MaFeuille.Range(MaFeuille.Cells(1, 1), & _ 
 MaFeuille.Cells(1, 1).End(Excel.XlDirection.xlToRight))
 
'AJOUT DATAGRIDVIEW DANS LE FORM1
Dim MonDataGridView As New Windows.Forms.DataGridView
MonDataGridView.Location = New Point(0, 0)
MonDataGridView.Dock = DockStyle.Fill
Me.Controls.Add(MonDataGridView)
 
'METHODE : AUTOMATION CLASSIQUE
For Each MaCellule As Excel.Range In MonEntete
MonDataGridView.Columns.Add(MaCellule.Value, MaCellule.Value)
Next
MonDataGridView.Rows.Add(MaPlage.Rows.Count - 1)
For Each MaCellule As Excel.Range In MaPlage
MonDataGridView.Item(MaCellule.Column - 1, MaCellule.Row - 2).Value = MaCellule.Value
Next
End Sub
End Class

Nous obtenons un résultat comme celui-ci :

AVANTAGES :

Pour celui qui connait bien le modèle objet Excel, qui a l’habitude de VBA, l’automation Excel en dotnet est très simple. Presque aucune adapation de code n’est requise, à part pour les constantes (dans le code, voir Excel.XlDirection.xlToRight)

INCONVENIENTS :

De même qu’en VBA, attention à la lenteur d’un tel code ! Pour extraire les 1000 lignes de l’exemple ci-dessus, il a fallu près de 15 secondes !

Un autre inconvénient majeur est que la référence n’est pas .NET, mais COM. Aussi, les objets parlent assez « sommairement » entre eux. Nous aurions pu imaginer que le RANGE Excel puisse se déverser directement dans un objet typé dotnet, comme une DATATABLE, ou directement dans les ITEMS du DATAGRIDVIEW, mais il n’en n’est rien. Le RANGE Excel est un Array d’object, avec lequel on ne peut pas travailler directement. Il faut boucler sur tous les éléments pour les exploiter, ce qui prend un temps considérable.

CONCLUSION :

L’automation permet donc de manipuler Excel exactement comme on le ferait dans Excel, mais attention aux performances ! Pour un accès rapide, il faudra travailler avec Excel comme un fournisseur de donner et exploiter ADO.NET.

Top
Page 1 of 1

Contactez-nous contact@expert-data.fr

EXPERT data, solutions pour TPE/PME et grands comptes