Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst VB.NET Lässt sich Excel Interop beschleunigen ?

Mitglied: RedWraith

RedWraith (Level 1) - Jetzt verbinden

10.03.2010 um 11:23 Uhr, 9461 Aufrufe, 4 Kommentare

Hallo Freunde !

Ich habe ein kleines Tool geschrieben, welches Berichte aus einer Datenbank erstellt und diese dem Nutzer anzeigt.

Nun möchte ich, dass der User die Möglichkeit hat, den Bericht in eine Excel Datei zu exportieren.
Meine Implementation über Microsoft.Office.Interop.Excel funktioniert auch, allerdings kommt diese mir langsam vor.
Ich brauche um eine 250 Zeilen lange, nachher etwa 50KB große Excel Tabelle zu exportieren etwa 15-20 Sekunden.
Wenn ich bedenke, dass ich auf einem Core2 Duo mit 4Gig Ram arbeite, kommt mir das zu langsam vor,
vorallem wenn ich daran denke, dass das Programm auch noch auf schwächeren Rechnern ausgeführt werden soll.


Meine Implementation sieht im Moment so aus:

01.
Private Sub SpeicherDateiXLS(ByVal pfad As String, Optional ByVal confirm As Boolean = False)
02.
        Dim app As Excel.Application
03.
        Dim wb As Excel.Workbook
04.
        Dim ws As Excel.Worksheet
05.

06.
        Dim i, j, cursor As Integer
07.

08.
        Try
09.
           app = New Excel.Application
10.
            wb = app.Workbooks.Add()
11.
            ws = wb.Sheets(1)
12.

13.
            ws.Activate()
14.

15.
            cursor = 1
16.

17.
            With ws
18.

19.
                For i = 0 To Me.dgvDeckblatt.Columns.Count - 1
20.
                    .Cells(cursor, i + 1).value = Me.dgvDeckblatt.Columns(i).HeaderText
21.
                Next
22.

23.
                cursor += 1
24.

25.
                For i = 0 To Me.dgvDeckblatt.Rows.Count - 1
26.
                    For j = 0 To Me.dgvDeckblatt.Columns.Count - 1
27.
                        .Cells(cursor, j + 1).value = ds(Me.dgvDeckblatt.Rows(i).Cells(j).Value)
28.
                    Next
29.
                    cursor += 1
30.
                Next
31.

32.
                cursor += 3
33.

34.
                For i = 0 To Me.dgvPackliste.Columns.Count - 1
35.
                    .Cells(cursor, i + 1).value = Me.dgvPackliste.Columns(i).HeaderText
36.
                Next
37.

38.
                cursor += 1
39.

40.
                For i = 0 To Me.dgvPackliste.Rows.Count - 1
41.
                    For j = 0 To Me.dgvPackliste.Columns.Count - 1
42.
                        .Cells(cursor, j + 1).value = ds(Me.dgvPackliste.Rows(i).Cells(j).Value)
43.
                    Next
44.
                    cursor += 1
45.
                Next
46.

47.
                cursor += 3
48.

49.
                For i = 0 To Me.dgvFehlmengen.Columns.Count - 1
50.
                    .Cells(cursor, i + 1).value = Me.dgvFehlmengen.Columns(i).HeaderText
51.
                Next
52.

53.
                cursor += 1
54.

55.
                For i = 0 To Me.dgvFehlmengen.Rows.Count - 1
56.
                    For j = 0 To Me.dgvFehlmengen.Columns.Count - 1
57.
                        .Cells(cursor, j + 1).value = ds(Me.dgvFehlmengen.Rows(i).Cells(j).Value)
58.
                    Next
59.
                    cursor += 1
60.
                Next
61.

62.
                .PageSetup.Zoom = False
63.
                .PageSetup.FitToPagesWide = 1
64.
                .PageSetup.FitToPagesTall = 99
65.

66.
            End With
67.

68.
            wb.SaveAs(pfad)
69.
            wb.Close()
70.
            app.Quit()
71.

72.
            If confirm Then
73.
                MsgBox("Bericht wurde gespeichert unter:" & vbCrLf & pfad)
74.
            End If
75.

76.
        Catch ex As Exception
77.
            MessageBox.Show("Error: " + ex.ToString())
78.
        End Try
79.
    End Sub
Gibt es eine Möglichkeit, das in Bezug auf Ausführgeschwindigkeit zu verbessern ?

Ich wäre für jeden Vorschlag dankbar.
Mitglied: problemsolver
10.03.2010 um 12:01 Uhr
Hallo,

mein Vorschlag:
1.) Exportiere die Werte in eine CSV-Datei. Dadurch benutzt Du nur die normalen Dateisystemfunktionen...
2.) Öffne die CSV mit Excel. Formatiere bzw Passe die Spalten dann an.

Das wird sicherlich viel viel schneller sein... schon mal über diesen Weg nachgedacht... Ok ich gebe zu, dass es etwas ungewöhnlich ist, aber "give it a try"

gruß

Markus
Bitte warten ..
Mitglied: RedWraith
10.03.2010 um 12:19 Uhr
Ah ich werds versuchen !

Interessanterweise hatte ich ursprünglich einen CSV Export implementiert, aber ich brauchte zusätzliche Formatierungen.
Ich melde mich zurück, wenns geklappt hat.
Bitte warten ..
Mitglied: 76109
10.03.2010 um 12:55 Uhr
Hallo RedWraith!

Da gibts doch sicher auch eine Range-Funktion und eventuell eine Copy-Funktion mit Destination oder Copy- und Paste-Funktion. In Excel würde man das sinngemäß in etwa so machen:
Range(Deckblatt.Cells(Zeile, Spalte 1), Deckblatt.Cells(Zeile, Deckblatt.Columns.Count)).Copy destination:=Excel.Cells(Zeile,Spalte)

Gruß Dieter
Bitte warten ..
Mitglied: RedWraith
10.03.2010 um 13:52 Uhr
Hallo Dieter,

Programmintern werden die Bericht als DataTable bzw. DataGridView behandelt, die haben keine .Cells Funktion, weil sie nicht Bestandteil des Objektbaumes von Excel sind.

Ich habe Markus Idee implementiert und der Umweg, die Dateien erst als CSV direkt zu schreiben und dann mit Excel zu konvertieren ist zwar etwas unelegant, ist aber deutlich schneller.


Lösung:
Man speichert das Ganze als CSV, öffnet es im Excel und speichert es dann als XLS. Source ist in etwa folgendes:
01.
csv="test.csv"
02.
xls="test.xls"
03.
app = New Excel.Application
04.
wb = app.Workbooks.Open(csv)
05.
ws = wb.Sheets(1)
06.

07.
wb.SaveAs(xls, Excel.XlFileFormat.xlWorkbookNormal)
08.
wb.Close(False)
09.
app.Quit()
10.
io.file.delete(csv)
Danke für die Hilfe !

Tim
Bitte warten ..
Ähnliche Inhalte
Visual Studio
VB.NET Symlink (mklink)
gelöst Frage von duschgasVisual Studio6 Kommentare

Guten Tag, ich bin am verzweifeln. Mittels VB.NET möchte ich per Buttonklick einen Symlink (mklink) einer Datei erstellen. Mein ...

Visual Studio
Vb.net dynamische Logik
Frage von theoberlinVisual Studio6 Kommentare

Hallo zusammen, In der Hoffnung hier tummeln sich auch vb.net programmierer würde ich euch gern eine Frage stellen: Ich ...

Visual Studio
Netzwerkdrucker installieren, vb.net
gelöst Frage von HardExitVisual Studio

Hallo Leute, also nach langem Tüfteln habe ich jetzt einen Funktionierenden Drucker installationscode, den ich gerne mit euch teilen ...

Visual Studio
Variabler Ordnername VB.Net
gelöst Frage von HardExitVisual Studio12 Kommentare

Servus, also ich habe einen Ordner an dem immer ein Datum angehängt ist, diesen Variablen namen müsste ich irgendwie ...

Neue Wissensbeiträge
Windows 7
Updategängelung auf Windows 10, die zweite
Information von Penny.Cilin vor 3 TagenWindows 71 Kommentar

Hallo, da Windows 7 im kommenden Jahr nicht mehr supportet wird, werden Nutzer von Window 7 home premium wieder ...

Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 5 TagenInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 6 TagenMicrosoft Office8 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 8 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
Windows Installation
Windows10 Home Neuinstallation - Raketentechnik
Frage von spacyfreakWindows Installation15 Kommentare

"Kannst du den Rechner von der Tante von WindowsXP auf Windows10 Home upgraden" haben sie gefragt? "Sicher, was kann ...

Utilities
Teamviewer 9.x "out of date" ??
gelöst Frage von keine-ahnungUtilities13 Kommentare

Moin at all, mein topaktueller teamviewer (alles 9.x - releases) verweigert seit heute die Arbeit und bemeckert: "the remote ...

Windows 10
Netzlaufwerk verschwindet (aber nur bestimmter Laufwerksbuchstabe)
gelöst Frage von survial555Windows 1010 Kommentare

Hallo, ich habe ein ganz seltsames Problem. Systemumgebung: Server 2012 R2 als DC und Windows 10 Pro als Clients ...

Peripheriegeräte
PS2 Y-Kabel für Maus+Tastatur an PS2 Combo-Anschluss ASUS Prime X370-A
gelöst Frage von Windows10GegnerPeripheriegeräte10 Kommentare

Hallo, ich bin am Überlegen das o.g. Motherboard anzuschaffen. Da ich aber noch PS/2 für Maus+Tastatur benötige (bei optischen ...