我在项目中使用VSTO对Excel 进行了如下操作:我做好的Excel模板复制到当前Excel智能文档中,随即关闭源模板文件。反复多次进行这样的操作,就会抛出如下的错误提示:
“COM对象与其基础RCW分开后就不能再使用”,但很多时候,这个错误有不出现
能否给份简单的代码,因为我不太明白你表达的意思,我做过的智能文档,都是从创建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); ;
}
}