Insert into do excelu   otázka

VB.NET, ADO.NET, Office

Zdravím, řeším požadavek kdy uživatel chce jedním kliknutím exportovat do excelu data, která má právě zobrazená v dataGridViewu. Pokouším se to vyřešit, ale pořád na to něják nemůžu kápnout.

Nejdřív si vytvořím nový excel který někam uložím a potom do něj pošlu data. Zatím jsem přišel na to jak vložit jednu hodnotu. Řeším to takto:

    Sub exportDoExcelu()
        Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\JDedek\Honza\Projekty\VB#\nové přidělování úkolů (grafika)\import\Export.xls;Extended Properties=""Excel 8.0;HDR=No;"""
        Dim spojeni As OleDb.OleDbConnection = New OleDb.OleDbConnection(connectionString)
        Dim command As OleDb.OleDbCommand = New OleDb.OleDbCommand
       

        command.CommandText = "INSERT INTO [List1$] (F1) VALUES ('ahoj')"
        command.Connection = spojeni

        spojeni.Open()
        command.ExecuteNonQuery()
        spojeni.Close()
    End Sub

A zde je právě několik problémů. Tento kód funguje, ale problém vyvstane když potřebuju vložit více sloupců (což samozřejmě potřebuji). Myslel jsem že to zapíšu takto: "INSERT INTO [List1$] (F1,F2,F3) VALUES ('hodnota1','hodnota2',hodnota3)"

To mi ale napíše, že příkaz insert into obsahuje neznámý název pole:F2

Pokud bych pojmenoval sloupce (např. ID,jmeno,mesto) a v dotazu je volal těmito jmény tak to funguje, jenže to je pro mě nepoužitelné, protože při exportu vytvářím nový sešit.

Pokud bych toto vyřešil, není problém abych prošel cyklem dataTable kterou mám načtenou ve své aplikaci a po řádcích poslal data do excelu. (napadlo mě, jestli nejde excelu poslat celou dataTable najednou když už ji jednou mám načtenou, ale o tom jsem nikde nic nenašel).

A pak bych měl ještě jednu otázku (ale to by byl pro mě spíše takový bonus). Teď se aplikace uživatele před exportem zeptá kam chce uložit excel, tuto cestu si uložím, vytvořím na daném místě sešit a pak ho zde naplním. Všiml jsem si ale, že některé profi aplikace umožnující export dat do excelu pouze otevřou nový sešit a vloží do něj data a na uživateli je jestli si ho někam uloží a nebo ho zavře bez uložení (a tím o vyexportovaná data příjde). V tomto případě mi není jasné jak se na asešit odkazovat (neznám adresu) abych do něj vložil data.

Díky za jakoukoliv radu a přeji pěkný den

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže jsem zjistil že je nejdříve potřeba vytvořit v excelu tabulku příkazem create table. Ale více sloupců mi jde vytvořit pouze při založení nového sešitu (pokud už je někde uložený, tak jde zase vytvořit jenom první sloupec). Pěkný příklad jsem nalezl zde:

http://www.beansoftware.com/NET-Tutorial...

Snad mi to pomůže. Takže hlavní problém (snad) vyřešen. Teď už jen pokud by někdo věděl ty drobnosti (jestli je možné poslat excelu celou dataTable a jak zapsat do excelovského sešitu bez uložení). Ale bez toho se obejdu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já používám tento kód, který jsem našel na MSDN. Musel jsem ho částečně přepsat kvůli chybám, ale teď již funguje bez problémů:

    'Tlačítko pro export datagridView do excelu
    Private Sub btnExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExport.Click
        ' Call the export sub
        exportExcel(dgvReportView, "exportedData", ".xls", _
            My.Computer.FileSystem.SpecialDirectories.Desktop)

    End Sub
'Deklarace funkce ShellEx
    Private Declare Function ShellEx Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hWnd As Integer, ByVal lpOperation As String, _
        ByVal lpFile As String, ByVal lpParameters As String, _
        ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer

    'Procedura pro export do Excelu
    Private Sub exportExcel(ByVal grdView As DataGridView, ByVal fileName As String, _
    ByVal fileExtension As String, ByVal filePath As String)

        ' Choose the path, name, and extension for the Excel file
        Dim myFile As String = filePath & "\" & fileName & fileExtension

        ' Open the file and write the headers
        Dim fs As New IO.StreamWriter(myFile, False)
        fs.WriteLine("<?xml version=""1.0""?>")
        fs.WriteLine("<?mso-application progid=""Excel.Sheet""?>")
        fs.WriteLine("<ss:Workbook xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"">")
        ' Create the styles for the worksheet
        fs.WriteLine("  <ss:Styles>")
        ' Style for the column headers
        fs.WriteLine("    <ss:Style ss:ID=""1"">")
        fs.WriteLine("      <ss:Font ss:Bold=""1""/>")
        fs.WriteLine("      <ss:Alignment ss:Horizontal=""Center"" ss:Vertical=""Center"" " & _
            "ss:WrapText=""1""/>")
        fs.WriteLine("      <ss:Interior ss:Color=""#C0C0C0"" ss:Pattern=""Solid""/>")
        fs.WriteLine("    </ss:Style>")
        ' Style for the column information
        fs.WriteLine("    <ss:Style ss:ID=""2"">")
        fs.WriteLine("      <ss:Alignment ss:Vertical=""Center"" ss:WrapText=""1""/>")
        fs.WriteLine("    </ss:Style>")
        fs.WriteLine("  </ss:Styles>")
        ' Write the worksheet contents
        fs.WriteLine("<ss:Worksheet ss:Name=""Sheet1"">")
        fs.WriteLine("  <ss:Table>")
        'Nastavit velikost pole
        For i As Integer = 0 To grdView.Columns.Count - 1
            If grdView.Columns(i).Visible = True Then
                fs.WriteLine(String.Format("    <ss:Column ss:Width=""{0}""/>", _
                grdView.Columns.Item(i).Width))
            End If
        Next
        fs.WriteLine("    <ss:Row>")
        'Nastavit popisek pole
        For i As Integer = 0 To grdView.Columns.Count - 1
            If grdView.Columns(i).Visible = True Then
                fs.WriteLine(String.Format("      <ss:Cell ss:StyleID=""1"">" & _
                    "<ss:Data ss:Type=""String"">{0}</ss:Data></ss:Cell>", _
                    grdView.Columns.Item(i).HeaderText))
            End If
        Next
        fs.WriteLine("    </ss:Row>")

        ' Check for an empty row at the end due to Adding allowed on the DataGridView
        Dim subtractBy As Integer, cellText As String
        If grdView.AllowUserToAddRows = True Then subtractBy = 2 Else subtractBy = 1
        ' Write contents for each cell
        For i As Integer = 0 To grdView.RowCount - subtractBy
            fs.WriteLine(String.Format("    <ss:Row ss:Height=""{0}"">", _
                grdView.Rows(i).Height))
            For intCol As Integer = 0 To grdView.Columns.Count - 1
                If grdView.Columns(intCol).Visible = True Then
                    cellText = grdView.Item(intCol, i).Value
                    ' Check for null cell and change it to empty to avoid error
                    If cellText = vbNullString Then cellText = ""
                    fs.WriteLine(String.Format("      <ss:Cell ss:StyleID=""2"">" & _
                        "<ss:Data ss:Type=""String"">{0}</ss:Data></ss:Cell>", _
                        cellText.ToString))
                End If
            Next
            fs.WriteLine("    </ss:Row>")
        Next
        ' Close up the document
        fs.WriteLine("  </ss:Table>")
        fs.WriteLine("</ss:Worksheet>")
        fs.WriteLine("</ss:Workbook>")
        fs.Close()

        ' Open the file in Microsoft Excel
        ' 10 = SW_SHOWDEFAULT
        ShellEx(Me.Handle, "Open", myFile, "", "", 10)
    End Sub

Musíš si ho upravit pro svůj dataGridView

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback