我有一個應用程序使用Excel COM互操作。它將模板XLS複製到現有的文檔中,通過刪除舊的替換同名標籤,然後從模板中複製新的文檔。Excel C#互操作工作表刪除
當我的應用程序嘗試刪除工作表時,出現800A03ec異常。
這個問題在已經工作多年的代碼,但現在在升級後無法辦公室2016年
我發現,如果我設置app.Visible = true,則操作正確完成!但我不希望Excel可見。
如果app.Visible = false,我不會從第一個工作表Delete()中收到錯誤,但第二個工作表中會發生異常。
最後一個選項卡的第一次刪除似乎確定,但工作表對象的「表格」數組不會像我所預期的那樣減少。但是,數組中的相應Sheet項目變爲「空白」工作表。
第二次刪除之前的選項卡在刪除時引發異常。
我已經徹底地保證:
- 沒有COM參考泄漏
- 所有COM引用之前每丟棄刪除,除了工作表中刪除,其父應用程序等對象
- DisplayAlerts是假
- 工作表很簡單,普通,沒有什麼隱藏等
我爲什麼要當應用程序可見時工作,但在隱藏應用程序時無法工作?
UPDATE:代碼片段
int _DeleteTargetTab(string tabName)
{
List<object> comRefs = new List<object>();
int prevTabIndex;
int tabToDelete = _FindTargetTemplateIndex(tabName, out prevTabIndex);
if (tabToDelete > 0)
{
try
{
Excel.Sheets targetSheets = _workbook.Sheets;
comRefs.Add(targetSheets);
Excel.Worksheet targetWorksheet = targetSheets[tabToDelete];
comRefs.Add(targetWorksheet);
targetWorksheet.Delete();
}
finally
{
ExcelUtility.ReleaseAll(comRefs);
}
}
return prevTabIndex;
}
和ExcelUtility.ReleaseAll()調用Marshal.ReleaseComObject的(),然後GC.Collect的()和GC.WaitForPendingFinalizers()。
目標工作表有8個選項卡。最後一個標籤被刪除,然後複製,無一例外。然後在選項卡7上刪除拋出一個異常,只有當應用程序被隱藏。在舊版Office上運行良好。
複製代碼是
void _CopyTemplateTabToTarget(Excel.Worksheet templateWorksheet, int prevTargetTabIndex)
{
List<object> comRefs = new List<object>();
try
{
Excel.Sheets targetSheets = _workbook.Sheets;
comRefs.Add(targetSheets);
Excel.Worksheet prevSheet = targetSheets[prevTargetTabIndex];
comRefs.Add(prevSheet);
templateWorksheet.Copy(Type.Missing, prevSheet);
}
finally
{
ExcelUtility.ReleaseAll(comRefs);
}
}
初始化代碼
_app = new Excel.Application();
_app.DisplayAlerts = false;
_app.Visible = false;
任何機會看到一些示例代碼? –
該錯誤表示找不到名稱類型的錯誤。沒有看到一些代碼,投機只是浪費時間。 – JohnG