System.AccessViolationException при использовании Excel.Worksheet.Copy

1

У нас есть дополнение VSTO для Excel. Основная функциональность создает отчеты, которые используются для создания книг. Когда я запускаю пакет отчетов, я получаю исключение System.AccessViolationException при использовании Excel.Worksheet.Copy, что также приводит к сбою Excel. Вот как я его воссоздаю:

1) Откройте и запустите отчет № 1 с одним параметром, который создает одну книгу. Мы закрываем книгу. 2) Откройте и запустите тот же отчет с несколькими параметрами. Это создает 5 книг, но сбой при создании второго, но ТОЛЬКО, если мы запустили первый отдельный отчет о выходе (см. Шаг 1). Если мы удалим отчет с шага 1 из пакета, это создаст все 5 книг без ошибок.

Я проверил, чтобы убедиться, что лист, который мы копируем из книги, открыт и не ссылается на первый отчет. Фактически, мы закрываем первый, поэтому я знаю, что это не так. Опять же, это ТОЛЬКО случается, если у нас есть отчет на первом шаге, который он вообще не имеет доступа, так как это может повлиять на лист из совершенно другой книги?

Это даже не заканчивает мой try/catch, поэтому я могу получить больше информации. Он просто взрывает Excel, и я должен перезапустить.

UPDATE: здесь базовый код:

function void ReplaceSheets(Dictionary<Excel.Worksheet, IReportSheet> sheetReports)
{
    List<string> oldNames = new List<string>(sheetReports.Count);

    foreach (Excel.Worksheet oldSheet in sheetReports.Keys)
    {
        Excel.Worksheet veryHiddenSheet = null;
        Excel.Worksheet newSheet = null;

        try
        {
            string sheetName = oldSheet.Name;
            veryHiddenSheet = WorkbookHelper.FindSheet(this.DocumentView, MakeHiddenSheetName(sheetName, "--VH--"));  
            veryHiddenSheet.Visible = Excel.XlSheetVisibility.xlSheetVisible;  //Sheet has to be visible to get the copy to work correctly.
            veryHiddenSheet.Copy(this.DocumentView.Sheets[1], Type.Missing);//This is where it crashes
            newSheet = (Excel.Worksheet)this.DocumentView.Sheets[1];  //Get Copied sheet
            /* do other stuff here*/
        }
        finally
        {
            veryHiddenSheet = null;
            newSheet = null;
        }
    }
}
Теги:
excel
vsto

1 ответ

0

Я никогда не нашел способ в VSTO "исправить" это. Я переключил код в NetOffice, и мне удалось получить более качественное сообщение об ошибке. Excel/Com не выпускал память, прикрепленную к электронным таблицам. Я восстановил отчеты из чистых таблиц 2010 года и позаботился об этом. Я думаю, что это была поврежденная таблица 2007 года, которая, возможно, произошла при конвертации в 2010 году или что-то в этом роде. Я рекомендую NetOffice для VSTO, потому что обработка исключений намного превосходит, и у вас есть доступ к исходному коду, но у него есть свои причуды. (Вам нужно обратить внимание на порядок загрузки для задач.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню