IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

VB.NET + fichier Excel : plantage d'application en cours d'exécution


Sujet :

Windows

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut VB.NET + fichier Excel : plantage d'application en cours d'exécution
    Bonjour à tous,
    j'ai créé une interface qui gère un fichier Excel en lecture seul puisqu'il est utilisé en écriture par d'autres postes.
    Dans l'application je fais l'extraction des données qui font parfois plus de 10000 lignes.
    J'ai utilisé une boucle for pour traiter les lignes :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    For i As Integer = 1 To application.Cells(application.Rows.Count, "B").End(xlUp).Row
    Bien sûr il prend du temps pour traiter les données et d'un autre coté j'ai utilisé "filesystemwatcher" pour contrôler si le fichier est modifié ou non.
    Si le fichier est modifié l'application ouvre le fichier Excel et traite les données. Mais le problème est la vitesse d’écriture dans le fichier plus rapide que l'ouverture à chaque modification --> pas d’accès au menu de l'application et message exception :
    system.runtime.interopservices.comexception echec de l'appel de procédure distant
    après 3 ou 4 modifications de fichier.
    le fichier est a distant(réseau local).
    J'ai cherché en vain une solution dans les Cours et tutoriels Excel. y a-t-il une solution ou autre solution de manipulation de ce type?!
    merci.
    cordialement.

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Ce n'est pas vraiment le bon forum pour épiloguer très longtemps; d'autant plus qu'il y a un forum VB.net.

    Ceci étant dit, il existe des moyens d'ouvrir, créer ou modifier un fichier Excel en VB.net (en fait tout langage .net) sans même avoir Excel:

    1) Directement avec System.io.packaging
    2) Avec le SDK OpenXML Téléchargement ici de la documentation hors-ligne nuget
    3) Avec des bibliothèques dérivées du SDK comme Closed XML et EPPlus
    4) avec ADO.net (sur le même principe que Access ou SQLServer) avec le runtime d'Access

    Cependant, le partage de classeurs Excel est source de nombreux problèmes et devrait être évité.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre réponse.
    Mais je suis obligé de traiter les fichiers Excel puisque les autres postes sur réseau enregistrent les données sous la forme de fichiers Excel (CSV).

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Plus j'y pense, moins c'est un problème de Windows. Et puis VB.net peut ouvrir directement un fichier texte (txt ou csv, il s'en fout. C'est juste un problème de programmation.)

    Le pilotage par automation est généralement une solution appropriée pour utiliser une fonction intrinsèque d'Excel impossible ou difficile à programmer. Mais c'est la façon la plus lente et la moins efficace. C'est dire à Excel de faire quelque chose qui ne peut pas être fait en VB.net. Mais lire un fichier texte c'est facile en VB.net.

    Et Windows ne peut pas faire grand chose pour ce problème-là. C'est essentiellement un «esclave» du Framework .net.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour, et merci.
    Pensez-vous que l'importation de fichier CSV vers base de données peut traiter la problème. Si oui, j'ai déjà cherché sur plusieurs forums que l'importation de fichiers CSV rencontre plusieurs problèmes et j'ai déjà pratiqué ça: "La table externe n'est pas dans le format attendu."

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Label1.Text = OpenFileDialog1.FileName
    Using Conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + Label1.Text + ";Extended Properties=""Excel 12.0;HDR=YES;""")
                Conn.Open()
    ...
    Y a-t-il une solution pour ce genre de problème ?
    Mon projet fin d'étude est bloqué sur cette situation.
    Puis-je utiliser un autre langage plus efficace que vb.net pour les fichiers Excel ?
    Remarque: nos machines enregistrent les données de mesure de carte électronique sous la forme de fichiers CSV.
    Cordialement.

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Using Conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + Label1.Text + ";Extended Properties=""Excel 12.0;HDR=YES;""")
    Ta chaîne de connexion doit être modifiée. Regarde là pour les chaînes de connexion

    Et puis par précaution remplace tes + par l'esperluette (&).

    Tu peux aussi regarder cet exemple. J'utilise un TextFieldParser pour lire un fichier texte et l'afficher dans un DataGridView. Je ne peux pas le regarder pour l'instant, parce que je n'ai pas encore réinstallé Visual Studio après le remplacement de mon disque dur. La partie importation du fichier texte, permet de détecter si le séparateur est un point-virgule, une virgule ou une tabulation. Si le fichier ne contient pas d'entêtes de colonnes, il en rajoute. Et je pense qu'il utilise une ou des DataTables. Et j'ai pris le temps de mettre des commentaires.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre réponse.
    Votre exemple ne peut pas être ouvert puisqui'il est créé par une version récente que j'ai déjà en cours d'utilisation mais j'ai trouvé ça:
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Sub lire(ByVal chemin As String)
            Dim TextFileReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(chemin)
     
            TextFileReader.TextFieldType = FileIO.FieldType.Delimited
            TextFileReader.SetDelimiters(",")
     
            Dim TextFileTable As DataTable = Nothing
     
            Dim Column As DataColumn
            Dim Row As DataRow
            Dim UpperBound As Int32
            Dim ColumnCount As Int32
            Dim CurrentRow As String()
     
            While Not TextFileReader.EndOfData
                Try
                    CurrentRow = TextFileReader.ReadFields()
                    If Not CurrentRow Is Nothing Then
                        ''# Check if DataTable has been created
                        If TextFileTable Is Nothing Then
                            TextFileTable = New DataTable("TextFileTable")
                            ''# Get number of columns
                            UpperBound = CurrentRow.GetUpperBound(0)
                            ''# Create new DataTable
                            For ColumnCount = 0 To UpperBound
                                Column = New DataColumn()
                                Column.DataType = System.Type.GetType("System.String")
                                Column.ColumnName = "Column" & ColumnCount
                                Column.Caption = "Column" & ColumnCount
                                Column.ReadOnly = True
                                Column.Unique = False
                                TextFileTable.Columns.Add(Column)
                            Next
                        End If
                        Row = TextFileTable.NewRow
                        For ColumnCount = 0 To UpperBound
                            Row("Column" & ColumnCount) = CurrentRow(ColumnCount).ToString
                        Next
                        TextFileTable.Rows.Add(Row)
                    End If
                Catch ex As  _
                Microsoft.VisualBasic.FileIO.MalformedLineException
                    MsgBox("Line " & ex.Message & _
                    "is not valid and will be skipped.")
                End Try
            End While
            TextFileReader.Dispose()
            'frmMain.DataGrid1.DataSource = TextFileTable
            DataGridView1.DataSource = TextFileTable
     
        End Sub

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par gobaa1 Voir le message
    Merci pour votre reponse.
    Votre exemple ne peut pas etre ouvert puisqui'il est creé par une version recent que j'ai deja en cours d'utilisation mais j'ai trouve ça:
    Paris ne s'est pas bâtie en un jour et il reste toujours le système D. Si tu veux le voir en action, il y a au moins deux solutions que tu peux essayer.

    1) Tu te crées un nouveau projet Windows Forms, tu vires la form qu'il te donne et tu importes les forms de mon programme comme élément existant. Ensuite, si tu as des messages d'horreur au lancement, tu appliques les corrections qui s'imposent.

    2) Le fichier Desinger des forms et les fichiers de de code sont lisibles dans le Bloc-notes. Tu peux retrouver les contrôles nécessaires, leurs types leurs noms et le code pour bâtir un nouveau projet.

    Aucune des deux solutions ne sera instantanée, mais cela reste quand même un bon entraînement, peu importe l'expertise du programmeur. Évidemment, puis que le fichier de code est visible dans Notepad, ou tout autre programme capable de lire un fichier texte; tu peux juste étudier le code, ou le copier-coller dans ton application.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  9. #9
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci;
    j'ai bien corrigé mon programme en remplaçant TextFileReader.SetDelimiters(",") par TextFileReader.SetDelimiters(";") et ça me donne exactement un fichier Excel dans datagrid avec colonnes séparés.
    J'ai partagé ça pour que plusieurs en bénéficient car à la recherche j'ai trouvé de la difficulté à le résoudre.
    Merci mon ami.

  10. #10
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 4
    Points
    4
    Par défaut autre methode pour lire fichier CSV
    Bonjour;
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Sub lire1(ByVal chemin As String)
     
            Dim dt As New DataTable()
            Try
                Dim fs = New FileStream(chemin, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
                Dim sr = New StreamReader(fs, Encoding.Default)
                'Dim sr As New IO.StreamReader(chemin, True)
                'Dim dt As New DataTable
                Dim newline() As String = sr.ReadLine.Split(";"c)
                dt.Columns.AddRange({New DataColumn(newline(0)), New DataColumn(newline(1)), New DataColumn(newline(2)), New DataColumn(newline(3)), New DataColumn(newline(4))})
                While (Not sr.EndOfStream)
                    newline = sr.ReadLine.Split(";"c)
                    If newline.Length = 1 Then
                        GoTo suivant
                    Else
                        Dim newrow As DataRow = dt.NewRow
                        newrow.ItemArray = {newline(0), newline(1), newline(2), newline(3), newline(4)}
                        dt.Rows.Add(newrow)
    suivant:
                    End If
                End While
                DataGridView1.DataSource = dt
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
     
     
        End Sub

Discussions similaires

  1. Importation Fichier Excel dans une application Lotus Web
    Par djaminebiz dans le forum Lotus Notes
    Réponses: 2
    Dernier message: 29/04/2015, 12h13
  2. [AC-2003] Problème d'importation d'un fichier Excel dans une application ACCES
    Par zahira87 dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/03/2013, 14h08
  3. integre fichier excel dans mon application
    Par jalalnet dans le forum VB.NET
    Réponses: 1
    Dernier message: 07/06/2011, 09h31
  4. Modifier fichier Excel dans l'application
    Par Spellbinder dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/02/2011, 23h01
  5. [VB.NET] Fichier Excel vérouillé avec mot de passe
    Par rafano dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/06/2004, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo