2013-10-15 4 views
0

У меня есть код, который считывает данные из excel с помощью Interop.Excel. Проблема в том, что во второй раз, когда я вызываю метод записи, кажется, что он сохраняется в другой копии, и только первый вызов фактически записывает данные в исходный файл excel. Похоже, что объект interop не будет правильно очищаться.Сохранить данные в Excel C#

Это методы чтения/записи

public class ExcelHelper 
{ 
    Microsoft.Office.Interop.Excel.Application excelApp; 
    static AppSettingsReader settingsReader = new AppSettingsReader(); 


    public string[,] getExcelInfo(string excelFileName) 
    { 

     string[,] dataArray; 

     string logfileName = settingsReader.GetValue("LogFileName", typeof(string)).ToString(); 
     string logDirectory = settingsReader.GetValue("LogDirectory", typeof(string)).ToString(); 
     string logLevel = settingsReader.GetValue("LogLevel", typeof(string)).ToString(); 

     Logger.Log(logfileName, logDirectory, logLevel, "Getting File " + excelFileName); 

     Workbook wb = excelApp.Workbooks.Open(excelFileName,null,true); 
     Microsoft.Office.Interop.Excel._Worksheet xlWorksheet = (Microsoft.Office.Interop.Excel._Worksheet)wb.Sheets[1]; 

     Worksheet ws = wb.Worksheets[1]; 

     Range range = ws.UsedRange; 

     dataArray = new string[range.Rows.Count, range.Columns.Count]; 

     string str = string.Empty; 
     int rCnt = 0; 
     int cCnt = 0; 

     for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++) 
     { 
      for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++) 
      { 



       dataArray[rCnt - 1, cCnt - 1] = System.Convert.ToString((range.Cells[rCnt, cCnt] as Range).Value2); 




      } 
     } 

     wb.Close(); 


     releaseObject(range); 
     releaseObject(ws); 
     releaseObject(wb); 



     return dataArray; 


    } 


    public static int WritePRSIdToExcel(int PRSInt, int line) 
    { 


     string excelApp = ConfigurationManager.AppSettings["excelFileName"]; 


     // Application excel = (Application)Marshal.GetActiveObject("Excel.Application"); 
     _Application docExcel = (Application)Marshal.GetActiveObject("Excel.Application"); 
     docExcel.Visible = false; 
     docExcel.DisplayAlerts = false; 

     _Workbook workbooksExcel = docExcel.Workbooks.Open(excelApp, null, true); 
     _Worksheet worksheetExcel = (_Worksheet)workbooksExcel.ActiveSheet; 


     Range range = worksheetExcel.UsedRange; 


     string str; 

     str = (string)(range.Cells[line, 3] as Microsoft.Office.Interop.Excel.Range).Value2; 



     if (!(str == null)) 
     { 

      ((Range)worksheetExcel.Cells[line + 1, 5]).Value2 = PRSInt; 

      workbooksExcel.Save(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      workbooksExcel.Close(false, Type.Missing, Type.Missing); 
      docExcel.Quit(); 
      docExcel.Application.DisplayAlerts = true; 
      Marshal.ReleaseComObject(workbooksExcel); 
      Marshal.ReleaseComObject(docExcel); 
      Marshal.ReleaseComObject(worksheetExcel); 
      Marshal.ReleaseComObject(range); 

     } 



     return PRSInt; 


    } 

Это метод, чтобы прочитать данные, которые были записаны в в клетку:

public class GetIDNumber 
{ 
    static AppSettingsReader settingsReader = new AppSettingsReader(); 



    static void Main(string[] args) 
    { 
     ExcelHelper excelHelper = new ExcelHelper(); 



     /// <summary> 
     /// Log settings 
     /// </summary> 
     string logfileName = settingsReader.GetValue("LogFileName", typeof(string)).ToString(); 
     string logDirectory = settingsReader.GetValue("LogDirectory", typeof(string)).ToString(); 
     string logLevel = settingsReader.GetValue("LogLevel", typeof(string)).ToString(); 

     string excelFileName = settingsReader.GetValue("ExcelFileName", typeof(string)).ToString(); 
     string TeamProjectName = settingsReader.GetValue("TeamProject", typeof(string)).ToString(); 

     excelHelper.InitExcel(); 

     tfsHelper.Connect(); 

     string[,] dataArray = excelHelper.getExcelInfo(excelFileName); 



     //handle data 


     const int START_ROW = 1; 
     const int PRODUCT_REQUIRMENT_TITLE_COL = 2; 
     const int REQ_DESC = 3; 
     const int WORKITEM_ID_COL = 4; 
     const int REQUIRMENT_ACV_ID_COL = 5; 
     const int RISK_COL = 6; 

     int TFSId = 0;  
     int PRSId = 0; 



     while (line < dataArray.GetLength(0)) 
     { 

      line++; 



        if (!string.IsNullOrEmpty(dataArray[line, REQ_DESC])) 
        { 

            string TfsId = string.Empty; 

            TfsId = ((dataArray[line, 4])); 

        } 

      } 






enter code here 
+0

Не уверен, что я понимаю вашу проблему. Неужели процесс Excel остается в фоновом режиме? – Nick

+0

Проблема - это только время, когда я вызываю метод, когда значение (число) сохраняется. код работал без каких-либо исключений в другой раз, и я предполагаю, что он сохраняется в другом процессе Excel. –

ответ

1

Have вы ступили через отладку, чтобы убедиться, 're str не равно нулю при втором запуске? Если это так, книга не будет сохранена и процесс не будет завершен.

Возможно, вы должны выполнить очистку Excel в выражении «finally», а не в «if».

+0

Да. non из значений недействительны. Тем не менее, я получаю исключение void, когда пытаюсь прочитать значение из файла: string Id = string.Empty; Id = ((dataArray [строка, 4])); и он не будет писать в excel во второй раз, когда вызывается метод: –

+0

@OrenAshkenazy Когда вы получаете исключение? Я не вижу Id или dataArray в вашем опубликованном коде. – Kim

+0

Я добавил остальную часть кода. Я получаю исключение во втором методе при попытке получить данные ячейки, которые я пытался добавить с помощью WritePRSIdToExcel. –

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