2013-08-01 3 views
0

Я использую Excel = Microsoft.Office.Interop.Excel для записи различных данных в листы Excel.COMException при закрытии книги Excel

Excel.Workbook wb = null; 
Excel.Worksheet ws = null; 

Excel.Application excelApp = new Excel.Application(); 
excelApp.Visible = true; 

try { 
    // Create new workbook 
    wb = (Excel.Workbook)(excelApp.Workbooks.Add(Type.Missing)); 
    ws = wb.ActiveSheet as Excel.Worksheet; 

    // write data ... 

    // Save & Close 
    excelApp.DisplayAlerts = false; // Don't show file dialog for overwrite 
    wb.Close(true, targetFilename, Type.Missing); 

} finally { 
    // Close the Excel process 
    if (null != ws) 
     Marshal.ReleaseComObject(ws); 
    if (null != wb) 
     Marshal.ReleaseComObject(wb); 
    excelApp.Quit(); 
    Marshal.ReleaseComObject(excelApp); 
    GC.Collect(); 
} 

Этот код вызывается несколькими потоками за раз, и он работает почти всегда. Даже процессы Excel исчезают в диспетчере задач.

Однако иногда System.Runtime.InteropServices.COMException выбрасывается в wb.Close(true, targetFilename, Type.Missing). Он утверждает, что доступ к целевому имени файла был отклонен. Хотя я убедился, что целевые имена файлов уникальны.

Может быть исключение из-за плохой обработки Excel или, может быть, я использую потоки?

ответ

0

Видимо, targetFilename не был действительно уникальным. Было одно единственное различие в написании верхнего/нижнего регистра, и кажется, что два потока попытались сразу записать один и тот же файл. Вопрос был легко разрешен с использованием targetFilename.ToLower().

В любом случае, если вы обнаружите дальнейшие потенциальные проблемы, оставьте комментарий.

Смежные вопросы