Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 64091 Skopiuj do schowka VB.net eksport DataTable do Excela
Autor Wiadomość
BrunO 
ExcelSpec



Pomógł: 126 razy
Posty: 551
Wysłany: 10-02-2019, 17:29   VB.net eksport DataTable do Excela

Tak wiem, tym tematem wykraczam poza tematykę forum, ale szczerze mówiąc nie trafiłem dotąd na sensowne polskie forum o Visual Studio i Visual Basicu (gdyby ktoś miał coś do polecenia proszę o cynk na PW), a podejrzewam, że tutaj kilka osób zorientowanych w temacie może się znaleźć...

Otóż mam wygenerowany raport do DataTable o nazwie tbRaport, prezentuję go sobie w datagrigview o nazwie DGV_Raport. I niby wszystko fajnie, ale chciałbym sobie ten raport wyeksportować do excela. Wujek google pomógł, znalazłem kilka gotowców, z których po kilku dniach walki z referencjami itp. skleciłem kod, który zasadniczo robi to, co chciałem, czyli zapisuje mi raport do xlsx. Ale robi to tragicznie wolno. Puszczony na cały raport podejrzewałem o zawieszenie, ograniczony do 100 rekordów międli je ponad 10 sekund, a rekordów będzie kilkanaście tysięcy albo i więcej.
Wszystkie gotowce na jakie trafiłem robią zrzut iteracyjnie i podejrzewam, że to może być przyczyną, choć mimo wszystko 74 kolumny x 100 wierszy w 10 s to jakoś długo... Dodam tylko, że odpalam to na przyzwoitym kompie a ekspresie do kawy...

kod wygląda tak:

Kod:
Private Sub ExportToExcel()

        Dim xlApp As Excel.Application
        Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook
        Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet
        Dim misValue As Object = System.Reflection.Missing.Value
        Dim i As Long
        Dim k As Integer

        xlApp = New Microsoft.Office.Interop.Excel.Application
        xlWorkBook = xlApp.Workbooks.Add(misValue)
        xlWorkSheet = xlWorkBook.Sheets("Arkusz1")


        'DATA TABLE

        For k = 1 To tbRaport.Columns.Count
            xlWorkSheet.Cells(1, k) = tbRaport.Columns(k - 1).ColumnName
        Next


        For i = 0 To 100    'tbRaport.RowCount - 1
            For k = 0 To tbRaport.Columns.Count - 1
                xlWorkSheet.Cells(i + 2, k + 1) = tbRaport.Rows(i).ItemArray(k)
            Next
        Next


        Dim strFile As String = "D:Raport.xlsx"

        If System.IO.File.Exists(strFile) = True Then

            System.IO.File.Delete(strFile)
        End If

        xlWorkSheet.SaveAs(strFile)
        xlWorkBook.Close()
        xlApp.Quit()

        releaseObject(xlApp)
        releaseObject(xlWorkBook)
        releaseObject(xlWorkSheet)

        Dim odp As MsgBoxResult
        odp = MsgBox("Eksport zakończony. Czy chcesz otworzyć raport?", MsgBoxStyle.YesNo)
        If (odp = MsgBoxResult.Yes) Then
            Process.Start(strFile)
        End If

    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try

    End Sub


Szukając sposobu na przyspieszenie trafiłem na opcję exportu DataTable do XMLa

Kod:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BtnXML.Click

        tbRaport.TableName = "Raport"
        tbRaport.WriteXml("D:test.xml")


End Sub

W sumie jedna funkcja załatwiająca całą robotę w mgnienie oka. Eksport wszystkich rekordów trwa dosłownie chwilę. Tylko ten xml taki trochę mało mi przydatny... no chyba żeby przerobić go na xls...
Sposób na to też wygooglowałem.

Kod:
    Private Sub XmlToExcel()

        Dim InputXmlFile As String = "D:test.xml"
        Dim OutputExcelFile As String = "D:vbexcel.xlsx"

        Dim excelFile As New Excel.Application
        excelFile.Workbooks.Open(InputXmlFile)
        excelFile.Workbooks.Item(1).SaveAs(OutputExcelFile, Excel.XlFileFormat.xlWorkbookDefault)
        excelFile.Workbooks.Close()
        SetAttr(InputXmlFile, vbNormal)
        excelFile.Quit()
        excelFile = Nothing

        Dim f2 As New System.IO.FileInfo(OutputExcelFile)
        SetAttr(OutputExcelFile, FileAttribute.Normal)


    End Sub

I niby działa piorunem, ale efekt pracy jest trochę dziwny. Pojawiają się dziwne nagłówki, brakuje kilku kolumn, ich kolejność jakaś przemieszana... Krotko mówiąc, nie do końca o to chodziło.

Podpowiecie coś?
ID posta: 362315 Skopiuj do schowka
 
 
BrunO 
ExcelSpec



Pomógł: 126 razy
Posty: 551
Wysłany: 12-02-2019, 00:04   

Porobiłem trochę testów, poszukałem trochę o eksporcie do rożnych formatów i wychodzi mi do CSV, XML, TXT - wszystko w mgnieniu oka, nawet jeśli obróbka idzie iteracyjnie.

działa mi np. taki zrzut do txt. Separatorem jest Tab, więc ładnie otwiera się to potem w excelu.
Kod:
    Sub DataTable2TXT()
        Dim writer As System.IO.StreamWriter
        Dim sepChar As String = vbTab
        Dim file_name As String = "D:TestTXT.txt"

        If System.IO.File.Exists(file_name) = False Then
            File.Create(file_name).Dispose()
        End If

        Try
            writer = New System.IO.StreamWriter(file_name)

            ' first write a line with the columns name
            Dim sep As String = ""
            Dim builder As New System.Text.StringBuilder
            For Each col As DataColumn In tbRaport.Columns
                builder.Append(sep).Append(col.ColumnName)
                sep = sepChar
            Next
            writer.WriteLine(builder.ToString())

            ' then write all the rows
            For Each row As DataRow In tbRaport.Rows
                sep = ""
                builder = New System.Text.StringBuilder

                For Each col As DataColumn In tbRaport.Columns
                    builder.Append(sep).Append(row(col.ColumnName))
                    sep = sepChar
                Next
                writer.WriteLine(builder.ToString())
            Next
        Finally
            If Not writer Is Nothing Then writer.Close()
        End Try
    End Sub


Tylko, że polskie znaki się wtedy krzaczą. Otwierając plik w notatniku jest ok, skopiowana treść wklejona do Excela też jest ok. Ale txt otworzony excelem daje mi
ĹšwinoujĹ›cie zamiast Świnoujście :angry
ID posta: 362396 Skopiuj do schowka
 
 
Wormsek 



Zaproszone osoby: 2
Wersja: Win Office 2016
Pomógł: 912 razy
Posty: 5267
Wysłany: 12-02-2019, 12:31   

Hej,
Na szybko, bo nie mam kiedy się pobawić, to spróbuj dać mu po prostu odpowiednie kodowanie jak zrzucasz do pliku. Stream writer ma 8 konstruktorów New, gdzie jeden z nich pozwala ci dorzucić kodowanie.

Kod:
Dim fs As New StreamWriter(strpath, Encoding.ASCII)


Co do samego problemu, to nie bawiłem się DataTable, ale sam zaczytuję dane z plików TXT. Każdą kolumnę w txt wrzucam do osobnej tabeli, taką tabelę wrzucam do słownika z odpowiednim numerkiem, a potem bardzo ładnie można zrobić przez .Value = tbl. Jeżeli będziesz chciał więcej szczegółów to mogę sklecić jakiś przykładzik później.
_________________
Pozdro
Worm

FAQ - Najczęściej zadawane pytania.
JAK KORZYSTAĆ Z SZUKAJKI
Słownik funkcji

Znajdź nas na Facebook'u

A może fajny dodatek do excela?
ID posta: 362435 Skopiuj do schowka
 
 
BrunO 
ExcelSpec



Pomógł: 126 razy
Posty: 551
Wysłany: 12-02-2019, 13:51   

Dzięki, na pewno przetestuję kombinacje z kodowaniem.

Rozważam jeszcze awaryjne wyjście polegające na wygenerowaniu stringa / eksportu do schowka i wklejania do otwartego excela, tylko na razie jeszcze nie szukałem czy da się to technicznie ogarnąć.

Na chwile obecną raczej nie przewiduję zasysania z dodatkowych danych z txt, więc nie ma sensu żebyś na darmo tracił czas. Gdy zajdzie potrzeba, na pewno się odezwę :)
ID posta: 362446 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe