昨天发的那个EXCEL 问题 还是没有解决
原帖
只要是用了 axwebroser 控件 来读取 excel , 实现 多窗体 加载不同 excel 
大家用过的人都知道 axwebroser 加载 excel 后 会 卡死 其他 axwebroser 控件上已经打开的excel 和 系统里面office 打开的excel 也会卡, 最后打开的 excel 那个控件 不会卡死, 如果最后打开的是用 office 打开的, axwebroser 控件 就会卡死
这是比较 头疼的问题。
这个问题 我采用 动态销毁 axwebroser 控件 避免了 窗体间的卡死情况,我用的是tabcontrol 切换 窗体的。 每次切换就重新 new axwebroser 加载 
但是 axwebroser 加载excel 后 产生一个excel.EXE 进程 每次销毁 axwebroser 控件后 进程就会关闭,如果 打开的office excel程序的话 也会关闭。 比较悲剧!尝试不销毁 控件的话,每次打开同一个 excel 就会提示 保存,或者已经更改,最后 打开出错。
所以想 获得 excel 对象 得到里面的 workbook 关闭 之前的 xls 之后 在打开 这样就不提示 保存 或者 已经更新了,我是这样认为的。 可是 尝试了 很多方法,均不能 关闭 excel对象 中的 workbook,怎么释放都不行。 悲剧我现在想问下 能不能 通过 EXCEL.EXE 的进程得到 excel 实例对象 之后 关闭 里面的 workbook 。或者还有其他方法的 都可以 说说!

解决方案 »

  1.   

    Workbook.Close 方法
    Visual Studio 2005其他版本 Visual Studio 2010Visual Studio 2008
    关闭工作簿。 命名空间: Microsoft.Office.Tools.Excel
    程序集: Microsoft.Office.Tools.Excel(在 microsoft.office.tools.excel.dll 中)语法
    --------------------------------------------------------------------------------VBC#C++F#JScript复制public virtual void Close (
    [OptionalAttribute] Object SaveChanges,
    [OptionalAttribute] Object Filename,
    [OptionalAttribute] Object RouteWorkbook
    )参数
    SaveChanges
    如果没有对工作簿进行更改,则忽略此参数。如果对工作簿进行了更改且工作簿显示在其他打开的窗口中,则忽略此参数。如果对工作簿进行了更改,但工作簿没有显示在任何其他打开的窗口中,则此参数指定更改是否应保存(如下面的列表所示)。•true。保存对工作簿所做的更改。如果工作簿还没有关联文件名,则使用 FileName。如果省略了 FileName,则要求用户提供文件名。•false。不保存对工作簿所做的更改。•省略。显示一个对话框,询问用户是否保存更改。Filename
    使用此文件名保存更改。RouteWorkbook
    如果工作簿不需要传送给下一个收件人(如果该工作簿没有传送名单或已传送),则忽略此参数。否则,Microsoft Office Excel 传送工作簿,如下面的列表所示。•true。将工作簿发送给下一个收件人。•false。不发送工作簿。•省略。显示一个对话框,询问用户是否应发送工作簿。备注
    --------------------------------------------------------------------------------使用此方法关闭工作簿不会在工作簿中运行任何 Auto_Close 宏。使用 RunAutoMacros 方法可运行这些宏。我在MSDN看到這些資料,感觉上红字这个是重点
      

  2.   

    Workbook.RunAutoMacros 方法
    Visual Studio 2005其他版本 Visual Studio 2010Visual Studio 2008
    运行附加到工作簿的 Auto_Open、Auto_Close、Auto_Activate 或 Auto_Deactivate 宏。包含此方法是为了向后兼容。应使用 Open、Close、Activate 和 Deactivate 事件代替这些宏。 命名空间: Microsoft.Office.Tools.Excel
    程序集: Microsoft.Office.Tools.Excel(在 microsoft.office.tools.excel.dll 中)语法
    --------------------------------------------------------------------------------public virtual void RunAutoMacros (
    XlRunAutoMacro Which
    )参数
    Which
    XlRunAutoMacro 值之一。示例
    --------------------------------------------------------------------------------下面的代码示例使用 RunAutoMacros 方法运行 Auto_Activate 宏。 private void WorkbookRunAutoMacros()
    {
        this.Activate();
        this.RunAutoMacros(Excel.XlRunAutoMacro.xlAutoActivate);
    }要不要参考看看用巨集?
      

  3.   

    //关闭Office程序
                try
                {
                    Excel1.ActiveWorkbook.Close(true, textBox1.Text, Missing.Value);
                }
                catch
                {
                }
                try
                {
                    Excel1.Quit();
                }
                catch
                {
                }我在项目中,都是这么关闭的,没遇到过楼主说的问题
      

  4.   

    http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel.workbook.close(v=VS.80).aspxhttp://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel.workbook.runautomacros(v=VS.80).aspx
      

  5.   

    Microsoft 提供的编程示例只,用于说明不附带任何明示或暗示保证。这包括,但不限于对适销性或针对特定用途的适用性的暗示的担保。本文假定您熟悉演示了正在使用的编程语言以及用于创建和调试过程的工具。Microsoft 支持工程师可以帮助解释某个特定过程的功能,但他们不会修改这些示例以提供额外的功能或构建过程来满足您的具体要求。当您打开一个特定的工作簿时,请关闭所有其他工作簿,请按照下列步骤操作: 
    创建一个新的工作簿并将其命名 Closetst.xls。 
    将下面的 Sub 过程复制到新模块工作表: 
          Sub Auto_Open()
              ' This sub will close all workbooks
              ' except the workbook in which the code is located.
              Dim WkbkName As Object          On Error GoTo Close_Error
              Application.ScreenUpdating = False          For Each WkbkName In Application.Workbooks()
                  If WkbkName.Name <> ThisWorkbook.Name Then WkbkName.Close
              Next          ' If everything runs all right, exit the sub.
              Exit Sub      ' Error handler.
          Close_Error:
              MsgBox Str(Err) & " " & Error()
              Resume Next
          End Sub
    保存工作簿并将其关闭。 
    打开 Closetst.xls 以外的多个工作簿。 
    打开 Closetst.xls。请注意 Auto_Open Sub 过程运行,并关闭 Closetst.xls 除外的所有工作簿。
    http://support.microsoft.com/kb/147742/zh-cn
      

  6.   


    你试一下 axwebroser 就知道了
    他获得的 excel 对象 不能关闭
      

  7.   


     
    xlApp = new Microsoft.Office.Interop.Excel.Application();
    //将新建的工作薄数量设为1
    xlApp.SheetsInNewWorkbook = 1;
    Workbooks workbooks = xlApp.Workbooks;Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
    workbook.Sheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value);Sheets sheets = workbook.Worksheets;Worksheet worksheet = (Worksheet)sheets.get_Item(1);
    string strTableExcel = _MyStatistics.X.Name;
    //对象名称strTableExcel
    worksheet.Name = strTableExcel;
      

  8.   

    我这里 不是新建的 Excel.Application 是 获得 axwebroser 加载后 的 Excel.Application 自己生成的没用
      

  9.   

    我给你一个工具,你可以下载试试看看能否解决你的问题:www.aduse.com.cn
      

  10.   

    你这个问题,我以前也遇到过,后来解决了。微软对于WinForm里打开office已经封装了对应的com组件,具体叫什么名字我忘记了,你到微软官网上去查看看。问题很简单,你想复杂啦~!
      

  11.   

    楼主看这个  Office编程杂谈(4):在winform、asp.net中嵌入word/excel/ppt  
     
    http://www.17fx.net/jishu/dotnet-office/winform-qianru-word-excel-.aspx
      

  12.   

    你为什么要用webbrowser去加载excle,常见的有:
    1、winform程序处理excel2、b/s应用,方式处理excel第一次遇到你这样在winform中通过webbrowser来处理excel的。
      

  13.   

    你把主要代码,例如你如何在webbrowser中加载excle等,贴出来,大家帮你看看。
      

  14.   

    既然.net提供了WebBrowser,你为什么还要用activeX控件呢?
      

  15.   


    主要是 嵌入在 winfrom 窗体上 打开 excel 在 窗体上,不能直接用 office打开 excel