首页 新闻 会员 周边

用VSTO开发智能文档时的一个奇怪问题

0
悬赏园豆:20 [已关闭问题] 关闭于 2012-06-12 11:53

我在项目中使用VSTO对Excel 进行了如下操作:我做好的Excel模板复制到当前Excel智能文档中,随即关闭源模板文件。反复多次进行这样的操作,就会抛出如下的错误提示:

“COM对象与其基础RCW分开后就不能再使用”,但很多时候,这个错误有不出现

问题补充: 谢谢 Galactica的帮助,但是现在根据弹出的跟踪消息,确实可以确定出错的地方,但是,问题仍然没有得到解决
prepat的主页 prepat | 初学一级 | 园豆:104
提问于:2010-08-19 17:17
< >
分享
所有回答(1)
0

能否给份简单的代码,因为我不太明白你表达的意思,我做过的智能文档,都是从创建VSTO项目的Excel模板去生成新的Excel文档,没有说把另外的Excel模板复制到当前的Excel模板当中,顶多是把别的Excel模板中的Sheets复制过来.

 

我使用你提供的程序,在本机测试没有遇到你提到的问题,我的系统环境是 Windows 7  Excel 2007.

你遇到的问题,在于COM对象没有正确释放引用.尽管如此,我还是修改了你的一个处理函数,你测试时,通过

ex.StackTrace 来跟踪报错的语句,我才能锁定未正确释放的 COM 对象.

 

/// <summary>
/// 新建sheet,把目标Excel表格内容复制到上面
/// </summary>
/// <param name="filePath"></param>
/// <param name="sheetName"></param>
/// <param name="sheet"></param>
public static void DiplayCurrForm(string filePath, string sheetName, ToolsExcel.Worksheet sheet)
{
//所选中的单元格为空
Globals.ThisWorkbook.CurrActionsPane.Tag = null;

object missing = Type.Missing;
Microsoft.Office.Interop.Excel.Application app
= null;
InteropExcel.Worksheet sourceSheet
= null;

try
{
//在表单设计器核心区加载选中的工作表
int k = 0;
k
=FindSheetIndexByName(sheetName, Globals.ThisWorkbook.Worksheets);

InteropExcel.Worksheet newWorksheet
= null;
if (k!=0)
{
newWorksheet
= (InteropExcel.Worksheet)Globals.ThisWorkbook.Worksheets[k];

// 已加载表格,先注销事件处理函数。
newWorksheet.SelectionChange -= (Target) =>
{
Globals.ThisWorkbook.CurrActionsPane.Tag
= Target;
};
}
else
{
// 只有当前的 Workbooks 不包含选定表格时
//才打开指定路径的Excel表格并拷贝其中的表。
InteropExcel.Workbook w = null;
try
{
app
= Globals.ThisWorkbook.Application;
w
= app.Workbooks._Open(filePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
int index = FindSheetIndexByName(sheetName, w.Worksheets);
sourceSheet
= (InteropExcel.Worksheet)w.Worksheets[index];

sourceSheet.Copy(sheet.InnerObject, Type.Missing);
int index1 = FindSheetIndexByName(sheetName, Globals.ThisWorkbook.Worksheets);
newWorksheet
= (InteropExcel.Worksheet)Globals.ThisWorkbook.Worksheets[index1];
}
catch (Exception ex)
{
MessageBox.Show(ex.StackTrace);
}
finally
{
if (w != null)
{
w.Save();
w.Close(missing, missing, missing);
}
}
}

//为当前新建的的工作表添加事件,截获单元格选中改变事件
newWorksheet.SelectionChange += (Target) =>
{
Globals.ThisWorkbook.CurrActionsPane.Tag
= Target;
};

//只显示当前工作表
ShowAllInteropSheets(newWorksheet);

}
catch (Exception ex)
{
MessageBox.Show(ex.StackTrace); ;
}
}
Launcher | 园豆:45045 (高人七级) | 2010-08-20 10:50
谢谢 Galactica大侠的帮助。现在根据弹出的跟踪消息,确实可以确定出错的地方,但是,问题仍然没有得到解决。
支持(0) 反对(0) prepat | 园豆:104 (初学一级) | 2010-08-29 18:56
@prepat:你是用的excel 2003?
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-30 08:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册