Durée pour l'écriture sur un fichier excel

Corbel88 Messages postés 10 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 8 janvier 2009 - 30 sept. 2008 à 09:22
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 - 30 sept. 2008 à 13:40
Bonjour,
Je dois ecrire des données sur un fichier excel.
Tout se passe bein mais le temps pour l'écriture est énorme quelqu'un aurais t il une idée?

        FNxls = "C:\Inetpub\wwwroot\Schneider\upload\temp\plop12.xls"
        App = New Microsoft.Office.Interop.Excel.Application

        If File.Exists(FNxls) Then
            Kill(FNxls)
        End If

        'Ouverture de l'application
        App = CreateObject("Excel.Application")
        'Ouverture d'un fichier Excel
        Book = App.Workbooks.Add
        'Sheet correspond à la première feuille du fichier
        Sheet = Book.Worksheets(1)

        Dim debut As Integer = 1

        For Each dc In tableTemp.Columns
            contenuCellule = dc.ToString
            With Sheet
                'entree les noms de colonne
                For iCol = debut To ColMax
                    .Cells(1, iCol) = contenuCellule
                Next
            End With
            debut = debut + 1
        Next

        Dim numLigne As Integer = 2
        nb = tableTemp.Columns.Count()
        Dim nb2 As Int64 = tableTemp.Rows.Count()
        For Each dr2 In tableTemp.Rows
            debut = 1
            i = 0
            iCol = 0
            For i = 0 To nb - 1 'nb - 2
                iCol = iCol + 1

                With Sheet

                    .Cells.NumberFormat = "@"
                    .Cells(numLigne, iCol) = dr2(i)

                    'Next
                End With

                debut = debut + 1

            Next
            numLigne = numLigne + 1

        Next

        ' Titres en Gras
        Sheet.Rows(1).Font.Bold = True

        ' Select the first cell.
        Sheet.Cells(1, 1).Select()

        'sauvegarder
        Try
            App.DisplayAlerts = False
            Sheet.SaveAs(FNxls)
        Catch ex As Exception
            ErrStr "Erreur " & vbCrLf & ex.ToString
            GoTo fout
        End Try
fout:
        App.Workbooks.Close()
        App.Quit()
        App = Nothing

10 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 sept. 2008 à 09:26
Bonjour,
Déjà : tu meparais inhiber l'affichage "apès la bagarre" ...
0
Corbel88 Messages postés 10 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 8 janvier 2009 1
30 sept. 2008 à 09:50
Oui, je sais ..
Quelqu'un aurait il un idée pour réduire le temps d'éxecution?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 sept. 2008 à 10:09
Re,

Si tu "sais"... qu'attends-tu DONC pour commencer au moins par celà ? (inhiber AVANT et rétablir APR7S° ...
0
Corbel88 Messages postés 10 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 8 janvier 2009 1
30 sept. 2008 à 10:17
Que veux tu dire par inhiber?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 sept. 2008 à 11:14
Ouvre ton aide en ligne VBA (sur ta machine) et vois ce que peut être Application.ScreenUpdating
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
30 sept. 2008 à 11:38
Salut,
Etant en .NET utlises File aussi pour détruire le fichier plutot que Kill (mleme si le résultat devrait etre le meme)
If File.Exists(FNxls) Then File.Delete(FNxls)

Qu'est supposé faire cette boucle?

For Each dc In tableTemp.Columns
   contenuCellule = dc.ToString
   With Sheet
       'entree les noms de colonne
       For iCol = debut To ColMax
           .Cells(1, iCol) = contenuCellule
       Next
   End With
   debut = debut + 1
Next
, ----
[../code.aspx?ID=41455 By Renfield]
Ce qui m'intrigue surtout c'est
       'entree les noms de colonne
       For iCol = debut To ColMax
           .Cells(1, iCol) = contenuCellule
       Next

D'ailleurs que vaut ColMax?
@+: Ju£i€n
Pensez: Réponse acceptée
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
30 sept. 2008 à 11:48
Salut,
Essaie peu être ce code.
C'est le tiens mais un peu épurer de ce qui me semble inutile et auquel j'ai ajoute ce que te proposais [../auteur/JMFMARQUES/615490.aspx jmfmarques] (salut) .Mais cela ne doit pas t'empêcher de regarder l'aide en ligne

Dim FNxls As String
   Dim App = New Microsoft.Office.Interop.Excel.Application
   Dim debut As Integer = 1
   FNxls = "C:\Inetpub\wwwroot\Schneider\upload\temp\plop12.xls"
   'Supression  du fichier si il existe
   If File.Exists(FNxls) Then File.Delete (FNxls)

   'Ouverture de l'application
   App = CreateObject("Excel.Application")
   App.ScreenUpdating = False

   'Ouverture d'un fichier Excel
   Book = App.Workbooks.Add
   'Sheet correspond à la première feuille du fichier
   Sheet = Book.Worksheets(1)

   For Each dc In tableTemp.Columns
       'entree les noms de colonne
       If debut < ColMax Then
           Sheet.Cells(1, debut).Value = dc.ToString
       End If
       debut = debut + 1
   Next

   Dim numLigne As Integer = 2
   nb = tableTemp.Columns.Count()
   Dim nb2 As Int64 = tableTemp.Rows.Count()
   For Each dr2 In tableTemp.Rows
       For I = 0 To nb - 1 'nb - 2
           With Sheet
               .Cells.NumberFormat = "@"
               .Cells(numLigne, I + 1) = dr2(I)
           End With
       Next
       numLigne = numLigne + 1
   Next

   ' Titres en Gras
   Sheet.Rows(1).Font.Bold = True

   ' Select the first cell.
   Sheet.Cells(1, 1).Select()

   'sauvegarder
   Try
       App.DisplayAlerts = False
       Sheet.SaveAs (FNxls)
   Catch ex As Exception       ErrStr "Erreur " & vbCrLf & ex.ToString
   End Try

   App.Workbooks.Close()
   App.ScreenUpdating = True
   App.Quit()
   App = Nothing
, ----
[../code.aspx?ID=41455 By Renfield]
Après il faut aussi voir le nombre de ligne (et de colonnes) que doit écrire le programme peu être est ce "normal" que cela soit long. dépend de la quantité de données.

@+: Ju£i€n
Pensez: Réponse acceptée
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 sept. 2008 à 11:58
Bonjour, Julien,

Il y a un autre aspect, que nous ignorons :
Si sa feuille contient des formules de calculs divers, le calcul se fera à chaque modif de cellule ...
Il lui faut également peut-être alors penser à ne permettre les calculs qu'une fois les cellules modifiées (à la fin).
0
Corbel88 Messages postés 10 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 8 janvier 2009 1
30 sept. 2008 à 12:54
J'ai 13 colonnes mais le nombres de lignes augmente tout le
temps.
Je récupère ces données d'une base de données de produit donc
en constante évolution.
Je n'ai aucunes formules de calculs.
Pour écrire 1080 lignes j'ai besoin de 6 à 7 minutes.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
30 sept. 2008 à 13:40
Salut,
est ce que cela est améliorer par le code que je t'ai fourni?

@+: Ju£i€n
Pensez: Réponse acceptée
0
Rejoignez-nous