Saya sedang menulis aplikasi di C # yang membuka file template Excel untuk operasi baca / tulis. Saya ingin ketika pengguna menutup aplikasi, proses aplikasi excel telah ditutup, tanpa menyimpan file excel. Lihat Task Manager saya setelah beberapa kali menjalankan aplikasi.
Saya menggunakan kode ini untuk membuka file excel:
public Excel.Application excelApp = new Excel.Application();
public Excel.Workbook excelBook;
excelBook = excelApp.Workbooks.Add(@"C:/pape.xltx");
dan untuk akses data saya menggunakan kode ini:
Excel.Worksheet excelSheet = (Worksheet)(excelBook.Worksheets[1]);
excelSheet.DisplayRightToLeft = true;
Range rng;
rng = excelSheet.get_Range("C2");
rng.Value2 = txtName.Text;
Saya melihat pertanyaan serupa di stackoverflow seperti pertanyaan ini dan ini , dan menguji jawaban, tetapi tidak berhasil.
c#
excel
visual-studio-2012
excel-interop
kill-process
Javad Yousefi
sumber
sumber
Jawaban:
Coba ini:
excelBook.Close(0); excelApp.Quit();
Saat menutup buku kerja, Anda memiliki tiga parameter opsional:
Workbook.Close(false)
atau jika Anda melakukan penjilidan terlambat, terkadang lebih mudah menggunakan nol.Workbook.Close(0)
Begitulah cara saya melakukannya saat mengotomatiskan penutupan buku kerja.Juga saya pergi dan mencari dokumentasi untuk itu, dan menemukannya di sini: Tutup Buku Kerja Excel
Terima kasih,
sumber
xlBook.Save(); xlBook.Close(true); xlApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
coba ini .. berhasil untuk saya ... Anda harus melepaskan objek aplikasi xl itu untuk menghentikan proses.
sumber
Ref: https://stackoverflow.com/a/17367570/132599
Ini menyelesaikan masalah saya. Kode Anda menjadi:
public Excel.Application excelApp = new Excel.Application(); public Excel.Workbooks workbooks; public Excel.Workbook excelBook; workbooks = excelApp.Workbooks; excelBook = workbooks.Add(@"C:/pape.xltx"); ... Excel.Sheets sheets = excelBook.Worksheets; Excel.Worksheet excelSheet = (Worksheet)(sheets[1]); excelSheet.DisplayRightToLeft = true; Range rng; rng = excelSheet.get_Range("C2"); rng.Value2 = txtName.Text;
Dan kemudian lepaskan semua objek itu:
System.Runtime.InteropServices.Marshal.ReleaseComObject(rng); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets); excelBook .Save(); excelBook .Close(true); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks); excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
Saya membungkus ini
try {} finally {}
untuk memastikan semuanya dibebaskan bahkan jika ada yang salah (apa yang mungkin salah?) Mispublic Excel.Application excelApp = null; public Excel.Workbooks workbooks = null; ... try { excelApp = new Excel.Application(); workbooks = excelApp.Workbooks; ... } finally { ... if (workbooks != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks); excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); }
sumber
Pikirkan ini, itu membunuh proses:
System.Diagnostics.Process[] process=System.Diagnostics.Process.GetProcessesByName("Excel"); foreach (System.Diagnostics.Process p in process) { if (!string.IsNullOrEmpty(p.ProcessName)) { try { p.Kill(); } catch { } } }
Juga, apakah Anda mencoba menutupnya secara normal?
myWorkbook.SaveAs(@"C:/pape.xltx", missing, missing, missing, missing, missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); excelBook.Close(null, null, null); // close your workbook excelApp.Quit(); // exit excel application excel = null; // set to NULL
sumber
Membunuh Excel tidak selalu mudah; lihat artikel ini: 50 Cara Membunuh Excel
Artikel ini mengambil saran terbaik dari Microsoft ( Artikel Dasar Pengetahuan MS ) tentang cara membuat Excel berhenti dengan baik, tetapi juga memastikannya dengan menghentikan proses jika perlu. Saya suka parasut kedua.
Pastikan untuk menutup semua buku kerja yang terbuka, keluar dari aplikasi dan lepaskan objek xlApp. Terakhir periksa untuk melihat apakah prosesnya masih hidup dan jika demikian maka matikan.
Artikel ini juga memastikan bahwa kami tidak menghentikan semua proses Excel tetapi hanya menghentikan proses persis seperti yang telah dimulai.
Lihat juga Mendapatkan Proses dari Tuas Jendela
Berikut kode yang saya gunakan: (berfungsi setiap saat)
Sub UsingExcel() 'declare process; will be used later to attach the Excel process Dim XLProc As Process 'call the sub that will do some work with Excel 'calling Excel in a separate routine will ensure that it is 'out of scope when calling GC.Collect 'this works better especially in debug mode DoOfficeWork(XLProc) 'Do garbage collection to release the COM pointers 'http://support.microsoft.com/kb/317109 GC.Collect() GC.WaitForPendingFinalizers() 'I prefer to have two parachutes when dealing with the Excel process 'this is the last answer if garbage collection were to fail If Not XLProc Is Nothing AndAlso Not XLProc.HasExited Then XLProc.Kill() End If End Sub 'http://msdn.microsoft.com/en-us/library/ms633522%28v=vs.85%29.aspx <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _ Private Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _ ByRef lpdwProcessId As Integer) As Integer End Function Private Sub ExcelWork(ByRef XLProc As Process) 'start the application using late binding Dim xlApp As Object = CreateObject("Excel.Application") 'or use early binding 'Dim xlApp As Microsoft.Office.Interop.Excel 'get the window handle Dim xlHWND As Integer = xlApp.hwnd 'this will have the process ID after call to GetWindowThreadProcessId Dim ProcIdXL As Integer = 0 'get the process ID GetWindowThreadProcessId(xlHWND, ProcIdXL) 'get the process XLProc = Process.GetProcessById(ProcIdXL) 'do some work with Excel here using xlApp 'be sure to save and close all workbooks when done 'release all objects used (except xlApp) using NAR(x) 'Quit Excel xlApp.quit() 'Release NAR(xlApp) End Sub Private Sub NAR(ByVal o As Object) 'http://support.microsoft.com/kb/317109 Try While (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) End While Catch Finally o = Nothing End Try End Sub
sumber
Saya menemui masalah yang sama dan mencoba banyak metode untuk menyelesaikannya tetapi tidak berhasil. Akhirnya, saya menemukan jalan saya. Beberapa referensi masukkan deskripsi tautan di sini
Semoga kode saya dapat membantu seseorang di masa depan. Saya telah menghabiskan lebih dari dua hari untuk menyelesaikannya. Di bawah ini adalah Kode saya:
//get current in useing excel Process[] excelProcsOld = Process.GetProcessesByName("EXCEL"); Excel.Application myExcelApp = null; Excel.Workbooks excelWorkbookTemplate = null; Excel.Workbook excelWorkbook = null; try{ //DO sth using myExcelApp , excelWorkbookTemplate, excelWorkbook } catch (Exception ex ){ } finally { //Compare the EXCEL ID and Kill it Process[] excelProcsNew = Process.GetProcessesByName("EXCEL"); foreach (Process procNew in excelProcsNew) { int exist = 0; foreach (Process procOld in excelProcsOld) { if (procNew.Id == procOld.Id) { exist++; } } if (exist == 0) { procNew.Kill(); } } }
sumber
excelBook.Close (); excelApp.Quit (); tambahkan akhir kode, itu sudah cukup. itu bekerja pada kode saya
sumber
Anda dapat menghentikan proses dengan
COM
objek excel pid Anda sendiritambahkan di suatu tempat di bawah kode impor dll
[DllImport("user32.dll", SetLastError = true)] private static extern int GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
dan gunakan
if (excelApp != null) { int excelProcessId = -1; GetWindowThreadProcessId(new IntPtr(excelApp.Hwnd), ref excelProcessId); Process ExcelProc = Process.GetProcessById(excelProcessId); if (ExcelProc != null) { ExcelProc.Kill(); } }
sumber
Saya telah menemukan bahwa penting untuk memiliki
Marshal.ReleaseComObject
satuWhile
lingkaran DAN menyelesaikannya dengan Pengumpulan Sampah .static void Main(string[] args) { Excel.Application xApp = new Excel.Application(); Excel.Workbooks xWbs = xApp.Workbooks; Excel.Workbook xWb = xWbs.Open("file.xlsx"); Console.WriteLine(xWb.Sheets.Count); xWb.Close(); xApp.Quit(); while (Marshal.ReleaseComObject(xWb) != 0); while (Marshal.ReleaseComObject(xWbs) != 0); while (Marshal.ReleaseComObject(xApp) != 0); GC.Collect(); GC.WaitForPendingFinalizers(); }
sumber
wb.Close(); app.Quit(); System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel"); foreach (System.Diagnostics.Process p in process) { if (!string.IsNullOrEmpty(p.ProcessName) && p.StartTime.AddSeconds(+10) > DateTime.Now) { try { p.Kill(); } catch { } } }
Ini Menutup proses 10 detik terakhir dengan nama "Excel"
sumber
Berdasarkan solusi lain. Saya telah menggunakan ini:
IntPtr xAsIntPtr = new IntPtr(excelObj.Application.Hwnd); excelObj.ActiveWorkbook.Close(); System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel"); foreach (System.Diagnostics.Process p in process) { if (p.MainWindowHandle == xAsIntPtr) { try { p.Kill(); } catch { } } }
Menggunakan "MainWindowHandle" untuk mengidentifikasi proses dan menutupnya.
excelObj: Ini adalah objek excel Interop Aplikasi saya
sumber
Gunakan variabel untuk setiap objek Excel dan harus berulang
Marshal.ReleaseComObject >0
. Tanpa perulangan, proses Excel masih tetap aktif.public class test{ private dynamic ExcelObject; protected dynamic ExcelBook; protected dynamic ExcelBooks; protected dynamic ExcelSheet; public void LoadExcel(string FileName) { Type t = Type.GetTypeFromProgID("Excel.Application"); if (t == null) throw new Exception("Excel non installato"); ExcelObject = System.Activator.CreateInstance(t); ExcelObject.Visible = false; ExcelObject.DisplayAlerts = false; ExcelObject.AskToUpdateLinks = false; ExcelBooks = ExcelObject.Workbooks; ExcelBook = ExcelBooks.Open(FileName,0,true); System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); ExcelSheet = ExcelBook.Sheets[1]; } private void ReleaseObj(object obj) { try { int i = 0; while( System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) > 0) { i++; if (i > 1000) break; } obj = null; } catch { obj = null; } finally { GC.Collect(); } } public void ChiudiExcel() { System.Threading.Thread.CurrentThread.CurrentCulture = ci; ReleaseObj(ExcelSheet); try { ExcelBook.Close(); } catch { } try { ExcelBooks.Close(); } catch { } ReleaseObj(ExcelBooks); try { ExcelObject.Quit(); } catch { } ReleaseObj(ExcelObject); } }
sumber
Kita dapat menutup Aplikasi Excel sambil mengubah xls menjadi xlsx dengan menggunakan kode berikut. Saat kita melakukan tugas semacam ini maka aplikasi Excel sedang berjalan di task manager, kita harus menutup excel yang sedang berjalan di latar belakang ini. Interop adalah komponen Com, untuk melepaskan komponen com kami menggunakan Marshal.FinalReleaseComObject.
private void button1_Click(object sender, EventArgs e) { Excel03to07("D:\\TestExls\\TestExcelApp.XLS"); } private void Excel03to07(string fileName) { string svfileName = Path.ChangeExtension(fileName, ".xlsx"); object oMissing = Type.Missing; var app = new Microsoft.Office.Interop.Excel.Application(); var wb = app.Workbooks.Open(fileName, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing); wb.SaveAs(svfileName, XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); wb.Close(false, Type.Missing, Type.Missing); app.Quit(); GC.Collect(); Marshal.FinalReleaseComObject(wb); Marshal.FinalReleaseComObject(app); }
sumber
Sebagian besar metode berfungsi, tetapi proses excel selalu bertahan sampai aplikasi ditutup.
Ketika proses kill excel setelah itu tidak dapat dijalankan sekali lagi di utas yang sama - tidak tahu mengapa.
sumber
Cara yang tepat untuk menutup semua proses excel
var _excel = new Application(); foreach (Workbook _workbook in _excel.Workbooks) { _workbook.Close(0); } _excel.Quit(); _excel = null;
Menggunakan contoh proses, ini dapat menutup semua proses excel.
var process = System.Diagnostics.Process.GetProcessesByName("Excel"); foreach (var p in process) { if (!string.IsNullOrEmpty(p.ProcessName)) { try { p.Kill(); } catch { } } }
sumber
workbook.Close(0); excelApp.Quit();
Bekerja untuk saya.
sumber
GetWindowThreadProcessId((IntPtr)app.Hwnd, out iProcessId); wb.Close(true,Missing.Value,Missing.Value); app.Quit(); System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel"); foreach (System.Diagnostics.Process p in process) { if (p.Id == iProcessId) { try { p.Kill(); } catch { } } } } [DllImport("user32.dll")] private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); uint iProcessId = 0;
GetWindowThreadProcessId ini menemukan Id Proses yang benar o excell .... Setelah membunuhnya .... Enjoy It !!!
sumber
private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Unable to release the Object " + ex.ToString()); } finally { GC.Collect(); } }
sumber