我在操作Excel的时候要new Excel.Application()
操作Excel完毕后又要把这个Excel.Application给关闭掉
这样会往复操作内存,如在内存中打开Excel.exe和关闭Excel.exe,影响速度.
请问如何能够保持住Excel.exe进程以供使用?
有示例代码更好..
或者您有更好的操作Excel的方案,谢谢各位留言指点.

解决方案 »

  1.   

    Excel只是启动了一个exe的Com Server,没有那么慢的,并不是真的起了一个完整的Excel
      

  2.   

    我现在操作Excel是对每一个请求都 new Application
    如果并发的话.....
    等更好的方法..
      

  3.   

    我一般是直接调用excel
    如果你不是经常使用excel,就可以采用这种方法。。关注!
      

  4.   

    再加个book或者sheet不行么?为什么还要new Excel.Application();再运行的时候执行进程判断下不行么?如果没有再将这个全局变量实例化一次。
      

  5.   

    写个公用静态类,只对sheeft操作,不执行app.quit
      

  6.   

    感谢指点,并发的时候,
    Excel.Application mExcel = new Excel.ApplicationClass();
    我再加个book,那么mExcel.ActiveWorkbook是哪一个....
    我如何在最后一次并发处理结束后,关闭mExcel?或者干脆不关闭它,但是静态的mExcel的生存周期貌似已结束..
    不久后进行下次处理进程中已存在Excel.exe,如何给mExcel赋值.....
      

  7.   

    全局的公用静态类总有其生存周期,在它生存周期结束不Quit(),那么进程中仍然存在Excel.exe,
    此时该如何给mExcel赋值?把以前的进程关掉,重新new一个?
    感谢楼上的各位细心指点,你们的回复未能一一致谢但是都对我有莫大的帮助~
      

  8.   

    不是很清楚你的需求
    我的理解是 你觉得你调用excel后不希望excel的线程消失
    但是事实上是 如果你用COM编程的话 excel线程是不会自动消失的
     不信你自己可以去试试。
    每次调用excel都会生出新的一个excel线程。
      

  9.   

    .....
    我在操作Excel的时候,用户会并发多个请求,我在第一次实例化COM组件,然后让全局变量存储它,进行下一步操作,
    此次并发完毕如果我没有quit(),进程中会保留Excel.exe,但是全局变量生存周期已过会被回收.
    那么再下一次请求时,如何调用系统中已存在的Excel.exe给我的全局变量赋值?而不是重新实例化..
      

  10.   


    这个excel进程关不掉的问题还没发现什么好的解决方法。只能通过扫描进程,但是无法判断是用户的还是程序的,所以也不好用
      

  11.   

    还是老老实实的new 一次 关一次吧。
      

  12.   

    据个人所知,new 出来的 excel application对象是 当前进程独占的.
    除非程式之间进行通讯来操作同一个excel application对象.即: 程式A --> New一个excel application对象 然后程式A不关闭,等待接收其他程式与其交互
    (这样所有与其交互的程式取得excel application对象都是同一个,lz需要把excel当数据库使用?)
    程式B--交互提交请求-->程式A--操作EXCEL,并返回EXCEL对象-->程式B
    这样做弊大于利,增加复杂度,速度也不见得快,而且会造成数据干扰.还是直接New一个对象吧.
      

  13.   

    17楼说的在理啊。
    在下B/S结构,用户提供数据,我给他做一个精美的Excel表格,现在的以new Application多进程处理并发会在内存中留下一些关不掉的Excel.exe很闹眼子
      

  14.   


    我想让Excel的COM组件做成个服务在内存中随其他进程如IIS一起生存,并留下侦听来处理事务。的确说比较像数据库。
      

  15.   

    推荐使用Aspose,快,占用内存少
      

  16.   

    kill。net打开的excel线程。#region Kill those excel thread opned by the .net.
            private void killExcelThread() 
            {
                System.Diagnostics.Process[] lo_Process = System.Diagnostics.Process.GetProcessesByName("EXCEL.");//获取所有的名为EXCEL的进程
                foreach (System.Diagnostics.Process Process in lo_Process)
                {
                    if (Process.MainWindowTitle == "")
                    {
                        Process.Kill();// Kill those excel thread opened by the .net.
                    }
                }        }
            #endregion
      

  17.   

    用 
    try
                {
                    App = Marshal.GetActiveObject("Excel.Application") as WPS.Application;
                }
                catch (Exception ex)
                {
                    App = new Excel.Application();
                }
    如果有进程运行就不会再创建实例了。
      

  18.   


    的确是那样的
    SERVER端产EXCEL进程很烦人 关闭不掉的话会把CPU全部吃掉的 
      

  19.   

    COM 组件的AppicationClass这样传递,在操作的时候会不会出问题?先去44
      

  20.   

    Kill Process 
    额。。非到万不得已还是不要Kill Process
    如果Kill,并发用户的怨念谁来承受
    谢谢你给我提供的方法,可惜用不上。
      

  21.   

    如果打开excel连续存储数据不保存的话可以一直开着,我使用的工具里就是实时一行行显示结果,最后再保存