Diskuze: c# form - zjištění zda je v pc nainstalován excel
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Google:
c# is excel installed
1st result:
http://stackoverflow.com/…ists-on-a-pc
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();
}
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();
}
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.Office.Interop.Excel, 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.
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.Environment.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
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 ... ).
Doporucoval bich mene nasilne vypnuti aplykace - Hledal jsem to na internetu a je to prej nejlepsi spusob
Process.GetCurrentProcess().Kill()
Já bych ti zase doporučil, aby ses trošku naučil ten češtin...
Ahoj,
tak to jsem rád. Díky za pomoc a rady...
To si děláš snad srandu To je nejnásilnější způsob, který v C# existuje
Zobrazeno 13 zpráv z 13.