2013-02-26 77 views
0

我有一个多线程应用程序。应用程序的一个属性是报告。断开上下文Excel Com对象

用户可以起一年数据一天

我取的数据库,得到的结果的列表。然后使用Excel(作为COM对象)。

Excel打开并且单元格值开始从列表中添加。

尽管这些方法会突然我得到这个消息:

The Error

这里是我的excel代码报告:

private void RNReportDensityStatistics(List<object[]> _PlateBasedDensityStaticticsList) 
     { 
      try 
      { 
       RNTakeReportButton.Enabled = false; 
       RNExcelApp = new RNExcel.Application(); 
       RNExcelApp.Visible = false; 
       RNWorkBook = RNExcelApp.Workbooks.Add(); 
       RNWorkSheet = (RNExcel.Worksheet)RNExcelApp.ActiveSheet; 
       RNExcelApp.DisplayAlerts = false; 

       RNProgressBar.Visible = true; 
       RNProgressBar.Minimum = 0; 
       RNProgressBar.Maximum = _PlateBasedDensityStaticticsList.Count; 
       RNProgressBar.Value = 0; 
       RNProgressBar.Step = 1; 

       RNExcelApp.Range["A2"].Value = GetGUIItemString(GUIItemIndex.RNReportDensityStatisticsAutoParkPlate); 
       RNExcelApp.Range["B2"].Value = GetGUIItemString(GUIItemIndex.RNReportDensityStatisticsAutoParkEntryTime); 
       RNExcelApp.Range["C2"].Value = GetGUIItemString(GUIItemIndex.RNReportDensityStatisticsAutoParkExitTime); 
       RNExcelApp.Range["D2"].Value = GetGUIItemString(GUIItemIndex.RNReportDensityStatisticsAutoParkCameraIP); 
       RNExcelApp.Range["E2"].Value = GetGUIItemString(GUIItemIndex.RNReportDensityStatisticsAutoParkSpaceNo); 

       RNWorkSheet.Columns[1].AutoFit(); 
       RNWorkSheet.Columns[2].AutoFit(); 
       RNWorkSheet.Columns[3].AutoFit(); 
       RNWorkSheet.Columns[4].AutoFit(); 
       RNWorkSheet.Columns[5].AutoFit(); 

       var row = 2; 
       foreach (var DensityStatistics in _PlateBasedDensityStaticticsList) 
       { 
        row++; 
        RNWorkSheet.Cells[row, "A"] = DensityStatistics[4]; 
        RNWorkSheet.Cells[row, "B"] = ConvertEpochToDateTime(Convert.ToUInt64(DensityStatistics[2])); 
        RNWorkSheet.Cells[row, "C"] = ConvertEpochToDateTime(Convert.ToUInt64(DensityStatistics[3])); 
        RNWorkSheet.Cells[row, "D"] = DensityStatistics[0]; 
        RNWorkSheet.Cells[row, "E"] = DensityStatistics[1];      
        RNProgressBar.PerformStep(); 
       } 

       RNWorkSheet.Columns[1].AutoFit(); 
       RNWorkSheet.Columns[2].AutoFit(); 
       RNWorkSheet.Columns[3].AutoFit(); 
       RNWorkSheet.Columns[4].AutoFit(); 
       RNWorkSheet.Columns[5].AutoFit(); 

       string RNExcelReportPath = RNExcelReportPathStartingAdress 
        + GetGUIItemString(GUIItemIndex.RNReportPathNameAsPlate) 
        + RNPlateSearchTextBox.Text + " " 
        + GetGUIItemString(GUIItemIndex.RNReportPathNameAsDensity) 
             + ".xlsx"; 
       RNWorkBook.SaveAs(RNExcelReportPath, 
            misValue, 
            RNExcelPassword, 
            misValue, 
            misValue, 
            misValue, 
            RNExcel.XlSaveAsAccessMode.xlExclusive, 
            misValue, 
            misValue, 
            misValue, 
            misValue, 
            misValue); 

       RNWorkBook.Close(true, misValue, misValue); 
       RNExcelApp.Application.Quit(); 
       RNExcelApp.Quit(); 

       RNReleaseObject(RNWorkSheet); 
       RNReleaseObject(RNWorkBook); 
       RNReleaseObject(RNExcelApp); 

       RNTakeReportButton.Enabled = true; 
       AddLog(LogIndex.RNReportDensityStatisticsSuc, RNExcelReportPath, string.Empty, string.Empty); 

      } 
      catch (Exception ex) 
      { 
       RNReleaseObject(RNWorkSheet); 
       RNReleaseObject(RNWorkBook); 
       RNReleaseObject(RNExcelApp); 
       AddException(ex.ToString()); 
       RNTakeReportButton.Enabled = true; 
       AddLog(LogIndex.RNReportDensityStatisticsFail, string.Empty, string.Empty, string.Empty); 
      } 
      finally 
      { 
       RNReleaseObject(RNWorkSheet); 
       RNReleaseObject(RNWorkBook); 
       RNReleaseObject(RNExcelApp); 
       RNTakeReportButton.Enabled = true; 

       RNProgressBar.Value = _PlateBasedDensityStaticticsList.Count; 
       RNProgressBar.Update(); 
      } 
     } 

     private void RNReleaseObject(object obj) 
     { 
      try 
      { 
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj); 

       if (System.Runtime.InteropServices.Marshal.AreComObjectsAvailableForCleanup()) 
       { 
        System.Runtime.InteropServices.Marshal.CleanupUnusedObjectsInCurrentContext(); 
       } 

       obj = null; 
      } 
      catch (Exception ex) 
      { 
       obj = null; 
       AddTrace("Unable to release the Object "); 
       AddException(ex.ToString()); 
      } 
      finally 
      { 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
      } 
     } 
+0

谢谢彼得,我是新的关于这个问题,所以我犯了错误,而我想分享我的代码,非常感谢 – 2013-02-26 20:19:14

回答

0

没有必要使用COM对象的报告。我通过不使用com对象来使用excel进行报告来解决我的问题。

有报告,并使用Excel进行不同的工具它

  1. 的Open XML SDK:http://www.microsoft.com/en-us/download/details.aspx?id=5124

文档http://msdn.microsoft.com/en-us/library/bb491088(v=office.14).aspx

  1. 如果打开XML SDK语法对你来说很难再您可以使用:http://spreadsheetlight.com/

文档非常好,文森特(http://spreadsheetlight.com/about/)对您的问题真的很有帮助。

  1. 如果您的应用程序并不需要某种形式的图表,那么你可以使用:http://closedxml.codeplex.com/

两个spreadsheetlight和封闭的XML是基于Open XML SDK,并从我的经验,我没有任何形式的断开连接问题。

如果您需要保护您的excel文件,您可以使用:http://dotnetzip.codeplex.com/ 您有密码保护的压缩xlsx文件。

因此,您不需要在计算机中使用COM对象,互操作服务和Excel.Exe。

我希望这些建议是有益的,谢谢所有谁开发SpreadSheetLight和关闭XML和Open XML

+0

你可以通过点击绿色的勾号来接受你自己的答案.... – 2015-06-15 14:07:20