2013-10-15 70 views
0

我有一個代碼,使用Interop.Excel從Excel中讀取數據。 問題是,當我第二次調用寫入方法時,它似乎正在保存在另一個副本中,而第一次調用實際上是將數據寫入原始excel文件。看起來互操作對象不能正確清理。保存數據到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

你有沒有通過調試加強,以確保您在第二次運行中,re str是不是等於null?如果是這種情況,工作簿將不會保存,並且過程不會結束。

您應該在「finally」語句而不是「if」中執行Excel清理。

+0

是的。非值的值是無效的。但是,當我嘗試讀取文件中的值時,我會收到一個無效的異常:string Id = string.Empty; Id =((dataArray [line,4]));並且它不會在第二次調用該方法時寫入Excel: –

+0

@OrenAshkenazy您何時得到異常?我在發佈的代碼中看不到Id或dataArray。 – Kim

+0

我已經添加了其餘的代碼。嘗試獲取我想要使用WritePRSIdToExcel添加的單元格數據時,第二種方法出現異常。 –