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

VB.NET Discussion :

demande de conseil : projet de manipulation de fichier excel


Sujet :

VB.NET

  1. #21
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Hello,
    désoler de répondre si tard mais c'est les vacances et je suis rarement chez moi

    Citation Envoyé par narutobaka Voir le message
    Pourquoi précises-tu uniquement si il y a besoin de lire le fichier?

    Est-ce que cette méthode permet de faire la manipulation inverse et de créé le nouveau document excel après modification des données dans le OleDdbadapter?
    Non il ne permet pas de créer un fichier excel, en plus je n'ai aucune idée de comment se comporte cette méthode avec des cellules fusionnées...
    Je suppose qu'il recopie la valeur dans les cases fusionnées... c'est à tester...
    Sinon en modification je n'ai jamais essayé car je dois appliquer des styles et je recrée toujours le fichier de zéro mais je ne vois pas pourquoi ca ne fonctionnerait pas.

    Sinon je pense que tu es sur la bonne piste, mais personnellement pour :
    Citation Envoyé par narutobaka Voir le message
    Pour l'instant les seuls éléments que j'ai trouvé nécessaire de stocker et le nombre de jour des mois et de semaines ainsi que le totale de présence pour ces mois et semaines, les reste étant des données copiées directement, je ne pense pas avoir besoin de les stocker.
    Je ferais d'abord un prétraitement de mise en mémoire total du fichier avant traitement.
    Une mise en mémoire du genre une liste de mois qui donne sur une liste de semaine qui donne sur une liste de jour, les jours étant en faite un objet avec des variables mois, semaine, jours, nombre de CDI, nombre d'intérimaire, (et toutes les autres données).
    ( ce n'est qu'une idée comme ca, il y a surement moyen de faire mieux )
    Une fois parser en mémoire de cette manière le traitement est bien plus facile et la maintenance aussi (surtout pour la maintenance, on connait tous les rajouts trois mois après l’utilisation du programme )

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je suis actuellement en train d'essayer de comprendre comment fonctionne la création d'un nouveau fichier :

    En m'aidant de :

    http://msdn.microsoft.com/fr-fr/libr...7s(VS.80).aspx

    Je réussit à faire :

    Code : 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
    Private Sub btnCheminFichierGenerer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheminFichierGenerer.Click
            Dim chemin As String
            Dim misValue As Object = System.Reflection.Missing.Value
            Dim feuilleGeneral As Excel.Worksheet
     
            SaveFile.Title = "Répertoire d'enregistrement du fichier généré"
            'OpenFile.Filter = "*.xls  | *.xls"
            SaveFile.ShowDialog()
            chemin = SaveFile.FileName
     
            Me.cheminFichierGenere.Text = chemin
     
            ExcelGenere = New Excel.ApplicationClass
            egWB = ExcelGenere.Workbooks.Add(misValue)
            feuilleGeneral = CType(egWB.Worksheets.Add(), Excel.Worksheet)
            egWB.SaveAs(chemin)
     
     
        End Sub
    Cela me permet bien de créer un nouveau fichier excel.

    Mon premier problème est qu'il y a systématiquement 3 feuilles par défault sur un nouveau classeur. Y a-t-il moyen de créer un classeur vierge, sans feuille auquel ajouter ces feuilles personnelles.

    Mon autre problème concerne la manière de renommer une feuille personnelle.
    dans mon exemple j'avais essayer cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuilleGeneral = CType(egWB.Worksheets.Add("general"), Excel.Worksheet)
    Mais il me renvoit une erreur.

    Exception de HRESULT : 0x800A03EC
    Si qqn a une idée pour ces deux problèmes.

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour

    je viens de relire le code de Diampa :

    Code : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
     
    #Region "Ouverture et fermeture du classeur"
        Public appExcel As Excel.Application
        Public Classeur As Excel.Workbook
     
        Public Feuil0, Feuil1, Feuil2, Feuil3, Feuil4, Feuil5, Feuil6, Feuil14 As Excel.Worksheet
        Public Feuil7, Feuil8, Feuil9, Feuil10, Feuil11, Feuil12, Feuil13 As Excel.Worksheet
        Public Feuil15, Feuil16, Feuil17, Feuil18, Feuil19, Feuil20, Feuil21, Feuil22, Feuil23 As Excel.Worksheet
     
        Public myIDExcel As Int16
     
        Public Sub OuvrirClasseur()
            Dim intFirstExcelIDs() As Int16 = ListID()
            Try
                appExcel = CType(CreateObject("Excel.Application"), Excel.Application)
                'Ouverture d'un fichier Excel
                Classeur = appExcel.Workbooks.Open(Filename:=My.Application.Info.DirectoryPath & "\Resources\BDR.xls", UpdateLinks:=0, ReadOnly:=False, Format:=5, Password:="diampa")
                Feuil1 = CType(Classeur.Worksheets("MotdePass"), Excel.Worksheet)
                Feuil2 = CType(Classeur.Worksheets("Bon"), Excel.Worksheet)
                Feuil3 = CType(Classeur.Worksheets("EtatBudget"), Excel.Worksheet)
                Feuil4 = CType(Classeur.Worksheets("EtatEngag"), Excel.Worksheet)
                Feuil5 = CType(Classeur.Worksheets("SituaGle"), Excel.Worksheet)
                Feuil6 = CType(Classeur.Worksheets("ImpriRea"), Excel.Worksheet)
                Feuil7 = CType(Classeur.Worksheets("FicheControle"), Excel.Worksheet)
                Feuil8 = CType(Classeur.Worksheets("ImpriEng"), Excel.Worksheet)
                Feuil9 = CType(Classeur.Worksheets("ImpriLiq"), Excel.Worksheet)
     
                Feuil10 = CType(Classeur.Worksheets("BorderauPerso"), Excel.Worksheet)
                Feuil11 = CType(Classeur.Worksheets("BorderauAutre"), Excel.Worksheet)
                Feuil12 = CType(Classeur.Worksheets("BorderauInvest"), Excel.Worksheet)
     
     
                Feuil13 = CType(Classeur.Worksheets("Borderau"), Excel.Worksheet)
                Feuil14 = CType(Classeur.Worksheets("Budget"), Excel.Worksheet)
                Feuil15 = CType(Classeur.Worksheets("Budget1"), Excel.Worksheet)
     
                Feuil16 = CType(Classeur.Worksheets("BudgetProjR"), Excel.Worksheet)
                Feuil17 = CType(Classeur.Worksheets("BudgetProjD"), Excel.Worksheet)
                Feuil18 = CType(Classeur.Worksheets("BudgetProgRecap"), Excel.Worksheet)
                Feuil19 = CType(Classeur.Worksheets("BordEmisMandat"), Excel.Worksheet)
                Feuil20 = CType(Classeur.Worksheets("GrandLivre"), Excel.Worksheet)
                Feuil21 = CType(Classeur.Worksheets("Fiches"), Excel.Worksheet)
                Feuil22 = CType(Classeur.Worksheets("BudgetR"), Excel.Worksheet)
                Feuil23 = CType(Classeur.Worksheets("BudgetD"), Excel.Worksheet)
                'BordEmisMandat  cheminPrincipal = Feuil1.Range("B77").Value.ToString
                '**** User 1
                Feuil0 = CType(Classeur.Worksheets("SituaGle1"), Excel.Worksheet)
     
                Dim intLastExcelIDs() As Int16 = ListID()
                'Différence des 2 listes et récupération de notre ID
                myIDExcel = ExtractID(intFirstExcelIDs, intLastExcelIDs)
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
     
     
        End Sub
     
        Public Function ListID() As Int16()
            Dim Processes As Process() = Nothing
            Processes = Process.GetProcessesByName("EXCEL")
            ' Load ID Processes in Array
            Dim intProcesses(Processes.GetUpperBound(0)) As Int16
            Dim i As Int16
            For i = 0 To CShort(Processes.GetUpperBound(0))
                intProcesses(i) = CShort(Processes(i).Id.ToString)
            Next
            Return intProcesses
        End Function
     
        Public Function ExtractID(ByVal intFirstIDs As Int16(), ByVal intLastIDs As Int16()) As Int16
            Dim intID As Int16 = Nothing
            Dim intID_FirsList As Int16 = Nothing
            Dim intID_LastList As Int16 = Nothing
            Dim i As Int16 = Nothing
            For i = 0 To CShort(intLastIDs.GetUpperBound(0))
                intID_LastList = intLastIDs(i)
                If Array.IndexOf(intFirstIDs, intID_LastList) = -1 Then
                    intID = intID_LastList
                    Exit For
                End If
            Next
            Return intID
        End Function
     
        Public Sub FermerClasseur(ByVal intIDExcel As Int16)
            ' appExcel.SaveWorkspace()
            If intIDExcel <> 0 Then
                If Process.GetProcessById(intIDExcel).HasExited = False Then
                    Try
                        Process.GetProcessById(intIDExcel).Kill()
                        intIDExcel = 0
                    Catch ex As Exception
                        MessageBox.Show(ex.Message & ex.StackTrace, "Error while closing Excel integration.", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End Try
                End If
            End If
        End Sub
    #End Region
    Mais ça me renvoie une erreur aussi.

    Apperemment, Diampa, tu utilises un template pour tes fichiers c biens ca?

    bon je continue à chercher

    ++

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je me suis repris le code de stampa et j'ai essayé de le comprendre.

    En fait il faut utiliser un fichier modèle, qui sera utilisé pour recréer un nouveau fichier excel.

    J'obtient ce code là :

    Code : 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
     
    Private Sub btnCheminFichierGenerer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheminFichierGenerer.Click
            Dim chemin As String
            'Dim misValue As Object = System.Reflection.Missing.Value
            Dim Feuil1 As Excel.Worksheet
     
            SaveFile.Title = "Répertoire d'enregistrement du fichier généré"
            'OpenFile.Filter = "*.xls  | *.xls"
            SaveFile.ShowDialog()
            chemin = SaveFile.FileName
     
            Me.cheminFichierGenere.Text = chemin
     
            ExcelGenere = CType(CreateObject("Excel.Application"), Excel.Application)
    'on définit ici le chemin du fichier modèle à partir duquel on veut travailler
    'j'y ai définit le nom de l'onglet par défaut et le nombre d'onglet par défaut        
    egWB = ExcelGenere.Workbooks.Open("C:\Documents and Settings\*****\Desktop\projet_Kelio\ressource\test.xls")
            egWB.SaveAs(chemin)
     
     
        End Sub
    J'obtiens donc une copie du modèle avec laquelle je vais travailler.

    J'ai réécrit sous une autre forme d'ailleur je n'arrive pas bien à saisir la différence entre les deux écritures mais elles font la même chose :

    Code : 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
    Private Sub btnCheminFichierGenerer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheminFichierGenerer.Click
            Dim chemin As String
            Dim misValue As Object = System.Reflection.Missing.Value
            Dim Feuil1 As Excel.Worksheet
     
            SaveFile.Title = "Répertoire d'enregistrement du fichier généré"
            'OpenFile.Filter = "*.xls  | *.xls"
            SaveFile.ShowDialog()
            chemin = SaveFile.FileName
     
            Me.cheminFichierGenere.Text = chemin
     
            ExcelGenere = New Excel.Application
            egWB = ExcelGenere.Workbooks.Open("C:\Documents and Settings\*****\Desktop\projet_Kelio\ressource\test.xls")
            egWB.SaveAs(chemin)
     
        End Sub
    Maintenant il faut que je vois comment rajouter des feuilles en leur associant un nom.

    Je continue mes recherches.

    ++

  5. #25
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par narutobaka Voir le message
    Mon autre problème concerne la manière de renommer une feuille personnelle.
    dans mon exemple j'avais essayer cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuilleGeneral = CType(egWB.Worksheets.Add("general"), Excel.Worksheet)
    Mais il me renvoit une erreur.
    Si tu regardes la définition de la méthode add de la collection sheets :
    http://msdn.microsoft.com/fr-fr/libr...ice.11%29.aspx
    tu peux y voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function Add( _
    	<InAttribute()> Optional ByVal Before As Object, _
    	<InAttribute()> Optional ByVal After As Object, _
    	<InAttribute()> Optional ByVal Count As Object, _
    	<InAttribute()> Optional ByVal Type As Object _
    ) As Object
    Parameters

    Before

    Optional Object. An object that specifies the sheet before which the new sheet is added.

    After

    Optional Object. An object that specifies the sheet after which the new sheet is added.

    Count

    Optional Object. The number of sheets to be added. The default value is one.

    Type

    Optional Object. Specifies the sheet type. Can be one of the following XlSheetType constants: xlWorksheet, xlChart, xlExcel4MacroSheet, or xlExcel4IntlMacroSheet. If you are inserting a sheet based on an existing template, specify the path to the template. The default value is xlWorksheet.
    donc on comprend bien que la méthode add comme tu l'appelle génère une erreur car il s'attend comme premier paramètre à avoir la feuille précédente et non pas un string...

    donc utilise tout simplement la fonction add sans paramètre, vu que tu sauve cette feuille dans une variable après tu la renomme avec Worksheet.Name = "nom de ta feuille" voir http://msdn.microsoft.com/fr-fr/libr...8VS.80%29.aspx

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Et merci pour ta réponse.

    J'ai trouvé un code d'exemple pour la création d'une nouvelle feuille de classeur à renommer ici : http://msdn.microsoft.com/fr-fr/library/bb608614.aspx.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Import the data.
            If Not (xmlMap1 Is Nothing) Then
                Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count)
                Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _
                    After:=lastSheet), Excel.Worksheet)
                newSheet.Name = "Imported Data"
                activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _
                    newSheet.Range("A1"))
            End If
    En fait dans la méthode Sheets.Add on peut apperemment spécifié sur quel paramètre on veut travailler, je connaissait pas encore cette syntaxe.

    en tout cas avec ce code :

    Code : 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
    Private Sub btnCheminFichierGenerer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheminFichierGenerer.Click
            Dim chemin As String
            Dim misValue As Object = System.Reflection.Missing.Value
            Dim Feuil1 As Excel.Worksheet
     
            SaveFile.Title = "Répertoire d'enregistrement du fichier généré"
            'OpenFile.Filter = "*.xls  | *.xls"
            SaveFile.ShowDialog()
            chemin = SaveFile.FileName
     
            Me.cheminFichierGenere.Text = chemin
     
            ExcelGenere = New Excel.Application
            egWB = ExcelGenere.Workbooks.Open("C:\Documents and Settings\blods94\Desktop\projet_Kelio\ressource\test.xls")
            egWB.SaveAs(chemin)
            ExcelGenere.Visible = True
     
            Dim lastSheet As Object = egWB.Sheets(egWB.Sheets.Count)
            Dim Newsheet As Excel.Worksheet = CType(egWB.Sheets.Add(After:=lastSheet), Excel.Worksheet)
            Newsheet.Name = "feuille créée dynamiquement"
     
        End Sub
    Je crée tout d'abord une copie d'un fichier excel modèle ( dans lequel je ne veux de base qu'une feuille appelée générale ).

    Et ensuite je lui ajoute une feuille, que je renomme avec la propriété name.

    Exactement comme tu l'expliques Sankasssss.

    En fait me fallait juste un exemple pour comprendre . Je trouve qu'il n'y a pas assez d'exemple sur la msdn ou alors ils sont mals placés ou alors je ne les cherche pas au bonne endroit

    encore merci.

  7. #27
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    De rien c'est un plaisir d'aider quand on voit que la personne qu'on aide ce donne la peine de faire des recherches...

    MSDN est un peut déroutante au début, mais une fois que l'on comprend comment elle fonctionne ca va pratiquement tout seul pour trouver l'info que l'on a besoin...
    Pour ma part j'ai passé quelque soirée à lire les pages sur tout le model word et excel quand j'ai commencé à programmer dessus pour me faire une idée d'ensemble de la structure et des méthodes disponible, après bien évidement je n'avais pas tout mémoriser par coeur donc quand tu sais que ca existe mais que tu ne sais pas vraiment comment, c'est bien plus facile à rechercher et à trouver...

    Sur ce je te souhaite un bon développement

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    C'est dommage qu'il n'existe pas un ptit tutorial sur les manipulations offices un peu comme ce cours de VB.net :

    http://www.developpez.net/forums/d76...ippe-lasserre/

    Concernant la msdn, il est clair que je ne l'utilise pas encore correctement, je finalise en se moment un projet en php et j'ai plus l'habitude de la documentation sur www.php.net

    L'api documentation de Extjs est pas mal non plus : http://extjs.com/deploy/dev/docs/
    Mais pareil elle manque cruellement d'exemple.


Discussions similaires

  1. Comment manipuler plusieurs fichiers Excel
    Par Olivier0 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 16/08/2007, 08h38
  2. [c#][.net 1.1] - Manipuler des fichiers Excel en c#
    Par skystef dans le forum ASP.NET
    Réponses: 4
    Dernier message: 13/08/2007, 13h10
  3. probleme de manipulation de fichier excell
    Par obydissonn dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/03/2007, 13h21
  4. Manipuler un fichier excel avec python
    Par dipajero dans le forum Général Python
    Réponses: 4
    Dernier message: 09/02/2006, 23h14

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