COMException Breakdown - PullRequest
       5

COMException Breakdown

2 голосов
/ 10 июня 2009

Кто-нибудь знает, есть ли на сайте (даже не Microsoft) сведения о COMExceptions / HRESULTS.

Когда я попытался сохранить книгу Excel после использования функции Copy (), я получил эту ошибку:

ERROR - Unable to SaveWorkbook()
System.Runtime.InteropServices.COMException (0x800A03EC): Document not saved.

P.S. Я делаю это в жестком цикле для файлов размером 10K +, но чтение файлов работает нормально, но сохранять их оказывается неинтересно.

Также, если у кого-то возникла проблема с кровопотерей в памяти Excel при использовании функции Copy (), сообщите мне.

Спасибо!

P.S.S Если кому-то нужны дальнейшие разъяснения, пожалуйста, дайте мне знать

Редактировать 1

Вот что происходит. Меня попросили обновить некоторые файлы XLS (на самом деле 10K +), скопировав активный лист на новый лист (ту же рабочую книгу) и обновить исходный лист, выполнив некоторое преобразование. Проблема возникает, когда я сохраняю книгу.

Вот некоторые выдержки из моего заявления:

///.... UpdateSpreadsheet() Routine
Microsoft.Office.Interop.Excel.Workbook wb = null;

try
{
    wb = ef.GetWorkbook(fileName, false, true);
}
catch (Exception ex)
{
    logger.Error(ex.ToString());
}

Microsoft.Office.Interop.Excel.Worksheet ws = null;

try
{
    ws = wb.Sheets[Foo.WorksheetName] as Microsoft.Office.Interop.Excel.Worksheet;
}
catch (Exception ex)
{
    logger.Error(ex.ToString());
}

bool result = false;

if (ws != null)
    result = ef.CopyWorksheet(ws, Foo.WorksheetName);

if (result)
{
   //... update the sheet as appropriate
}

try
{
    ef.SaveWorkbook(wb, fileName);  //eventually this line crashes, it's random, but so far after the 500th file, and I get that COM Exception.
    //.. update Foo object to reflect copied worksheet
}
catch (Exception ex)
{
    //something happened, we can't save, so close and destroy the workbook
    logger.Error("Unable to SaveWorkbook()", ex);   
}
finally
{
    ef.DestoryWorkbook(wb, fileName);
    ef.DestroyWorksheet(ws);
}

//// CopyWorksheet() Method
public bool CopyWorksheet(Worksheet ws, String sourceSheet)
{
    try
    {
        try
        {
            Worksheet sheet = GetWorksheet(sourceSheet + " (2)");

                    //I don't think the below is necessary, but I'm paranoid about memory leaks
            ExcelTools.OfficeUtil.ReleaseRCM(sheet);
            sheet = null;

            return false;
        }
        catch (Exception)
        {
            ws.Copy(Missing.Value, ws); //this line never errors out
        }

        return true;
    }
    catch (Exception)
    {
        return false;
    }
    finally
    {
        ws.Activate();
    }
}

/// SaveWorkbook()
public void SaveWorkbook(Workbook wb)
{
    if (wb != null)
    {
        wb.Save();
    }
}

1 Ответ

0 голосов
/ 10 июня 2009

Если вы укажете значение HRESULT, код объекта будет FACILITY_CONTROL, а код ошибки - 1004. Из некоторых онлайн-поисков выясняется, что этот код генерируется для множества различных ошибок, некоторые из которых кажутся связанными к программному копированию листов (см., например, эту статью базы знаний ).

Это может помочь опубликовать более подробную информацию о том, что вы делаете, или найти в Интернете этот HRESULT и посмотреть, какие проблемы могут возникнуть у других, которые похожи на ваши.

...