0

我有一个多线程应用程序。应用程序的属性之一是报告。

用户可以每天获取一年的数据

我获取数据库,将结果放到列表中。然后使用 Excel(作为 com 对象)。

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

当这些过程突然发生时,我收到以下消息:

错误

这是我的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();
            }
        }
4

1 回答 1

0

无需使用 COM 对象进行报告。我通过不使用 com 对象来使用 excel 进行报告来解决我的问题。

有不同的工具用于报告和使用 excel

  1. 打开 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. 如果 Open XML SDK 语法对您来说很难,那么您可以使用:http ://spreadsheetlight.com/

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

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

电子表格和封闭 XML 都基于 Open XML SDK,根据我的经验,我没有任何类型的断开连接问题。

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

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

我希望这些建议对您有所帮助,并感谢所有开发 SpreadSheetLight 和 Closed XML 和 Open XML 的人

于 2013-03-07T20:05:36.507 回答