NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Michaal.K
Člen
Avatar
Michaal.K:2.5.2016 12:52

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.5.2016 12:52
Avatar
Odpovídá na Michaal.K
Neaktivní uživatel:2.5.2016 12:55

Google:
c# is excel installed

1st result:
http://stackoverflow.com/…ists-on-a-pc

Nahoru Odpovědět
2.5.2016 12:55
Neaktivní uživatelský účet
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Neaktivní uživatel
Michaal.K:3.5.2016 16:21

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.5.2016 16:21
Avatar
Odpovídá na Michaal.K
Neaktivní uživatel:4.5.2016 12:19

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

Nahoru Odpovědět
4.5.2016 12:19
Neaktivní uživatelský účet
Avatar
Odpovídá na Michaal.K
Neaktivní uživatel:4.5.2016 12:22

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.5.2016 12:23
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
4.5.2016 12:22
Neaktivní uživatelský účet
Avatar
Honza
Člen
Avatar
Honza:4.5.2016 12:59

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.5.2016 12:59
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Neaktivní uživatel
Michaal.K:4.5.2016 15:04

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.5.2016 15:04
Avatar
hj.masek
Člen
Avatar
hj.masek:5.5.2016 9:23

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
5.5.2016 9:23
Avatar
Odpovídá na Michaal.K
Neaktivní uživatel:5.5.2016 22:58

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
5.5.2016 22:58
Neaktivní uživatelský účet
Avatar
XtreemProgrammer_69:6.5.2016 11:00

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

Process.GetCurrentProcess().Kill()
 
Nahoru Odpovědět
6.5.2016 11:00
Avatar
Odpovídá na XtreemProgrammer_69
Michal Štěpánek:6.5.2016 12:51

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

Nahoru Odpovědět
6.5.2016 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 Neaktivní uživatel
Michaal.K:6.5.2016 14:26

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

 
Nahoru Odpovědět
6.5.2016 14:26
Avatar
Odpovídá na XtreemProgrammer_69
Neaktivní uživatel:6.5.2016 18:31

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.5.2016 18:31
Neaktivní uživatelský účet
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.