Diskuze: c# form - zjištění zda je v pc nainstalován excel

C# .NET .NET (C# a Visual Basic) c# form - zjištění zda je v pc nainstalován excel American English version English version

Avatar
Michaal.K
Člen
Avatar
Michaal.K:

Ahoj,
ve svém programu používám excel (otevírám ho, čtu z něj a ukládám do něj hodnoty) a teď bych potřeboval na začátku programu zjistit, že je excel nainstalován, pokud ne tak mi program vyhodí chybovou hlášku a ukončí se. Nebo nějaké podobné ošetření, že excel není dostupný...
Jinak používám knihovnu Microsoft.Offi­ce.Interop.Ex­cel, kterou jsem si přidal do References.
Díky moc za rady....

 
Odpovědět 2. května 12:52
Avatar
Jiří Gracík
Redaktor
Avatar
Nahoru Odpovědět  +1 2. května 12:55
Creating websites is awesome till you see the result in another browser ...
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Jiří Gracík
Michaal.K:

Ahoj, díky za info. Testování přítomnosti excelu v pc z toho odkazu funguje.
Ještě jsem se chtěl zeptat potřebuji to testování provést někde úplně na začátku programu. Práci s excelem mám ve třídě ExcelFile takže bych to potřeboval testovat ještě před tím než udělám: private ExcelFile excelWriter = new ExcelFile(); a to nevím jak.
Zatím testování přítomnosti excelu mám v metodě MainFormLoad a to na pc kde není nainstalován excel nefunguje, nevyhodí to žádnou chybovou hlášku a program se ani nespustí..
Díky za pomoc

CommConfig databazePristroju = CommConfig.Instance;
Communication comm = Communication.Instance;
private ExcelFile excelWriter = new ExcelFile();            // zapisovac do excel souboru

public MainForm()
{
    InitializeComponent();
    UpdateForm();
    comm.OnSerialDataReceived += new Communication.DataReceivedEventHandler(comm_OnSerialDataReceived);
    excelWriter.OnSheetChange += new ExcelFile.WorkbookEvents_SheetChangeEventHandler(excelWriter_OnSheetChange);
}

void MainFormLoad(object sender, EventArgs e)
{
    Type officeType = Type.GetTypeFromProgID("Excel.Application");
    if (officeType == null)
    {
        MessageBox.Show("V počítači není nainstalován MS Excel. Aplikace bude ukončena!", MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        this.Close();                               // Konec aplikace
    }
    UpdateForm();
}
 
Nahoru Odpovědět 3. května 16:21
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Michaal.K
Jiří Gracík:

To na Macu úplně nevyzkouším, je mi líto :)

Nahoru Odpovědět 4. května 12:19
Creating websites is awesome till you see the result in another browser ...
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Michaal.K
Jiří Gracík:

Jo aha, ty voláš konstruktor ExcelWriteru přímo u proměnné excelWriter, takže se vytvoří mnohem dřív než vůbec otestuješ, jestli je excel nainstalovaný. Zkus to takhle:

CommConfig databazePristroju = CommConfig.Instance;
Communication comm = Communication.Instance;
private ExcelFile excelWriter;            // zapisovac do excel souboru

public MainForm()
{
    InitializeComponent();
    UpdateForm();
    comm.OnSerialDataReceived += new Communication.DataReceivedEventHandler(comm_OnSerialDataReceived);
    excelWriter.OnSheetChange += new ExcelFile.WorkbookEvents_SheetChangeEventHandler(excelWriter_OnSheetChange);
}

void MainFormLoad(object sender, EventArgs e)
{
    Type officeType = Type.GetTypeFromProgID("Excel.Application");
    if (officeType == null)
    {
        MessageBox.Show("V počítači není nainstalován MS Excel. Aplikace bude ukončena!", MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        this.Close();                               // Konec aplikace
    }
    excelWriter = new ExcelFile();
    UpdateForm();
}
Editováno 4. května 12:23
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 4. května 12:22
Creating websites is awesome till you see the result in another browser ...
Avatar
Honza
Člen
Avatar
Honza:

Ahoj, dovolím si menší offtopic :) Nevím co přesně s Excelem všechno potřebuješ dělat, ale pokud to je jen čtení/zápis dat, doporučoval bych zvážit možnost nepoužívat Microsoft.Offi­ce.Interop.Ex­cel, ale místo toho použit nějakou externí knihovnu kterou přibalíš k programu. Mně se pro zápis do Excelu osvědčila knihovna ClosedXML.

Tahle knihovna umí vygenerovat Excelový soubor aniž by bylo nutné mít nainstalovaný Excel na daném PC. A pokud bys např. potřeboval generovat větší množství Excelů, pomocí této knihovny to bude řádově rychlejší, než když to budeš dělat přes Interop.

Další problém kterému se vyhneš je případné nekompatibilita mezi verzemi office, to byl důvod proč jsem Interop přestal používat já. Jednou mi to dokonce začalo padat i po nainstalování update do Office. Nevím ale jak je na tom tahle knihovna kdybys chtěl programově dělat třeba grafy nebo kontingenční tabulky, to jsem nezkoušel.

Nahoru Odpovědět 4. května 12:59
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Jiří Gracík
Michaal.K:

Ahoj,
díky moc to už to funguje. Ještě mě napadlo jestli by nebylo lepší dát to testování do konstruktoru, ale tam mi nejde ukončit formulář přes this.Close() protože formulář ještě není vytvořen. Ještě testuji zda tam jsou nějaké sériové porty, tak jsem ty testy chtěl udělat ještě před přidáním událostí pro sériovou linku a excel.
Tak jsem to udělal takto a ukončuji aplikaci přes System.Environ­ment.Exit(0);:

CommConfig databazePristroju = CommConfig.Instance;
Communication comm = Communication.Instance;
private ExcelFile excelWriter;                              // zapisovac do excel souboru

public MainForm()
{
    InitializeComponent();

    var portNames = SerialPort.GetPortNames();
    if (!(portNames.Count() > 0))
    {
        MessageBox.Show("Počítač neobsahuje žádné sériové porty. Aplikace bude ukončena!", MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        System.Environment.Exit(0);
    }

    Type officeType = Type.GetTypeFromProgID("Excel.Application");
    if (officeType == null)
    {
        MessageBox.Show("V počítači není nainstalován MS Excel. Aplikace bude ukončena!", MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        System.Environment.Exit(0);
    }
    excelWriter = new ExcelFile();                  // Vytvoreni noveho zapisovace do excel souboru
    UpdateForm();

    comm.OnSerialDataReceived += new Communication.DataReceivedEventHandler(comm_OnSerialDataReceived);
    excelWriter.OnSheetChange += new ExcelFile.WorkbookEvents_SheetChangeEventHandler(excelWriter_OnSheetChange);
}

ale je to násilné vypnutí aplikace, tak nevím jestli to je to pravé. Co myslíš? Nebo je blbost to dávat do konstruktoru? Díky

 
Nahoru Odpovědět 4. května 15:04
Avatar
hj.masek
Člen
Avatar
hj.masek:

Nastav jen nejakou promennou bool a pak si pridej udalost form_shown a pokud ta podminka je napr true tak tam zavolej close (forma v eventu shown uz je vytvorena)

 
Nahoru Odpovědět  -1 5. května 9:23
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Michaal.K
Jiří Gracík:

Není to nijak násilné, řekne to všem vláknům a oknům, aby se zavřeli. Nevypadá to, že bys v aplikaci před tím něco začal dělat, takže je to naprosto v pořádku. Je tu pár věcí zbytečně (první podmínka a zbytečně přiřazování do proměnné), ale o to se nejspíš postará optimalizace v kompilátoru.

public MainForm()
{
    InitializeComponent();

    var portNames = SerialPort.GetPortNames();
    if ( portNames.Count() == 0 )
    {
        MessageBox.Show( "Počítač neobsahuje žádné sériové porty. Aplikace bude ukončena!", MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error );
        Application.Exit( 0 );
    }

    if ( Type.GetTypeFromProgID( "Excel.Application" ) == null )
    {
        MessageBox.Show( "V počítači není nainstalován MS Excel. Aplikace bude ukončena!", MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error );
        Application.Exit( 0 );
    }
    excelWriter = new ExcelFile();                  // Vytvoreni noveho zapisovace do excel souboru
    UpdateForm();

    comm.OnSerialDataReceived += new Communication.DataReceivedEventHandler( comm_OnSerialDataReceived );
    excelWriter.OnSheetChange += new ExcelFile.WorkbookEvents_SheetChangeEventHandler( excelWriter_OnSheetChange );
}

U chyb a podobných věcí je fajn člověku nenapsat s vykřičníkem že se vypneš. Správně tam máš důvod proč to nemůže pokračovat, ale ještě je ideální říct, co má udělat (nainstalujte prosím Microsoft Excel, připojte zařízení na sériový port ... ).

Nahoru Odpovědět  +1 5. května 22:58
Creating websites is awesome till you see the result in another browser ...
Avatar
XtreemProgrammer_69:

Doporucoval bich mene nasilne vypnuti aplykace - Hledal jsem to na internetu a je to prej nejlepsi spusob

Process.GetCurrentProcess().Kill()
 
Nahoru Odpovědět  -3 6. května 11:00
Avatar
Odpovídá na XtreemProgrammer_69
Michal Štěpánek:

Já bych ti zase doporučil, aby ses trošku naučil ten češtin...

Nahoru Odpovědět  +1 6. května 12:51
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Jiří Gracík
Michaal.K:

Ahoj,
tak to jsem rád. Díky za pomoc a rady...

 
Nahoru Odpovědět 6. května 14:26
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na XtreemProgrammer_69
Jiří Gracík:

To si děláš snad srandu :D To je nejnásilnější způsob, který v C# existuje :D :D

Nahoru Odpovědět 6. května 18:31
Creating websites is awesome till you see the result in another browser ...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.