2013-10-01 2 views
1

Я пытаюсь открыть и сохранить документ Excel на C#, но всегда получаю сообщение об ошибке: «COM-объект, который был отделен от его базового RCW, не может быть использован». на линии ExcelApp.Quit(); Я googled множество решений, но пока никто не работает для меня.Открыть и сохранить документ excel в C#

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Microsoft.Office.Core; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace test_excel 
{ 
    public partial class Form1 : Form 
    { 

     Excel.Application ExcelApp = null; 
     Excel.Workbook ExcelWorkBook = null; 
     Excel.Sheets ExcelSheets = null; 

     Excel.Worksheet MySheet = null; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      ExcelApp = new Excel.Application(); 
      ExcelApp.Visible = false; 
      ExcelWorkBook = ExcelApp.Workbooks.Open("c:\\test.xls", 0, true, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); 

      ExcelSheets = ExcelWorkBook.Worksheets; 
      MySheet = (Excel.Worksheet)ExcelSheets.get_Item("Sheet1"); 

      int a = (int)MySheet.Range["a1"].Value2; 
      label1.Visible = true; 
      int b = a + 1; 

      label1.Text = a.ToString() + " | " + b.ToString(); 
      MySheet.Range["a1"].Value2 = b; 



     } 
     private void releaseObject(object obj) 
     { 
      try 
      { 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
       obj = null; 
      } 
      catch (Exception ex) 
      { 
       obj = null; 
       MessageBox.Show("Unable to release the Object " + ex.ToString()); 
      } 
      finally 
      { 
       GC.Collect(); 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelSheets); 


       ExcelWorkBook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value); 
       releaseObject(ExcelApp); 
       releaseObject(ExcelSheets); 
       releaseObject(ExcelWorkBook); 
       ExcelApp.Visible = false; 
       ExcelApp.UserControl = false; 

       ExcelWorkBook.SaveAs("c:\\test.xls", Excel.XlFileFormat.xlWorkbookNormal, 
          null, null, false, false, Excel.XlSaveAsAccessMode.xlShared, 
          false, false, null, null, null); 
       ExcelWorkBook.Close(); 
      } 
      catch (Exception err) 
      { 
       String msg; 
       msg = "Error: "; 
       msg = String.Concat(msg, err.Message); 
       msg = String.Concat(msg, " Line: "); 
       msg = String.Concat(msg, err.Source); 
       Console.WriteLine(msg); 
      } 
      finally 
      { 

       try 
       { 


        ExcelApp.Visible = false; 
        ExcelApp.UserControl = false; 
        ExcelWorkBook.Close(true, null, null); 
        ExcelApp.Workbooks.Close(); 
       } 
       catch { } 


       ExcelApp.Quit(); 


       if (MySheet != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(MySheet); } 
       if (ExcelWorkBook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorkBook); } 
       if (ExcelApp != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp); } 


       MySheet = null; 
       ExcelWorkBook = null; 
       ExcelApp = null; 
       GC.Collect(); 
      } 
     } 
    } 
} 
+0

Вы видели это [сообщение] (h TTP: //stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects)? –

ответ

3

Я думаю, что вы вызывая ExcelApp получить GC «d здесь: releaseObject(ExcelApp);

Тогда вы пытаетесь сказать ему, чтобы выполнить метод здесь: ExcelApp.Quit();

Попробуйте перевести releaseObject(ExcelApp); по телефону Quit

+0

Я пробовал то, что вы написали, и нет ошибки, но мое приложение все равно не будет писать и сохранять, чтобы преуспеть. Не могли бы вы помочь мне? – Krkec

+1

Если мой ответ разрешил ваш вопрос, пожалуйста, переверните и выберите его в качестве ответа. Что касается написания Excel, ваш вопрос выше не имеет ничего общего с написанием или сохранением. Пожалуйста, откройте еще один вопрос, связанный с вашей проблемой. – Khan

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