1.因为C#读写Excel过程中,常常会无法正确释放Excel对象,所以会在进程管理器中看到程序开启的Excel进程,而进程名有时是EXCEL.EXE,有时候是excel.exe,印象中还出现过Excel.exe
1)请问这是何解?有何规律?
2)之前有朋友提出可以用结束进程的方法来强制终止残留在内存中的进程。但是碰到一个问题,终止进程时用的是GetProcessByName(),也就是通过进程名来判断并终止进程。但是这样也会连用户自己打开的Excel文件也一并关掉。如何解决?2.因为Excel2007和Excel2003的读写有很多不同,而且调用的Microsoft.Office.Interop.Excel库版本也不同,03是11.0.0.0,07是12.0.0.0。
1)如何在载入文件到Excel对象时判断其是03版本还是07版本?
2)我用Excel2007创建的.xls文件是算07版的还是算03版的?我是用12.0.0.0库版本来对07生成的.xls文件其进行操作的,那就是说07生成的.xls文件也算是07版本的?
1)请问这是何解?有何规律?
2)之前有朋友提出可以用结束进程的方法来强制终止残留在内存中的进程。但是碰到一个问题,终止进程时用的是GetProcessByName(),也就是通过进程名来判断并终止进程。但是这样也会连用户自己打开的Excel文件也一并关掉。如何解决?2.因为Excel2007和Excel2003的读写有很多不同,而且调用的Microsoft.Office.Interop.Excel库版本也不同,03是11.0.0.0,07是12.0.0.0。
1)如何在载入文件到Excel对象时判断其是03版本还是07版本?
2)我用Excel2007创建的.xls文件是算07版的还是算03版的?我是用12.0.0.0库版本来对07生成的.xls文件其进行操作的,那就是说07生成的.xls文件也算是07版本的?
第一次执行的时候,任务管理器会刷出1个EXCEL.EXE进程
第二次执行的时候,会先刷出2个EXCEL.EXE进程,然后再次自动刷新时两个进程都关闭。
怎么回事?为什么第一次执行的时候不会自动关闭进程?
private void button2_Click(object sender , EventArgs e)
{
//创建excel对象
String strFileName = Environment.CurrentDirectory + "\\test.xls ";
Object Nothing = Missing.Value;
Object FileName = strFileName; if (System.IO.File.Exists((String) strFileName))
System.IO.File.Delete((String) strFileName); Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Workbook xlBook = xlApp.Workbooks.Add(Nothing);
xlBook.SaveAs(FileName , Missing.Value , Missing.Value , Missing.Value , Missing.Value , Missing.Value , Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange , Missing.Value , Missing.Value , Missing.Value , Missing.Value , Missing.Value); //关闭excel对象
xlBook.Close(true , false , Missing.Value);
xlApp.Quit(); int generation = System.GC.GetGeneration(xlApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
xlApp = null; //code addition than button1
//结束相关进程
Process myProc = new System.Diagnostics.Process();
foreach (Process proc in Process.GetProcessesByName("EXCEL.EXE"))
proc.Kill();
foreach (Process proc in Process.GetProcessesByName("Excel.exe"))
proc.Kill();
foreach (Process proc in Process.GetProcessesByName("excel.exe"))
proc.Kill();
}
/// 关闭Excel进程
/// </summary>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
private static void KillExcelProcess(Microsoft.Office.Interop.Excel.Application excel)
{
IntPtr t = new IntPtr(excel.Hwnd);//得到这个句柄,具体作用是得到这块内存入口
int k = 0;
GetWindowThreadProcessId(t, out k);//得到本进程唯一标志k
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);//得到对进程k的引用
p.Kill();//关闭进程p
}
怎么弄啊?
我写入xls会比较复杂点,会有一些格式的设定,我的代码是先在excel里用宏记录了操作,然后转成C#代码的。还涉及到在不同worksheet之间设置超链接等需求,流能满足吗
xlApp.Quit();就可以了!
1)第二个问题可以根据文件的后缀名来判断。03的xls,07的是xlsx。
2)07生成的xls用03打开。xls就用03的,xlsx才用07的
发布到IIS上给我试试
Global.xlBook.Close(false, Type.Missing, Type.Missing);
Global.xlBooks.Close();
Global.xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(Global.xlSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(Global.xlBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(Global.xlBooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(Global.xlApp); GC.Collect();
Close();