Killing Excel.exe på serveren

stemmer
11

Mulig Duplicate:
Hvordan skal rydde opp Excel interoperabilitets objekter i C #

Anta at en ASP.NET web-applikasjon genererer automatisk Excel rapporter på serveren. Hvordan kan vi drepe en server-side EXCEL.EXE når behandlingen er over. Jeg heve dette med vilje, fordi jeg tror at Garbage collecter ikke blir ren Excel kjør selv etter Excel-filen er lukket.

Noen tips ville være nyttig?

Publisert på 09/09/2008 klokken 07:31
kilden bruker
På andre språk...                            


14 svar

stemmer
2

Kommandoen du trenger er "taskkill".

http://technet.microsoft.com/en-us/library/bb491009.aspx

> taskkill excel.exe
Svarte 09/09/2008 kl. 07:35
kilden bruker

stemmer
3

Bruker du VSTO? Du kan lukke Excel app etter at du er ferdig med excelobject.Quit();det fungerte for meg, men jeg bruker ikke Excel på serversiden lenger.

Du kan ta en titt på Excel XML-skjema for å bygge Excel-filen uten Excel selv. Sjekk ut CarlosAg Excel Writer , som gjør akkurat det samme.

Svarte 09/09/2008 kl. 07:36
kilden bruker

stemmer
18

Beklager å si dette, og jeg prøver ikke å være smart, men ... ikke sette kontor på serveren !!!

Det er hvis jeg har forstått riktig! :)

EDIT: Selv om jeg har blitt markert ned for dette, vil jeg aldri noensinne talsmann kjører Office på serveren - det har vist seg altfor mye av en smerte i ræva for meg i det siste.

Når det er sagt, det samme nå gjelder for meg og Crystal Reports ;-)

Svarte 09/09/2008 kl. 07:36
kilden bruker

stemmer
2

:). Jeg noterte ned min trefning med Excel her . Det har også noen linker som jeg fant etter noen tunge søker. Håper det hjelper.
I utgangspunktet Excel er en smerte, selv om det kan automatiseres.

Svarte 09/09/2008 kl. 07:37
kilden bruker

stemmer
0

Du behøver trygt avhende alle COM interoperabilitets gjenstander etter at du avslutter arbeidet ditt. Med "alle" mener jeg absolutt alt : samlinger eiendomsverdier og så videre. Jeg har opprettet stabelen objekt og dyttet gjenstander under oppsett:

Stack<object> comObjectsToRelease = new Stack<object>();
...
Log("Creating VBProject object.");
VBProject vbProject = workbook.VBProject;
comObjectsToRelease.Push(vbProject);
...
finally
{
    if(excel != null)
    {
        Log("Quiting Excel.");
        excel.Quit();
        excel = null;
    }
    while (comObjectsToRelease.Count > 0)
    {
        Log("Releasing {0} COM object.", comObjectsToRelease.GetType().Name);
        Marshal.FinalReleaseComObject(comObjectsToRelease.Pop());
    }               
    Log("Invoking garbage collection.");
    GC.Collect();
}

Hvis Excel er fortsatt der du må drepe den manuelt.

Svarte 09/09/2008 kl. 07:51
kilden bruker

stemmer
0

Jeg hadde et lignende problem, og brukte følgende kode:

System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses();
for (int i = 0; i < procs.Length; i++)
{
  if(procs[i].ProcessName == "EXCEL")
  {
    procs[i].Kill();
  }
}

Dette fungerte ganske bra, men jeg ville virkelig tenke på å jobbe med Office på en server.

Svarte 09/09/2008 kl. 09:02
kilden bruker

stemmer
1

Jeg vil heller ikke anbefale å bruke kontor apps på serveren unntatt for datatilgang til MDB-filer.

Jeg kan definitivt forstå at det er tider hvor det er nødvendig. I thoses tilfeller vil jeg anbefale følgende:

  • Opprett en egen server der det er den eneste funksjonen. (La oss du omstart med minimal innvirkning).
  • Har serveren implementere en mekanisme for kø forespørsler
  • Hold en enkelt tråd behandlingen køen. Dette gir deg muligheten til å holde orden på kontoret app, drepe den om nødvendig, og fortsett på uten at noen kø jobber eller andre programmer.

Hvis du absolutt må gjøre det på samme server, så i hvert fall implementere de ovennevnte i sin egen app bassenget.

Begrense deg selv å holde en kø av arbeid og bare én forekomst av Excel (eller andre kontor app) lar deg drepe den med svikte med taskkill eller .Kill () og ikke miste arbeidet.

Jeg tror at hvis du holder det til en enkelt tråd da ville du sjelden har behov for å drepe den.

Svarte 09/09/2008 kl. 09:33
kilden bruker

stemmer
6

Jeg er enig med ikke kjører Office på en server. Ikke at jeg har noe valg i saken :)

En ting å huske på med taskkill alternativet, er at med mindre du spesifikt planlegge for det (aka - enkelt), kan du ha flere kopier av Excel (eller andre Office-app) kjører, og utilsiktet lukke feil instans.

Merk også at per http://support.microsoft.com/kb/257757

Microsoft har for tiden anbefaler, og støtter ikke, Automatisering av Microsoft Office-programmer fra noen uten tilsyn, ikke-interaktiv klientprogram eller komponent (inkludert ASP, ASP.NET, DCOM, og NT Services), fordi Styret kan vise ustabil atferd og / eller vranglås når Office kjøres i dette miljøet.

Som et alternativ, det er et produkt som kalles Aspose Celler som tilbyr et produkt som er utviklet for å tillate deg å programmatisk arbeide med et Excel-ark i et servermiljø. Som en ansvarsfraskrivelse, jeg har aldri selv brukt dette produktet, men jeg har hørt om det fra flere personer jeg jobbet med i det siste.

Svarte 09/09/2008 kl. 10:37
kilden bruker

stemmer
0

Jeg hadde faktisk et spørsmål som var lik dette en stund tilbake - Se etter hang Kontor prosessen når du bruker Office Automation - noen av svarene på det spørsmålet kan være nyttig for deg.

Også må jeg være enig med hva alle andre sier i forhold til å holde noen Office-produkter ut av en server, men siden du gjør Excel, kan det være mulig for deg å generere Excel XML-dokumenter . Du kan gjøre dette uten å måtte gjøre noe Kontor automatisering og prosessen er ganske grei. For enkle grid basert regneark har jeg funnet det å være litt enklere enn å prøve å automatisere den ved hjelp av Excel. The Office Open XML er ganske kraftig og gir mulighet for mer komplekse rapporter er mulig, samt litt mer innsats.

Svarte 09/09/2008 kl. 10:45
kilden bruker

stemmer
3

Jeg har hatt et lignende problem. Mens 'taskkill Excel.exe' eller opplisting alle "excel" prosesser og drepe dem fungerer, dreper dette alle kjører Excel prosesser. Du er bedre å drepe bare forekomsten du for tiden arbeider med.

Her er koden jeg brukte for å oppnå dette. Den bruker en PInvoke (se her ) for å få den ProcessID fra Excel.Application instans (Me.ExcelInstance i eksemplet nedenfor).

Dim ExcelPID As Integer
GetWindowThreadProcessId(New IntPtr(Me.ExcelInstance.Hwnd), ExcelPID)

If ExcelPID > 0 Then
   Dim ExcelProc As Process = Process.GetProcessById(ExcelPID)
   If ExcelProc IsNot Nothing Then ExcelProc.Kill()
End If

Vennligst ikke dette kanskje ikke fungerer på alle plattformer på grunn av PInvoke ... Til dags dato er dette den eneste metoden jeg har funnet å være pålitelig. Jeg har også prøvd å finne riktig PID ved enumarating alle Excel prosesser og sammenligne Process.MainModule.BaseAddress til Excel.Application.Hinstance.

'DO NOT USE THIS METHOD, for demonstration only    
For Each p as Process in ExcelProcesses
        Dim BaseAddr As Integer = p.MainModule.BaseAddress.ToInt32()
        If BaseAddr = Me.ExcelInstance.Hinstance Then
            p.Kill()
            Exit For
        End If
Next

Dette er ikke en pålitelig måte å finne den riktige prosessen, som BaseAddress noen ganger synes å være den samme for flere prosesser (som resulterer i å drepe feil PID).

Svarte 23/11/2008 kl. 11:23
kilden bruker

stemmer
1

Jeg har brukt spreadsheetgear å generere XL rapporter på serveren, og det fungerer veldig bra. Vi trenger ikke å bekymre deg for Excel prosessen ..

Svarte 12/12/2008 kl. 18:19
kilden bruker

stemmer
0

Jeg har funnet en fantastisk løsning på denne linken: http://www.antionline.com/showthread.php?t=277640

Det virkelig jobbet for meg.

Svarte 25/02/2009 kl. 09:00
kilden bruker

stemmer
4

Jeg har hatt mer tid til å tenke på dette svaret, og vil nå anbefale å bruke en XML-tilnærming med Open XML Kontor regnearkformat.

Her er noen gode linker å komme i gang med å bygge et kontor dokument med kode. http://msdn.microsoft.com/en-us/magazine/cc163478.aspx http://msdn.microsoft.com/en-us/library/bb735940(office.12).aspx

Bare bruk SSIS på SQL Server. Det gir muligheten til å eksportere til Excel. Ikke kjør kontor på serveren. Alteranatively kaste bort penger på Aspose eller spreadsheetgear.

GC fungerer din bare ikke bruke det riktig å følge dette mønsteret ...

   private void killExcel()
        {
          xlApp.Quit();
          Marshal.ReleaseCOMObject(xlApp);
          if(xlApp != null)
          {
            xlApp = null;
          }
          GC.WaitForPendingFinalizers();
          GC.Collect();
          GC.WaitForPendingFinalizers();
          GC.Collect();
        }

få Excel operasjonell klasse å implementere IDisposable, og så holde killExcel () i Kvitt metoden.

OPPDATERING: Merk også at noen ganger dev vil fortsatt se Excel.exe kjører i Oppgavebehandling. Før antar koden ovenfor ikke fungerer, må du kontrollere at prosessen som kjører koden er også stengt. I tilfelle av en VSTO eller COM-tillegg, kontrollere at Word / PowerPoint / annet utmerke seg eksempelvis også er lukket så er det fortsatt et GC rot tilbake til utskytnings prosessen. Når det er lukket Excel.exe prosessen vil lukke.

Svarte 20/08/2009 kl. 21:30
kilden bruker

stemmer
0

Den beste tilnærmingen er å bruke en spesialbygd bibliotek slik som den fra Aspose å generere regneark eller fylle maler. Den nest beste tilnærmingen er å bruke XML-formater for kontoret hvis praktisk for dine behov. En lett tilnærming som noen ganger er egnet er å skape en HTML-fil med en tabell i det og gi det et navn med en XLS forlengelse. Excel vil gjerne lese det, men det er svært begrenset i hva den kan gjøre.

De er de alternativene jeg har brukt (men ikke mye). Det er også en ting som heter Microsoft Office Sharepoint Server, men jeg har ingen anelse om hvor mye det virkelig lar deg gjøre.

Når det er sagt, problemet skjer fordi når du starter den vanlige Excel bibliotekene, er du faktisk spinner opp Excel helt uavhengig av Net og faktisk bare jobbe med en proxy bibliotek for å snakke med den. Dette er ganske mye det samme type ting du vil ha med WCF og en tjeneste. Du ville ikke forvente at tjenesten skal dø bare fordi klientprogrammet ble gjort ved hjelp av det. Enda verre, er Excel en ikke-regulert ressurs, og vil ikke bli avhendet / avsluttet / søppel samles i det hele tatt. The Net Runtime vet ikke om Excel, det bare vet om de fullmakter. Application.quit er hva du trenger, og også du kan ha behov for å eksplisitt frigjøre COM-objekter som er opprettet.

Svarte 14/10/2010 kl. 16:44
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more