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 ?

Frage Entwicklung Visual Studio

Mitglied: RedWraith

RedWraith (Level 1) - Jetzt verbinden

10.03.2010 um 11:23 Uhr, 8958 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
Microsoft Office
Excel 2007 Standardspeicherort lässt sich nicht ändern
Frage von leofabianMicrosoft Office

Hallo allerseits! Ich habe versucht in Excel 2007 unter Windows 7 den Standardspeicherort zu ändern, leider ohne Erfolg. Ich ...

VB for Applications
Excel Textkonvertierungs-Assistent läßt sich nicht unterdrücken
Frage von arotcivVB for Applications4 Kommentare

Hallo, ich habe hier in einer Excelmappe ein Makro, dass mir eine Textdatei in eine neue Arbeitsmappe einfügt. Ich ...

Router & Routing
WaWi über VPN beschleunigen
Frage von AndroxinRouter & Routing10 Kommentare

Moin, moin. Ich stehe momentan vor dem Problem, dass ein Client-Server basierte Warenwirtschaftssoftware über ein VPN genutzt werden soll. ...

Firewall
PfSense OpenVPN beschleunigen
Tipp von 108012Firewall

Hallo zusammen, ich nutze zwar nur ausschließlich IPSec VPN aber habe gerade mit einem Bekannten zusammen ein paar OpenVPN ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Necur-Botnet soll Erpressungstrojaner Scarab massenhaft verbreiten

Information von BassFishFox vor 9 StundenErkennung und -Abwehr

12,5 Millionen Spam-Mails aus einem Bot-Netz mit 6 Millionen Computern? Eigentlich eine schwache Leistung. Die Erpresser setzen dabei auf ...

Microsoft

Nadeldrucker-Problem unter Windows - Microsoft liefert Updates

Information von BassFishFox vor 10 StundenMicrosoft

Hat ja nicht lange gedauert. Nachdem die November-Updates für Windows 7, 8.1 und 10 zahlreiche Nadeldrucker lahmgelegt hatten, stellt ...

Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 17 StundenLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Heiß diskutierte Inhalte
Windows Server
Kann man im KMS nachschauen , wieviele Clients den Key in Anspruch genommen haben
gelöst Frage von rainergugusWindows Server15 Kommentare

Hallo, wir haben einen KMS Windows 10 Key. Dieser ist ja W7 kompatibel. Aber unser Windows 7 Pool registriert ...

Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...