Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Excel a C# do některé šablony na některých pc zapisuje neúměrně dlouho

Mam problem s hotovou aplikaci.
Na me vyvojarske masine funguje OK rychle.

Ale na jine masine s XP funguje silene dlouho!
V kodu je to okodovane jako //silene dlouho .

Zkratka program jakoby vytuhne na cca 1 minutu a nic nedela, nez se zobrazi dialog kam ulozit modifikovany soubor.
kod by mel otevrit Excelovsky soubor, zapsat do jedne bunky hodnotu a na uzivatelem zvolene umisteni adresarove cesty ulozit pozmeneny soubor.

Aplikace se zepta, kam ulozit soubor, ale pak prestane reagovat na minitu i dele.
Jaktoze je aplikace tak pomala?

Mozna je problem v sablone do ktere se zapisuje:

http://www.cpost.cz/assets/nastroje/uzitecne-infor mace/rck/Postovni_podaci_arch_nPA.xls

Protoze i na mem stroji mel program problem se zapisem do XLS souboru, musel jsem pouzit XLSX a teprve ten netuhne u me.
(Jinak pri obycejnem otevreni v Excelu varoval, ze jsou pouzity nejake zpetne nekompatibilni prvky)
Mozna pouziva sablona nestandardni znaky, protoze drive program zapisoval do jednodussiho souboru a to bylo bez problemu okamzite hotove!

string Path = @"c:\AVOX\PPAnew.xls";
            // initialize the Excel Application class
            // create the workbook object by opening  the excel file.
            Microsoft.Office.Interop.Excel.ApplicationClass app = null;
            try
            {
                app = new Microsoft.Office.Interop.Excel.ApplicationClass();
                // ... dalsi zpracovani ...
            }
            catch (Exception ex)
            {
                MessageBox.Show( ex.ToString() );

                
            }


            Microsoft.Office.Interop.Excel.Workbook workBook = app.Workbooks.Open(Path,
      0,
      true,
      5,
      "",
      "",
      true,
      Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
      "\t",
      false,
      false,
      0,
      true,
      1,
      0);

            

            
           
            //  Zapsani hodnoty do Excelu:
            // Toto trva silene dlouho !
            app.Cells[5, 2] = dateTimePicker1.Text;

           
            
            saveFileDialog1.DefaultExt = "xls";
            saveFileDialog1.Filter = "(*.xls)|*.xls";
            saveFileDialog1.Title = "Vytvořit Excelovský soubor... kde ...";

            object missing = System.Reflection.Missing.Value;


            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                workBook.SaveAs(saveFileDialog1.FileName, missing,
                missing, missing, missing, missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
                 missing, missing, missing, missing, missing);

                if (MessageBox.Show("Arch byl vytvořen. Přejete si jej otevřít teď?", "Otevřít dokument?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    try
                    {

                        app.Workbooks.Close();
                        app.Application.Quit();

                        Marshal.ReleaseComObject(app);
                        Marshal.ReleaseComObject(workBook);


                        app = null;
                        workBook = null;

                        GC.GetTotalMemory(false);
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
                        GC.GetTotalMemory(true);




                        Process p = new Process();
                        p.StartInfo.FileName = saveFileDialog1.FileName.ToString();
                        p.Start();
                        return;


                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }


                }


                //workBook.SaveCopyAs(saveFileDialog1.FileName);

            }




            // object missing = System.Reflection.Missing.Value;


            app.Workbooks.Close();
            app.Application.Quit();

            Marshal.ReleaseComObject(app);
            Marshal.ReleaseComObject(workBook);


            app = null;
            workBook = null;

            GC.GetTotalMemory(false);
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.GetTotalMemory(true);
}

Předmět Autor Datum
Update: Tak jsem zjistil, že na jiném pc s XP to jede bez problému. Problém bude asi zakopaný někde…
Flash_Gordon 10.09.2010 14:41
Flash_Gordon
Programátor nejsem, nicméně můžeš jít na řešení systémově. Procmon, bafnout terčík a upustit to na a…
kmochna 10.09.2010 14:52
kmochna
Tak uz je vyresena i otazka c.2.
Flash_Gordon 10.09.2010 16:11
Flash_Gordon
Super si povídáte, ale já to nemohu vytisknout, zkopírovat jinam se to nedá a tudíž je to pro laika…
LCK 03.02.2011 09:08
LCK
Co to?
Wikan 03.02.2011 11:37
Wikan
Co konkrétně potřebuješ? poslední
Flash_Gordon 03.02.2011 12:10
Flash_Gordon

Update:

Tak jsem zjistil, že na jiném pc s XP to jede bez problému.
Problém bude asi zakopaný někde na tom pc, kde to má jet.

Ale aby vás nemrzelo, že se vzdávám tohoto dotazu dám sem jiný dotaz, který se projevuje na všech XP mašinách.

Mam udelanou splash obrazovku behem spousteni aplikace.
Obcas se aplikace spusti bez chyby, ale obcas haze chybu.

Zde je kod splashe:

Trida splash:

namespace SplashScreen
{
    public partial class Splash : Form
    {
        public Splash()
        {
            InitializeComponent();
            Bitmap b = new Bitmap(this.BackgroundImage);
            b.MakeTransparent(b.GetPixel(1, 1));
            this.BackgroundImage = b;
        }

    }
}

Třída splash je vlastně (jak je patrno) jen formulář s nastavenou bitmapou na pozadí.

a zde je dalsi kod hlavniho formularoveho okna

public Form1()
        {
            Thread th = new Thread(new ThreadStart(DoSplash));
            th.Start();
            
            
            

            
            
            InitializeComponent();
            // Otevreni sablony
            comboBox1.Items.Add("Obyčejné psaní - standard");
            comboBox1.Items.Add("Obyčejné psaní");
            comboBox1.Items.Add("Doporučená zásilka - standard");
            comboBox1.Items.Add("Doporučená zásilka");
            comboBox1.Items.Add("Cenné psaní");
            comboBox1.Items.Add("Dodejka-červený pruh");
            th.Abort();    
            
        }
   
            

         

private void DoSplash()
        {
            Splash sp = new Splash();

            sp.ShowDialog();

        }

Vidite tady nejaky cross-thread problem?
Aplikace pracovala na 100% pred pridelanim toho splashe, takze tu chybu pri spusteni dela on.

Programátor nejsem, nicméně můžeš jít na řešení systémově. Procmon, bafnout terčík a upustit to na aplikaci(případně si filtr naškrábej sám- process name is xxx include) spustit aplikaci a potom zkontrolovat log, kde že se to chudák zasekl - nejčastější nešvary bývají not found (něco není- improvizuji) access denied (přístup zamítnut- hrabeš se kde nemáš). To můžeš ostatně vyzkoušet na obou aplikacích.

Zpět do poradny Odpovědět na původní otázku Nahoru