0

マルチスレッドアプリケーションがあります。アプリケーションのプロパティの 1 つはレポートです。

ユーザーは、1 年間のデータを毎日取得できます

データベースをフェッチし、結果をリストに取得します。次に、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 オブジェクトを使用する必要はありません。レポートにExcelを使用するためにcomオブジェクトを使用しないことで問題を解決しました。

レポート用のさまざまなツールがあり、そのために 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. Open XML SDK 構文が難しい場合は、http ://spreadsheetlight.com/ を使用できます。

ドキュメンテーションは非常に充実しており、Vincent ( 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 に答える