昨天发的那个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 。或者还有其他方法的 都可以 说说!
原帖
只要是用了 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 。或者还有其他方法的 都可以 说说!
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看到這些資料,感觉上红字这个是重点
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);
}要不要参考看看用巨集?
try
{
Excel1.ActiveWorkbook.Close(true, textBox1.Text, Missing.Value);
}
catch
{
}
try
{
Excel1.Quit();
}
catch
{
}我在项目中,都是这么关闭的,没遇到过楼主说的问题
创建一个新的工作簿并将其命名 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
你试一下 axwebroser 就知道了
他获得的 excel 对象 不能关闭
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;
http://www.17fx.net/jishu/dotnet-office/winform-qianru-word-excel-.aspx
1、winform程序处理excel2、b/s应用,方式处理excel第一次遇到你这样在winform中通过webbrowser来处理excel的。
主要是 嵌入在 winfrom 窗体上 打开 excel 在 窗体上,不能直接用 office打开 excel