2017-01-06 488 views
0

我有一個應用程序使用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; 
+1

任何機會看到一些示例代碼? –

+1

該錯誤表示找不到名稱類型的錯誤。沒有看到一些代碼,投機只是浪費時間。 – JohnG

回答

0

我加入這進一步得到:

// 
// Super important to activate a tab other than what needs to be deleted. 
// Cast is required because an event and method have the same name "Activate". 
// 

((Excel._Worksheet)_weeklyDataSheet).Activate(); 

然後這讓我對在我的應用保存一些代碼功能,曾經工作但拋出異常:

_weeklyDataSheet.Select(Type.Missing); 

我將其改爲Activate(),並取得了更多進展。但Excel仍然在第三個工作簿上拋出了Delete()方面的異常。

我被迫爲本週的報告運行應用可見。但即使這樣,大約有80個工作簿,然後Excel鎖定,鼠標光標在箭頭和等待定時器動畫之間快速閃爍,最終我的應用程序得到了RPC錯誤。

結論:用於Office 2016的ABANDON COM APIS.Microsoft似乎不再適當地支持它們。