簡體   English   中英

Excel C#互操作工作表刪除

[英]Excel C# interop worksheet delete

我有一個使用Excel COM互操作的應用程序。 它將模板XLS復制到現有文檔,通過刪除舊模板然后從模板復制新模板來替換同名標簽。

當我的應用嘗試刪除工作表時,出現800A03ec異常。

此問題已存在多年,但在升級到Office 2016后失敗。

我發現如果我將app.Visible = true設置為正確,則該操作將正確完成! 但是我不希望Excel可見。

如果app.Visible = false,則不會從第一個工作表Delete()中得到錯誤,但第二個工作表會發生異常。

最后一個選項卡的第一次刪除似乎可以,但是工作表對象的“ Sheets”數組並沒有像我期望的那樣減少。 但是,數組中相應的Sheet項目將變為“空”工作表。

在其之前的選項卡上的第二個刪除操作會在刪除操作上引發異常。

我已經完全保證:

  • 沒有COM參考泄漏
  • 每次刪除之前,所有COM引用都將被丟棄,但要刪除的工作表及其父應用程序等對象除外。
  • DisplayAlerts為假
  • 工作表簡單而又普通,沒有任何隱藏內容等。

為什么在可見的應用程序中有效,而在隱藏的應用程序中無效?

更新:代碼片段

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;

通過添加以下內容,我走得更遠:

//
// 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()拋出了異常。

我被迫為上周的報告運行App Visible。 但是即使運行了大約80個工作簿,然后Excel都被鎖定,鼠標光標在箭頭和等待計時器動畫之間快速閃爍,最終我的應用程序出現RPC錯誤。

結論:Office 2016的ABANDON COMAPIS。Microsoft似乎不再正確支持它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM