Excel-jména listů   zodpovězená otázka

SQL, Databáze, Office

Ahoj, mám 3 problémy se kterýma nemůžu pohnout:)

1) ve své aplikaci potřebuji do datagridViewu načítat data z excelu. To jsem vyřešil pomocí oleDB ale funguje to pouze za předpokladu že znám jméno listu ze kterého chci načítat. Nevíte zda je možné pomocí oleDb (nejspíše nějákým SQL dotazem poslaný na excel) zjistit jména listů? Funguje zde něco obdobného jako u SQL serveru kde když chci zjistit například seznam databází pošlu dotaz na master databázi?

Data načítám takto:

    Sub nactiData()


        Dim ExcelStrConnectionString As String = String.Empty
        Dim ExcelDataAdapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter
        Dim ExcelDataTable As DataTable = New DataTable
        Dim strFilePath As String


        form1.OpenFileDialog1.FileName = Nothing

        form1.OpenFileDialog1.Filter = "MS Excel (*.xls)|*.xls"
        form1.OpenFileDialog1.ShowDialog()

        If form1.OpenFileDialog1.FileName = Nothing Then Exit Sub
        strFilePath = form1.OpenFileDialog1.FileName


        Try
            ExcelStrConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFilePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
            Dim spojeni As OleDb.OleDbConnection = New OleDb.OleDbConnection(ExcelStrConnectionString)
            spojeni.Open()
            Dim dotaz As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM [List1$]", spojeni)
            ExcelDataAdapter.SelectCommand = dotaz
            ExcelDataAdapter.Fill(ExcelDataTable)
            frmAplikace.dgv4Import.DataSource = ExcelDataTable

        Catch ex As Exception
            chybaOtevreniExcelu(strFilePath)
            Exit Sub
        Finally
            spojeni.Close()
        End Try
    End Sub

2) Občas (ale nepodařilo se mi zatím zjistit kdy přesně) se mi stává že mi najednou jdou ručně otevřít všechny sešity v excelu jenom pro čtení. Nevím ale kde je chyba protože spojení zavírám. Nevíte čím by to mohlo být (resp. jak otevřít z VB sešit pouze pro čtení) ?

3) Jak provést SQL příkaz insert tak, aby mi z dataTable vložil data na SQL server? Příkaz

INSERT INTO testovaci_TB SELECT * FROM mojeDataTable

samozřejmě nefunguje protože příkaz hledá na SQL serveru tabulka se jmenem mojeDataTable která tam není. Jde vůbec insert se selectem v tomto případě použít, nebo budu muset tabulku v db plnit po řádcích tak, že si budu data z DataTable načítat např. do proměnných a ty budu posílat jako values na server?

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

add1, nevim o takovem dotazu, ktery by umel zjistit jmena listu v sesitu, budes ho muset otevrit a projit listy a ulozit si je napr. do pole ci kolekce.

Zmen si tady ten radek kodu - uzivatele E 2007 by meli smulu

form1.OpenFileDialog1.Filter = "MS Excel (*.xl*)|*.xl*"

viz. http://www.excelvba.estranky.cz/clanky/t...

o dalsich bodech nevim nic ...

Snad ti to pomuze

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

To je v pořádku, u nás ve firmě těch pár lidí co mají nové Office mají povinně nastavený režim kompatibility, takže soubory také ukládají jako XLS. Ale děkuji za upozornění:)

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

Bez záruky jen od boku, zkuste vypsat názvy listů a oblastí:

spojeni.Open()

Dim dt as DataTable
dt = spojeni.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)

V datatable by měly být listy a pojmenované oblasti připojeneho sešitu,názvy vypsat cyklem ze sloupce "TABLE_NAME".

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

Velmi děkuji výrazně jste mi pomohl:)

Kód je:

    Sub jmenaListu(ByVal strFilepath)

        Dim ExcelSpojeniSeznamListu As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFilepath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""")


        Dim Exceldt As DataTable = New DataTable
        ExcelSpojeniSeznamListu.Open()
        Exceldt = ExcelSpojeniSeznamListu.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, Nothing)
        ExcelSpojeniSeznamListu.Close()


        frmAplikace.dgv4Import.DataSource = Exceldt
    End Sub

Teď ještě vyřešit ten problém s otevíráním pouze pro čtení a zjistit jak se dá datatable poslat pomocí insert dotazu na tabulku v databázi:)

nahlásit spamnahlásit spam 0 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