Excel 2010 se nechce otevřít   zodpovězená otázka

VB.NET, Office

Mám Win7 (64bit) ,MS Office 2010 a VB.NET2010.

Pokouším se otevřít Excel z verze 2007.

V referencích projektu mám připojen COM Microsoft Excel 14.0 Object Library ver. 1.7.0.0

V modules1 pak toto:

Imports System.IO
Imports System.Data
Imports System.Data.OleDb
Imports ADODB
Imports Microsoft.Office
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Excel
Imports System.Threading
Imports System.Globalization
Module Module1
    Public JmenoCestyXLS As String
    Public SouborExcel As String
    Public JmenoDatabaze As String
    Public CestaKmdb As String
    Public JmenoTab As String
    Dim myExcel As Excel.Application
 Public Sub Vypocet()
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US") '<-- change culture on whatever you need        'Deklarace a vytvoření objektu excelu:
        Dim myExcel As New Excel.Application
        Dim xlBook As New Excel.Workbook
        Dim oSheet As Excel.Worksheet
...

Za běhu se program zastaví na řádku Dim xlBook As New Excel.Workbook s touto chybou:

System.Runtime.InteropServices.COMException was unhandled

ErrorCode=-2147221164

HResult=-2147221164

Message=Načítání objektu pro vytváření tříd modelu COM pro komponentu s identifikátorem CLSID {00020819-0000-0000-C000-000000000046} se nezdařilo kvůli následující chybě : 80040154 Třída není zaregistrována (Výjimka na základě hodnoty HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Není ten problém způsoben tou verzí COM componenty že se nehodí k MS office 2010?

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

Když máte přidané reference na verzi 2010 tak snad nečekáte, že to poběží na systému, kde je nainstalovaná verze 2007?!

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

Asi jste mne nepochopil.

Cílem není otevřít aplikaci Excel 2007 na stroji kde není nainstalován, ale v aplikaci Excel 2010 otevřít soubor ve formátu XLS tj. nižší verze (v režim kompatibility). Soubor dostávám z jiného stroje, kde je Excel 2007, a na stroji kde jej chci zpracovat je Excel 2010. Přes Excel 2010 dodaný soubor XLS normálně otevřu.

Jestli se nemýlím, tak ve chvíli, kdy to spadne, ještě VB nic neví o tom s jakým souborem budu pracovat. Předpokládám tedy že Excel.Application se pokouší otevřít aplikaci která je na stroji nainstalovaná. Pak chce použít Excel.Workbook a zde narazím.

Mimochodem, pokud budu hotovou aplikaci přenášet na jiný stroj, který může mít jinou verzi Excelu, nenarazím na problém?

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

Dobrý den, jen pro upřesnění XLS je Excel 2003. Verze 2007 má už XLSX. Nicméně v tom by problém být neměl, mělo by to fungovat protože verze Office jsou zpětně kompatibilní. Není ten sešit nějak poškozen? Zkoušel jste použít i jiný?

K Vaší druhé otázce: ano na problém narazíte. Když jsem dělelal pro jednoho klienta aplikaci která měla exportovat data do excelu, dal jsem si jako minimální požadavek excel 2003. Problémy však nastaly i v případě, kdy na některých strojích nebyl service pack pro Office nebo určitý update - tzn. některé knihovny byly ve starší verzi než na stroji na kterém jsem aplikaci vyvíjel.

Částečně se to vyřešilo přibalením některých knihoven k aplikaci, ale pokud můžete, provádějte export třeba do CSV.

Pokud je požadavek použít excel (což bývá bohužel poměrně často) a máte jistotu že na všech strojích bude určitá verze, tak je to ok (jen počítejte s tím že budou potřeba nějaké úpravy až se např. přejde na jinou verzi office).

Pokud prostředí není jednotné, zvažoval bych použití nějaké knihovny třetí strany, kdy to pak bude fungovat i bez nainstalovaných office.

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

a) Moje teorie, že program spadne ještě v momentě kdy neví jaký soubor bude zpracovávat není správná, že se ptáte jestli je soubor v pořádku?

Aplikace totiž až dále v programu bude procházet zadaný adresář kde jsou umístěny XLS a postupně bude otevírat zde umístěné soubory a některé jejich buňky natáhne do jedné access tabulky.

b) Myslel jsem si, že tím, že se udělá ve VB 2010 instalační soubor, tak se k ní připojí potřebné COM, DLL a podobně automaticky. Při instalaci na nový stroj si je na ten nový stroj doplní a není problém. Teoreticky by na tom stroji MS Office nemusel být instalován vůbec, protože knihovny dodám já. Tak to není?

c) Zmiňujete produkty třetích stran. Máte něco konkrétního na mysli?

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

Otevřete-li soubor starší verze z novější verze

excelu, nezobrazí se náhodou nějaká hláška, že

se bude soubor převádět či tak něco ?

Přímo z excelu soubor přece otevřete, že?

Možná zkuste ještě vypnout excelu hlášky:

myExcel.DisplayAlerts= False

...

Avšak lze na to jít i trochu jinak a navíc

bez nutnosti použití excel aplikace.

Vyzobávat data z excelu lze také pomocí OleDb,

dobré mít data rozumně seskupena, ale lze číst

i buňky dle jejich adresy i pojmenované oblasti.

Takhle se připojíte:

Dim cn As OleDbConnection
cn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" + "data source=C:\book.xls;Extended Properties=Excel 8.0;")

Případně koukněte ještě sem ohledně připojení...

ConnectionStrings for Excel :

http://www.connectionstrings.com/excel

http://www.connectionstrings.com/excel-2...

Takle např. dostat list do datatable:

Dim command As New OleDb.OleDbCommand
command.Connection = cn
command.CommandText = "SELECT  * FROM [List1$]" 
Dim dt As New DataTable 
dt.Load(command.ExecuteReader(CommandBehavior.CloseConnection)

Postupně se připojíte na všechny sešity excelu v adresáři,

jednotlivé tabulky za každý sešit lze vložit do datasetu,

potom data z jednotlivých datatables seskupit či poskládat

dle vlastního uvážení, pak nakonec se připojíte k access db

a vložíte získaná data do access tabulky insert commandem...

Trváte-li na otvírání excel aplikace, omluva za nevyžádaný návrh.

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

Děkuji.

Na otvírání excel aplikace netrvám. Akorát že tady se již pohybuji na tenkém ledě. Je to moje první aplikace v .NET a ještě se v tom kdy použít "As new" a kdy stačí jen "As" nebo v pojmech "dataset", "datatable" moc nevyznám.

Pokud použiji na připojení k sešitu Excelu vámi navrhované OleDb, tak je jedno jakou verzi MS Office mám nainstalovanou a jakou bude používat uživatel?

Zkusím se do toho pustit. Uvidím kam dojdu.

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

s timhle pozor

Dim cn As OleDbConnection

cn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" + "data source=C:\book.xls;Extended Properties=Excel 8.0;")

to nefunguje na w7 64 bit

takze pokud chcete jit touhle cestou tak http://www.microsoft.com/en-us/download/...

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

podle me by to melo byt bez toho new

Dim xlBook As Excel.Workbook

novy dokument

xlbook = xlApp.Workbooks.Add(.... "\ReportTemplate.xls")

nebo otevrit z disku

xlApp.Workbooks.Open (strFileName,,,"password")

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

Microsoft Access Database Engine Redistributable

se mi vůbec nepovedlo na w7 64bit naistalovat..

Též byla snaha jít touto cestou, problém zřejmě

nějak souvisí s verzí MS Office vs 32bit/64bit.

Vám to funguje?

Připojení access db provider=Microsoft.Jet.OLEDB.4.0

na w7 64bit mi funguje po zdejším tipu s vynucením

kompilace 32bit(x86).

... ale jak to bude s připojením excel ?

Budou všechna pc, kde to má běžet 64bit?

Stejné win? Jaké verze MS Office?

Bude milé se dozvědět na čem připojení jde

a kde nejde. Příp. jak pořešit dle verze.

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

Sice mám Win 7 64 bit, ale při instalaci MS Office 2010 důrazně MS nedoporučoval instalovat MS office v 64 bit. Tak je mám instalovány jak 32 bit aplikaci.

S tím Microsoft Access Database Engine jsem nejprve stáhl 64 bit verzi, ale hlásil že nelze, protože mám 32 bit Office. Po stažení 32 bit instalace toho engine mi instalace už proběhla bez problémů.

Nahradit providera z Jet na Microsoft.ACE.OLEDB.12.0 jsem ještě nezkoušel, takže vlastně nevím jestli instalace toho Engine byla u mne nutná.

Na zkušenosti z běhu aplikace na jiných strojích budete muset počkat. Ještě nejsem tak daleko abych to přenášel na jiný stroj. Ale má to být pouze na jeden notebook.

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

jo funguje office je 32 bit vsude a ten Microsoft Database Engine 32/64 podle windowsu. 64bitova verze MADE se musi instalovat s argumentem /passive.

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

Zkouším váš postup OleDB:

Dim cn As OleDb.OleDbConnection 
cn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" + "data source=" + JmenoCestyXLS + "/" + SouborExcel + ";Extended Properties=Excel 8.0;")
                
                Dim command As New OleDb.OleDbCommand
                command.Connection = cn
                command.CommandText = "SELECT  * FROM [List1$]"
                Dim dt As New System.Data.DataTable
                dt.Load(command.ExecuteReader(CommandBehavior.CloseConnection))
                

Na posledním řádku píše: Executereader vyžasduje otevřený a dostupný element Connection. Aktuální stav je zavřeno.

Poradíte něco?

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

Přidal jsem řádek cn.open()před command.Connection a již kód proběhne.

Psal jste že: "...lze číst i buňky excelu dle jejich adresy." Jak takový SELECT vypadá když chci zjistit obsah buněk D2,E2 a F2 na Listu1?

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

Jak takový SELECT vypadá když chci zjistit

obsah buněk D2,E2 a F2 na Listu1?

SELECT * FROM [List1$D2:F2]

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

Používám tento vámi doporučovaný kod:

Dim command As New OleDb.OleDbCommand
command.Connection = cn
command.CommandText = "SELECT  * FROM [List1$B34:E43]" 
Dim dt As New DataTable 
dt.Load(command.ExecuteReader(CommandBehavior.CloseConnection)

Ve sloupci B jsou čísla ale někdy string(jde o číslo zakázky). Pak mi to občas vyhodí chybu "Vstupní řetězec nemá správný formát.Hodnotu <D> nelze uložit do sloupce zak#číslo. Očekávaný typ: Double".

Pokud bych chtěl aby do tabulky první sloupec ukládal obsah buňky ve tvaru string a čtvrtý sloupec jako číslo, jsem to schopen nějak definovat?

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

Ať je problém z jakéhokoliv důvodu, vámi výše popisovaná chyba je způsobená absencí COM rozhraní příslušné verze. Napravte nejdřív to a potom se můžeme bavit dál.

Mimochodem, pokud budu hotovou aplikaci přenášet na jiný stroj, který může mít jinou verzi Excelu, nenarazím na problém?

Pokud jste pochopil co jsem psal v minulém příspěvku, pak vám odpověď musí být jasná.

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

Bohuže jsem to asi nepochopil.

Použité COM Microsoft Excel 14.0 Object Library ver. 1.7.0.0 patři k jaké verzi MS Office, jak to zjistím?

Na systému jsem měl nainstalované MS Office 2007, které jsem upgradoval na MS Office 2010.

Chyba je tedy v tom že

a) použité COM Microsoft Excel 14.0 Object Library ver. 1.7.0.0 není pro nainstalovanou verzi Office 2010 ale pro nižší,

b) nebo v tom že COM sice souhlasí s nainstaloavanou aplikací ale očekává soubor z Office 2010 a přijde soubor z Office 2007?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Krucinál vy se do něčeho pouštíte a vůbec nevíte, která bije?!

Zaprvé si zjistěte verzování sady Office:

http://en.wikipedia.org/wiki/Microsoft_O...

Zadruhé si zjistěte, jak je to s COM objekty a kompatibilitou mezi jejich různými verzemi. Dospějete k tomu, že různé verze stejného COM rozhraní nejsou vzájemně kompatibilní. Tato problematika se už zde řešila a ideální způsob je použít CreateObject, čímž se lze zbavit pevné vazby na konkrétní verzi COM objektu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ideální je odladit s referencí na aktuální verzi excelu,

získat tím intellisense během tvorby programu, až potom

referenci odstranit a nahradit CreateObject.

CreateObject je zaručený tip zdejšího guru, bude fungovat universálně při vytváření objektu aplikace Excel.

Jak s připojením k excelu přes OleDb, existuje

universální ovladač bez ohledu na verzi souboru?

Bude nutné nějak reagovat např. podle připony,

je-li *.xls či *.xlsx a měnit providera?

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

Již jsem se vydal jinou cestou řešení (přes OLEDB) ale přesto jsem studoval problematiku sestavení COM. Zkusím ještě jednou.

Na odkazu http://msdn.microsoft.com/cs-cz/library/... je že k MS Office 2010 (uvádějí ji jako Office 14) patří verze COM objektů 14. Píší tam ale o Microsoft.Office.Interop.Excel.dll, který je při přidávání referenci na záložce NET. Já použil referenci ze záložky COM.

Stále si ale myslím, že mnou použitá verze Microsoft Excel 14.0 Object Library odpovídá verzi kterou mám na PC nainstalováno.

Nejde tedy místo o číslo verze o to, jestli jsem použil referenci Interop nebo tu druhou?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Proboha pane, nastudujte si ty základy... Knihovnu *Interop*.dll automaticky vytvoří Visual Studio při přidání reference na libovolný COM objekt, abyste měl komfort IntelliSense!!!

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