Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Μεγάλη διάρκεια εξαγωγής Dataset σε Excel (20 Λεπτα)

Îåêßíçóå áðü ôï ìÝëïò Ηλίας Κεκάκος. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 12-06-2007, 13:33. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-06-2007, 15:30 32833

    Μεγάλη διάρκεια εξαγωγής Dataset σε Excel (20 Λεπτα)

       Έχω μιά ρουτίνα που της περνάω ένα Dataset με 5250 γραμμές και μου γεμίζει ένα excel αρχείο. Το πρόβλημα είναι ότι για τις 5250 γραμμές κάνει 20 λεπτά. Ο κώδικάς είναι ο εξής:

    Public Function ExportToExcel(ByVal Dataset As DataSet, ByVal ExcelPathFileName As String) As Boolean
    Dim oldCI As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
    System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
    Dim Excel As New Excel.Application
    Dim intColumn, intRow, intColumnValue As Integer

    'Check if the file exists. If YES delete it.
    If FileExists(ExcelPathFileName) = True Then
    My.Computer.FileSystem.DeleteFile(ExcelPathFileName, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
    End If

    'start excel and get application object
    Excel = DirectCast(CreateObject("Excel.Application"), Excel.Application)
    Try
    With Excel
    .SheetsInNewWorkbook = 1
    .Workbooks.Add()
    .Worksheets(1).Select()
    'For displaying the column name in the the excel file.
    For intColumn = 0 To Dataset.Tables(0).Columns.Count - 1
    .Cells(1, intColumn + 1).Value = Dataset.Tables(0).Columns(intColumn).ColumnName.ToString
    Next
    .Cells(1, intColumn + 2).Value = Now
    'For displaying the column value row-by-row in the the excel file.
    For intRow = 0 To Dataset.Tables(0).Rows.Count - 1
    For intColumnValue = 0 To Dataset.Tables(0).Columns.Count - 1
    .Cells(intRow + 2, intColumnValue + 1).Value = Dataset.Tables(0).Rows(intRow)(intColumnValue)
    '.ItemArray(intColumnValue).ToString()
    Next
    Next
    .Cells(intRow + 3, 1).Value = Now
    .ActiveWorkbook().SaveAs(ExcelPathFileName)
    .ActiveWorkbook.Close()
    End With
    m_ImageIndex = ImageIndexStatus.OkIcon
    m_Message = "The file " & ExcelPathFileName & " was created."
    Catch ex As Exception
    m_ImageIndex = ImageIndexStatus.ErrorIcon
    m_Message = "No Data exported because of the following error: " & vbCrLf & _
    ex.Message
    Finally
    Excel.Quit()
    Excel = Nothing
    GC.Collect()
    System.Threading.Thread.CurrentThread.CurrentCulture = oldCI
    End Try

    End Function

     Υπάρχει κανένας άλλος πιό γρήγορος τρόπος ή είναι κάτι λάθος στον κώδικα;

     

      Ευχαριστώ

  •  11-06-2007, 16:14 32837 σε απάντηση της 32833

    Απ: Μεγάλη διάρκεια εξαγωγής Dataset σε Excel (20 Λεπτα)

    Παλιός αλλά κλασσικός τρόποςWink
     (το χρησιμοποιούσα κυρίως στη VB6)

    Κάνε export το dataset σε ένα text File (ή Xml νομίζω ότι παίζει)
    και μετά μέσα από το κώδικα σου κάνε το import στο Excel sheet.
    Αν δεν ξέρεις ακριβώς πως γίνεται κάνε record τις κινήσεις που κάνεις στο excel με το χέρι μέσα από το μενού των macros - record new macro και κάνε την προσαρμογή για vb.net

    Χρόνος για να σου φτιάξει το excel sheet <30''Big Smile


    Manos
  •  11-06-2007, 16:16 32838 σε απάντηση της 32833

    Απ: Μεγάλη διάρκεια εξαγωγής Dataset σε Excel (20 Λεπτα)

    Ο τρόπος που χρησιμοποιείς είναι ίσως ο πιο αργός καθώς κάνεις συνέχεια κλήσεις μέσω Interop. Έχεις όμως τη δυνατότητα να χρησιμοποιήσεις όλο το object model του Excel για να πετύχεις ό,τι φορμάρισμα θέλεις. Αν όμως απλά θέλεις να εξάγεις ένα πίνακα χωρίς ειδικό format είναι υπερβολή. Άσε που απαιτεί να υπάρχει το Excel, κάτι το οποίο δεν μπορείς να θεωρείς δεδομένο.

    Τρόποι να εξάγεις δεδομένα στο Excel υπάρχουν πολλοί, και τους έχουμε ξανασυζητήσει αρκετές φορές. Καταρχήν, μπορείς να έχεις πρόσβαση σε ένα αρχείο Excel μέσω του OLEDB provider, σαν να είναι μία βάση. Κάθε φύλλο εμφανίζεται ως ένας πίνακας, οπότε μπορείς να χρησιμοποιήσεις εντολές SQL για να εξάγεις δεδομένα. Ίσως να μπορείς να χρησιμοποιήσεις και DataAdapter για να το κάνεις αυτό, αν και δεν το έχω δοκιμάσει. Ως τώρα το έχω χρησιμοποιήσει για να εξάγω δεδομένα με INSERT εντολές.

    Αν οι πελάτες σου χρησιμοποιούν εκδόσεις του Excel που υποστηρίζουν κάποιο XML format (από τo Office XP και μετά), μπορείς να δημιουργήσεις ένα αρχείο Excel σε μορφή XML. Δες τα "HOW TO: Transfer XML Data to Microsoft Excel 2002 by Using Visual Basic .NET" και "HOW TO: Transfer XML Data to Microsoft Excel 2002 by Using C#". Το XML format των παλαιότερων εκδόσεων του Office ήταν λίγο περίεργο, έτσι δεν είναι εύκολο να ορίσεις τη δική σου μορφοποίηση στο excel. Αν θέλεις να έχεις καλύτερο έλεγχο, μπορείς να χρησιμοποιήσεις το καινούριο XML format για το Excel 2007. Αυτό μάλιστα υποστηρίζεται από το .NET 3 και θα βρεις αρκετά έτοιμα παραδείγματα. Το Excel 2007 επιτρέπει τη δημιουργία ενός αρχείου excel στο οποίο τα δεδομένα αποθηκεύονται σε μορφή XML την οποία μπορείς να χειριστείς μέσω των κλάσεων του System.IO.Packaging. Σε κάθε περίπτωση, μπορείς να δημιουργήσεις πραγματικά Excel αρχεία τα οποία θα περιλαμβάνουν τα δεδομένα, τη μορφοποίηση και τυχόν φόρμουλες που χρειάζεσαι. 

    Τέλος, μπορείς να χρησιμοποιήσεις κάποιες "μπακάλικες" μεθόδους οι οποίες δεν δημιουργούν πραγματικά Excel αρχεία αλλά αρκετές φορές δουλεύουν. Μπορείς να αποθηκεύσεις τα δεδομένα σε .csv αρχεία ή σε html αρχεία με κατάληξη xls τα οποία περιέχουν ένα πίνακα με τα δεδομένα. Και στις δύο περιπτώσεις το Excel θα διαβάσει τα δεδομένα, αν δεν υπάρχουν "περίεργοι" χαρακτήρες, όπως εισαγωγικά στο csv ή < > στο html αρχείο. Σε αυτή την περίπτωση μπορεί να έχεις περίεργα προβλήματα. Τα αρχεία όμως δεν θα είναι πραγματικά αρχεία Excel και ο τελικός χρήστης θα πρέπει να αποθηκεύσει τις αλλαγές που θα κάνει σε άλλο αρχείο. Η τεχνική αυτή χρησιμοποιείται αρκετά συχνά από web sites με αμφίβολα αποτελέσματα. Μπορεί να δουλέψει στο 99% των περιπτώσεων ή να αποτύχει στο 50%, ανάλογα με τα δεδομένα που χρησιμοποιεί ο καθένας.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-06-2007, 00:26 32852 σε απάντηση της 32838

    Απ: Μεγάλη διάρκεια εξαγωγής Dataset σε Excel (20 Λεπτα)

    Αυτά παθαίνει κανείς όταν δεν προσέχει πολύ καλά τί references δινει. Δυστυχώς, τα δύο HOWTO που έδωσα πριν δεν περιγράφουν πως να σώσεις ένα dataset σε Excel XML, αλλά πως να δημιουργήσεις ένα HTML table! Μάλλον παραπλανητικός ο τίτλος Hmm.

    Το σωστό άρθρο για τη μετατροπή DataSet σε Excel XML είναι το "How to transform a DataSet to spreadsheet XML for Excel by using Visual Basic .NET and ASP.NET". Το άρθρο αφορά .NET 1.1 ενώ στο .NET 2.0 η ίδια δουλειά μπορεί να επιτευχθεί ελαφρώς ευκολότερα χρησιμοποιώντας την κλάση XmlCompiledTransform. Το σημαντικό είναι το stylesheet το οποίο δίνει το άρθρο για τη μετατροπή ενός Dataset σε Excel XML.

    Επίσης βρήκα και το "How To Use ADO.NET to Retrieve and Modify Records in an Excel Workbook With Visual Basic .NET" το οποίο περιγράφει πως να  δημιουργήσει κανείς αρχεία Excel χρησιμοποιώντας το ADO.NET και τον Jet OLEDB Provider.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-06-2007, 13:33 32867 σε απάντηση της 32852

    Απ: Μεγάλη διάρκεια εξαγωγής Dataset σε Excel (20 Λεπτα)

    Μόλις πέτυχα και το "Excel XML Writer Library" το οποίο δημιουργεί Excel XML χρησιμοποιώντας ένα απλό object model. Υπάρχει επίσης και ένας code generator ο οποίος διαβάζει ένα Excel και δημιουργεί τον κώδικα για τη δημιουργία του XML χρησιμοποιώντας την βιβλιοθήκη. Μπορεί κανείς να δημιουργήσει εύκολα αρχεία Excel με μορφοποίηση, φόρμουλες, links κλπ.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems