From d02cb0d56ba21751ba95f6696d27c1f721f95154 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 26 Jan 2026 13:48:17 +0100 Subject: [PATCH] Changed all Excel access to read-only access if sheet is actually opened for reading. This should avoid errors when the sheet is still open in Excel. --- ENI2/Controls/MaerskListControl.xaml.cs | 3 ++- .../BorderPoliceDetailControl.xaml.cs | 12 ++++++++---- .../WasteDetailControl.xaml.cs | 3 ++- ENI2/Excel/ExcelBase.cs | 15 ++++++++++++++- ENI2/Excel/ExcelComparer.cs | 8 +++++--- ENI2/Excel/ExcelLocalImportHelper.cs | 6 ++++-- ENI2/Excel/ExcelReader.cs | 4 ++-- ENI2/Excel/ExcelWriter.cs | 4 ++-- .../CrewDepartureControl.xaml.cs | 3 ++- .../CrewPreArrivalControl.xaml.cs | 3 ++- .../PassengerDepartureControl.xaml.cs | 3 ++- .../PassengerPreArrivalControl.xaml.cs | 3 ++- ENI2/SheetDisplayControls/PortControl.xaml.cs | 3 ++- bsmd.ExcelReadService/ExcelReader.cs | 18 +++++++++++++++++- 14 files changed, 66 insertions(+), 22 deletions(-) diff --git a/ENI2/Controls/MaerskListControl.xaml.cs b/ENI2/Controls/MaerskListControl.xaml.cs index a4d275b6..f3630fab 100644 --- a/ENI2/Controls/MaerskListControl.xaml.cs +++ b/ENI2/Controls/MaerskListControl.xaml.cs @@ -338,7 +338,8 @@ namespace ENI2.Controls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row diff --git a/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs b/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs index 91608b6f..0cb64f10 100644 --- a/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs +++ b/ENI2/DetailViewControls/BorderPoliceDetailControl.xaml.cs @@ -1051,7 +1051,8 @@ namespace ENI2.DetailViewControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present @@ -1121,7 +1122,8 @@ namespace ENI2.DetailViewControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present @@ -1192,7 +1194,8 @@ namespace ENI2.DetailViewControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present @@ -1268,7 +1271,8 @@ namespace ENI2.DetailViewControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present diff --git a/ENI2/DetailViewControls/WasteDetailControl.xaml.cs b/ENI2/DetailViewControls/WasteDetailControl.xaml.cs index d3fe3ea7..140681b5 100644 --- a/ENI2/DetailViewControls/WasteDetailControl.xaml.cs +++ b/ENI2/DetailViewControls/WasteDetailControl.xaml.cs @@ -485,7 +485,8 @@ namespace ENI2.DetailViewControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(3); // Skip first three rows diff --git a/ENI2/Excel/ExcelBase.cs b/ENI2/Excel/ExcelBase.cs index 7c54a00d..b19dea3a 100644 --- a/ENI2/Excel/ExcelBase.cs +++ b/ENI2/Excel/ExcelBase.cs @@ -9,6 +9,7 @@ using System.Globalization; using System.Text.RegularExpressions; using System.Drawing; using System.Linq; +using System.IO; namespace ENI2.Excel { @@ -22,6 +23,7 @@ namespace ENI2.Excel protected CountryMode _countryMode = CountryMode.DE; protected XLWorkbook _workBook; + protected FileStream _workBookStream; protected Dictionary _nameDict; protected ILog _log; @@ -101,6 +103,12 @@ namespace ENI2.Excel } } + protected void OpenWorkbookReadOnly(string path) + { + _workBookStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + _workBook = new XLWorkbook(_workBookStream); + } + private static double? ParseAnyDouble(string val) { double? result = null; @@ -212,6 +220,11 @@ namespace ENI2.Excel _workBook.Dispose(); _workBook = null; } + if (_workBookStream != null) + { + _workBookStream.Dispose(); + _workBookStream = null; + } } catch (Exception ex) { @@ -222,4 +235,4 @@ namespace ENI2.Excel #endregion } -} \ No newline at end of file +} diff --git a/ENI2/Excel/ExcelComparer.cs b/ENI2/Excel/ExcelComparer.cs index 6db1ae7e..28f32595 100644 --- a/ENI2/Excel/ExcelComparer.cs +++ b/ENI2/Excel/ExcelComparer.cs @@ -53,8 +53,10 @@ namespace ENI2.Excel { File.Copy(targetPath, comparisonFileName, true); - using (var sourceWorkbook = new XLWorkbook(sourcePath)) - using (var comparisonWorkbook = new XLWorkbook(comparisonFileName)) + using (var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var sourceWorkbook = new XLWorkbook(sourceStream)) + using (var comparisonStream = new FileStream(comparisonFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var comparisonWorkbook = new XLWorkbook(comparisonStream)) { // Es werden Zellen der "used range" miteinander verglichen foreach (var sourceSheet in sourceWorkbook.Worksheets) @@ -152,4 +154,4 @@ namespace ENI2.Excel return comparisonFileName; } } -} \ No newline at end of file +} diff --git a/ENI2/Excel/ExcelLocalImportHelper.cs b/ENI2/Excel/ExcelLocalImportHelper.cs index 84545948..e013ae6e 100644 --- a/ENI2/Excel/ExcelLocalImportHelper.cs +++ b/ENI2/Excel/ExcelLocalImportHelper.cs @@ -26,7 +26,8 @@ namespace ENI2.Excel { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); var rows = worksheet.RangeUsed().RowsUsed(); @@ -144,7 +145,8 @@ namespace ENI2.Excel { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); var rows = worksheet.RangeUsed().RowsUsed(); diff --git a/ENI2/Excel/ExcelReader.cs b/ENI2/Excel/ExcelReader.cs index 8a5c8edf..941ac9c4 100644 --- a/ENI2/Excel/ExcelReader.cs +++ b/ENI2/Excel/ExcelReader.cs @@ -32,7 +32,7 @@ namespace ENI2.Excel public ExcelReader(string filePath, bool createNameFields = true) { - this._workBook = new XLWorkbook(filePath); + this.OpenWorkbookReadOnly(filePath); if (createNameFields) this.InitNameFields(); @@ -793,4 +793,4 @@ namespace ENI2.Excel #endregion Dakosy-specific functions } -} \ No newline at end of file +} diff --git a/ENI2/Excel/ExcelWriter.cs b/ENI2/Excel/ExcelWriter.cs index de1c3ab7..34db3b88 100644 --- a/ENI2/Excel/ExcelWriter.cs +++ b/ENI2/Excel/ExcelWriter.cs @@ -26,7 +26,7 @@ namespace ENI2.Excel if (isRefSheet) filename = @"Excel\Reference_Sheet_DE.xlsx"; string refFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, filename); - this._workBook = new XLWorkbook(refFilePath); + this.OpenWorkbookReadOnly(refFilePath); this.InitNameFields(); } @@ -1426,4 +1426,4 @@ namespace ENI2.Excel #endregion } -} \ No newline at end of file +} diff --git a/ENI2/SheetDisplayControls/CrewDepartureControl.xaml.cs b/ENI2/SheetDisplayControls/CrewDepartureControl.xaml.cs index 0f186fbd..c3d9e323 100644 --- a/ENI2/SheetDisplayControls/CrewDepartureControl.xaml.cs +++ b/ENI2/SheetDisplayControls/CrewDepartureControl.xaml.cs @@ -128,7 +128,8 @@ namespace ENI2.SheetDisplayControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present diff --git a/ENI2/SheetDisplayControls/CrewPreArrivalControl.xaml.cs b/ENI2/SheetDisplayControls/CrewPreArrivalControl.xaml.cs index 0bf4e98f..57d89f44 100644 --- a/ENI2/SheetDisplayControls/CrewPreArrivalControl.xaml.cs +++ b/ENI2/SheetDisplayControls/CrewPreArrivalControl.xaml.cs @@ -168,7 +168,8 @@ namespace ENI2.SheetDisplayControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present diff --git a/ENI2/SheetDisplayControls/PassengerDepartureControl.xaml.cs b/ENI2/SheetDisplayControls/PassengerDepartureControl.xaml.cs index 8e93f552..5abb1965 100644 --- a/ENI2/SheetDisplayControls/PassengerDepartureControl.xaml.cs +++ b/ENI2/SheetDisplayControls/PassengerDepartureControl.xaml.cs @@ -146,7 +146,8 @@ namespace ENI2.SheetDisplayControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present diff --git a/ENI2/SheetDisplayControls/PassengerPreArrivalControl.xaml.cs b/ENI2/SheetDisplayControls/PassengerPreArrivalControl.xaml.cs index 8beaa753..8bbb5361 100644 --- a/ENI2/SheetDisplayControls/PassengerPreArrivalControl.xaml.cs +++ b/ENI2/SheetDisplayControls/PassengerPreArrivalControl.xaml.cs @@ -128,7 +128,8 @@ namespace ENI2.SheetDisplayControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(1); // Skip header row if present diff --git a/ENI2/SheetDisplayControls/PortControl.xaml.cs b/ENI2/SheetDisplayControls/PortControl.xaml.cs index 988fca9e..2a9e957d 100644 --- a/ENI2/SheetDisplayControls/PortControl.xaml.cs +++ b/ENI2/SheetDisplayControls/PortControl.xaml.cs @@ -520,7 +520,8 @@ namespace ENI2.SheetDisplayControls { try { - using (var workbook = new XLWorkbook(ofd.FileName)) + using (var stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var workbook = new XLWorkbook(stream)) { var worksheet = workbook.Worksheet(1); // Get first worksheet var rows = worksheet.RangeUsed().RowsUsed().Skip(3); // Skip first three rows diff --git a/bsmd.ExcelReadService/ExcelReader.cs b/bsmd.ExcelReadService/ExcelReader.cs index f344d063..b7f68eb2 100644 --- a/bsmd.ExcelReadService/ExcelReader.cs +++ b/bsmd.ExcelReadService/ExcelReader.cs @@ -36,7 +36,23 @@ namespace bsmd.ExcelReadService this._excelApp.DisplayAlerts = false; this._excelWorkbooks = _excelApp.Workbooks; - this._portcall = _excelWorkbooks.Open(filePath, 0, true, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false); + this._portcall = _excelWorkbooks.Open( + filePath, + UpdateLinks: 0, + ReadOnly: true, + Format: 5, + Password: "", + WriteResPassword: "", + IgnoreReadOnlyRecommended: true, + Origin: XlPlatform.xlWindows, + Delimiter: "", + Editable: false, + Notify: false, + Converter: 0, + AddToMru: false, + Local: false, + CorruptLoad: false); + this._portcall.ChangeFileAccess(XlFileAccess.xlReadOnly); _nameDict = new Dictionary(); int bookCnt = 0; foreach(Name name in _portcall.Names)