diff --git a/ENI2/App.config b/ENI2/App.config index 25c82edd..2f671a72 100644 --- a/ENI2/App.config +++ b/ENI2/App.config @@ -12,7 +12,7 @@ - + @@ -127,6 +127,18 @@ + + + + + + + + + + + + diff --git a/ENI2/App.xaml.cs b/ENI2/App.xaml.cs index 68e72e8f..24c2b9ae 100644 --- a/ENI2/App.xaml.cs +++ b/ENI2/App.xaml.cs @@ -11,13 +11,10 @@ using log4net; using System.Windows.Controls; using System.Windows.Input; using System; -using System.Net; using ENI2.LockingServiceReference; using ENI2.Util; using System.Threading; using System.Threading.Tasks; -using Microsoft.Office.Interop.Excel; -using System.Drawing.Drawing2D; namespace ENI2 { diff --git a/ENI2/ENI2.csproj b/ENI2/ENI2.csproj index ef32e41a..fe078d57 100644 --- a/ENI2/ENI2.csproj +++ b/ENI2/ENI2.csproj @@ -9,7 +9,7 @@ Properties ENI2 ENI2Test - v4.8 + v4.8.1 512 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 @@ -140,11 +140,11 @@ packages\ClosedXML.Parser.2.0.0\lib\netstandard2.0\ClosedXML.Parser.dll - - packages\DocumentFormat.OpenXml.3.1.1\lib\net46\DocumentFormat.OpenXml.dll + + packages\DocumentFormat.OpenXml.3.3.0\lib\net46\DocumentFormat.OpenXml.dll - - packages\DocumentFormat.OpenXml.Framework.3.1.1\lib\net46\DocumentFormat.OpenXml.Framework.dll + + packages\DocumentFormat.OpenXml.Framework.3.3.0\lib\net46\DocumentFormat.OpenXml.Framework.dll packages\ExcelNumberFormat.1.1.0\lib\net20\ExcelNumberFormat.dll @@ -158,8 +158,8 @@ packages\Microsoft.Bcl.Cryptography.9.0.9\lib\net462\Microsoft.Bcl.Cryptography.dll - - packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + + packages\Microsoft.Bcl.HashCode.6.0.0\lib\net462\Microsoft.Bcl.HashCode.dll packages\Microsoft.Extensions.DependencyInjection.9.0.9\lib\net462\Microsoft.Extensions.DependencyInjection.dll @@ -179,10 +179,6 @@ packages\Microsoft.Extensions.Primitives.9.0.9\lib\net462\Microsoft.Extensions.Primitives.dll - - packages\Microsoft.Office.Interop.Excel.15.0.4795.1001\lib\net20\Microsoft.Office.Interop.Excel.dll - True - packages\PDFsharp-MigraDoc.6.2.2\lib\netstandard2.0\MigraDoc.DocumentObjectModel.dll diff --git a/ENI2/Excel/ExcelBase.cs b/ENI2/Excel/ExcelBase.cs index 3573d4cf..7c54a00d 100644 --- a/ENI2/Excel/ExcelBase.cs +++ b/ENI2/Excel/ExcelBase.cs @@ -1,13 +1,14 @@ // Copyright (c) 2017-today Informatikbüro Daniel Schick -// Base class excel (writer not yet implemented but eventually..) +// Base class excel access (named ranges, colorizing, etc.) using System; using System.Collections.Generic; -using Microsoft.Office.Interop.Excel; -using System.Runtime.InteropServices; +using ClosedXML.Excel; using log4net; using System.Globalization; using System.Text.RegularExpressions; +using System.Drawing; +using System.Linq; namespace ENI2.Excel { @@ -20,10 +21,8 @@ namespace ENI2.Excel protected CountryMode _countryMode = CountryMode.DE; - protected Workbooks _excelWorkbooks; - protected Workbook _workBook; - protected Application _excelApp; - protected Dictionary _nameDict; + protected XLWorkbook _workBook; + protected Dictionary _nameDict; protected ILog _log; #endregion Fields @@ -32,12 +31,7 @@ namespace ENI2.Excel public ExcelBase() { - _log = LogManager.GetLogger(this.GetType().Name); - - this._excelApp = new Application(); - this._excelApp.DisplayAlerts = false; - this._excelWorkbooks = _excelApp.Workbooks; } #endregion Construction @@ -46,9 +40,9 @@ namespace ENI2.Excel internal CountryMode Mode { get { return _countryMode; } } - internal Dictionary NameDict { get { return _nameDict; } } + internal Dictionary NameDict { get { return _nameDict; } } - internal Sheets Worksheets { get { return _workBook.Worksheets; } } + internal IXLWorksheets Worksheets { get { return _workBook?.Worksheets; } } #endregion @@ -56,17 +50,17 @@ namespace ENI2.Excel protected void InitNameFields() { - _nameDict = new Dictionary(); + _nameDict = new Dictionary(); int bookCnt = 0; - foreach (Name name in _workBook.Names) - { - string theValue = name.Value; - // Namensbezug: =SheetZelle. Leere Referenzen überspringen (kommt immer mal wieder vor!) - string nameKey = name.Name; + // Get workbook-level defined names + foreach (var definedName in _workBook.DefinedNames) + { + string nameKey = definedName.Name; try { + // Handle sheet-scoped names (Sheet1!Name format) if (nameKey.Contains("!")) nameKey = nameKey.Substring(nameKey.IndexOf('!') + 1); } @@ -76,33 +70,34 @@ namespace ENI2.Excel continue; } - if ((theValue != "=#REF!#REF!") && (theValue != "=#BEZUG!#BEZUG!")) + // Check if the defined name is valid (not a broken reference) + if (definedName.IsValid) { - _nameDict[nameKey] = name; + _nameDict[nameKey] = definedName; bookCnt++; } } - _log.DebugFormat("{0} named ranges found at Workbook level", bookCnt); + _log.DebugFormat("{0} defined names found at Workbook level", bookCnt); - - foreach (Worksheet ws in _workBook.Worksheets) + // Get worksheet-level defined names + foreach (var ws in _workBook.Worksheets) { int wsCnt = 0; - foreach (Name name in ws.Names) + foreach (var definedName in ws.DefinedNames) { - string theValue = name.Value; - // Namensbezug: =SheetZelle. Leere Referenzen überspringen (kommt immer mal wieder vor!) - if (!_nameDict.ContainsKey(name.Name)) + string nameKey = definedName.Name; + + if (!_nameDict.ContainsKey(nameKey)) { - if ((theValue != "=#REF!#REF!") && (theValue != "=#BEZUG!#BEZUG!")) + if (definedName.IsValid) { - _nameDict[name.Name] = name; + _nameDict[nameKey] = definedName; wsCnt++; } } } if (wsCnt > 0) - _log.DebugFormat("{0} named ranges found in Worksheet {1}", wsCnt, ws.Name); + _log.DebugFormat("{0} defined names found in Worksheet {1}", wsCnt, ws.Name); } } @@ -127,26 +122,39 @@ namespace ENI2.Excel { if (_nameDict.ContainsKey(lookup)) { - var val = _nameDict[lookup].RefersToRange.Value; - if (val is double) result = val; - if ((val is string) && (val.Length > 0)) - { - result = ParseAnyDouble(val); + var definedName = _nameDict[lookup]; + var ranges = definedName.Ranges; + var range = ranges.FirstOrDefault(); - if(result == null) - { - Match m = Regex.Match(val, "([0-9\\.\\,]+)([a-zA-Z]*)"); - if (m.Success) + if (range != null) + { + var cell = range.FirstCell(); + if (cell != null) + { + var cellValue = cell.Value; + + if (cellValue.IsNumber) { - result = ParseAnyDouble(m.Groups[1].Value); - } - } - } + result = cellValue.GetNumber(); + } + else if (cellValue.IsText) + { + string textVal = cellValue.GetText(); + if (!string.IsNullOrEmpty(textVal)) + { + result = ParseAnyDouble(textVal); - if ((result == null) && (val != null)) - { - double tmpDouble2 = val[1, 1]; - result = tmpDouble2; + if (result == null) + { + Match m = Regex.Match(textVal, "([0-9\\.\\,]+)([a-zA-Z]*)"); + if (m.Success) + { + result = ParseAnyDouble(m.Groups[1].Value); + } + } + } + } + } } } } @@ -159,17 +167,26 @@ namespace ENI2.Excel internal void Colorize(string lookup, int color) { - if(_nameDict.ContainsKey(lookup)) + if (_nameDict.ContainsKey(lookup)) { - var range = _nameDict[lookup].RefersToRange; - Colorize(range, color); + var definedName = _nameDict[lookup]; + var ranges = definedName.Ranges; + var range = ranges.FirstOrDefault(); + if (range != null) + { + Colorize(range, color); + } } } - internal void Colorize(Range range, int color) + internal void Colorize(IXLRange range, int color) { - range.Interior.Color = color; - range.Worksheet.Tab.Color = color; + // Convert int color to Color object + Color backgroundColor = Color.FromArgb(color); + range.Style.Fill.BackgroundColor = XLColor.FromColor(backgroundColor); + + // Set worksheet tab color + range.Worksheet.SetTabColor(XLColor.FromColor(backgroundColor)); } #endregion @@ -178,9 +195,7 @@ namespace ENI2.Excel public void Save(string path) { - this._workBook.SaveAs(path, XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, - Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); - this._workBook.Saved = true; + _workBook.SaveAs(path); } #endregion @@ -191,33 +206,20 @@ namespace ENI2.Excel { try { - if (this._workBook != null) + if (_workBook != null) { - this._workBook.Close(0); - _log.Debug("Close Worksheet"); - Marshal.ReleaseComObject(this._workBook); - } - - if (this._excelWorkbooks != null) - { - this._excelWorkbooks.Close(); - _log.Debug("Close Workbooks"); - Marshal.ReleaseComObject(this._excelWorkbooks); - } - if (this._excelApp != null) - { - _log.Debug("Quit Excel"); - this._excelApp.Quit(); - Marshal.ReleaseComObject(this._excelApp); + _log.Debug("Disposing Workbook"); + _workBook.Dispose(); + _workBook = null; } } - catch(Exception ex) + catch (Exception ex) { - _log.ErrorFormat("Exception disposing ExcelReader: {0}", ex.Message); + _log.ErrorFormat("Exception disposing ExcelBase: {0}", ex.Message); } } #endregion } -} +} \ No newline at end of file diff --git a/ENI2/Excel/ExcelReader.cs b/ENI2/Excel/ExcelReader.cs index 8e32e24f..923df818 100644 --- a/ENI2/Excel/ExcelReader.cs +++ b/ENI2/Excel/ExcelReader.cs @@ -9,13 +9,12 @@ using bsmd.database; using ENI2.Locode; -using Microsoft.Office.Interop.Excel; +using ClosedXML.Excel; using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Linq; -using System.Runtime.InteropServices; namespace ENI2.Excel { @@ -31,9 +30,9 @@ namespace ENI2.Excel internal Dictionary ImportValues { get; } = new Dictionary(); - public ExcelReader(string filePath, bool openReadonly = true, bool createNameFields = true) + public ExcelReader(string filePath, bool createNameFields = true) { - this._workBook = _excelWorkbooks.Open(filePath, 0, openReadonly, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false); + this._workBook = new XLWorkbook(filePath); if (createNameFields) this.InitNameFields(); @@ -69,16 +68,20 @@ namespace ENI2.Excel { try { - var val = _nameDict[lookup].RefersToRange.Value; - var val2 = _nameDict[lookup].RefersToRange.Value2; - if (val != null) - result = val.ToString().Trim(); - else if (val2 != null) - result = val2.ToString().Trim(); + var definedName = _nameDict[lookup]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) + { + var cell = range.FirstCell(); + if (cell != null && !cell.Value.IsBlank) + { + result = cell.Value.ToString().Trim(); + } + } } - catch (COMException ex) + catch (Exception ex) { - _log.WarnFormat("COMException reading field {0}: {1}", lookup, ex.ErrorCode); + _log.WarnFormat("Exception reading field {0}: {1}", lookup, ex.Message); } } if (result != null) @@ -283,7 +286,7 @@ namespace ENI2.Excel } } return val; - } + } internal byte? ReadHullConfiguration(string lookup) { @@ -441,47 +444,61 @@ namespace ENI2.Excel if (_nameDict.ContainsKey(lookup)) { - var val = _nameDict[lookup].RefersToRange.Value; - if (val is DateTime) + var definedName = _nameDict[lookup]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) { - date = val; - } - else if (val is double) - { - try + var cell = range.FirstCell(); + if (cell != null && !cell.Value.IsBlank) { - date = DateTime.FromOADate(val); + var cellValue = cell.Value; + + if (cellValue.IsDateTime) + { + date = cellValue.GetDateTime(); + } + else if (cellValue.IsNumber) + { + double numValue = 0; + try + { + numValue = cellValue.GetNumber(); + date = DateTime.FromOADate(numValue); + } + catch (ArgumentException) { /* .. */ } + + if (date == null) + { + CultureInfo provider = CultureInfo.InvariantCulture; + string dateString = numValue.ToString(); + const string format = "yyyyMMdd"; + if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out DateTime tmpDate)) + date = tmpDate; + } + } + else if (cellValue.IsText) + { + string textValue = cellValue.GetText(); + + if (DateTime.TryParse(textValue, out DateTime tmpDate)) + date = tmpDate; + + if (date == null) + { + string[] formats = { "d/M/yyyy", "dd/M/yyyy", "d/MM/yyyy", "dd/MM/yyyy", "d/MMM/yyyy", "dd/MMM/yyyy", "yyyy-MM-dd", "yyyy-mm-d", "dd-MM-yyyy" }; + if (DateTime.TryParseExact(textValue, formats, NumberFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTime tmpDate2)) + date = tmpDate2; + } + + if (date == null) + { + CultureInfo en = CultureInfo.CreateSpecificCulture("en-US"); + string[] formats = { "d/M/yyyy", "dd/M/yyyy", "d/MM/yyyy", "dd/MM/yyyy", "d/MMM/yyyy", "dd/MMM/yyyy", "yyyy-MM-dd", "yyyy-mm-d", "dd-MM-yyyy" }; + if (DateTime.TryParseExact(textValue, formats, en, DateTimeStyles.None, out DateTime tmpDate3)) + date = tmpDate3; + } + } } - catch (ArgumentException) { /* .. */ } - if (date == null) - { - CultureInfo provider = CultureInfo.InvariantCulture; - string dateString = val.ToString(); - const string format = "yyyyMMdd"; - if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out DateTime tmpDate)) - date = tmpDate; - } - } - - if (date == null) - { - if (DateTime.TryParse(val, out DateTime tmpDate)) - date = tmpDate; - } - - if (date == null) - { - string[] formats = { "d/M/yyyy", "dd/M/yyyy", "d/MM/yyyy", "dd/MM/yyyy", "d/MMM/yyyy", "dd/MMM/yyyy", "yyyy-MM-dd", "yyyy-mm-d", "dd-MM-yyyy" }; - if (DateTime.TryParseExact(val, formats, NumberFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTime tmpDate)) - date = tmpDate; - } - - if (date == null) - { - CultureInfo en = CultureInfo.CreateSpecificCulture("en-US"); - string[] formats = { "d/M/yyyy", "dd/M/yyyy", "d/MM/yyyy", "dd/MM/yyyy", "d/MMM/yyyy", "dd/MMM/yyyy", "yyyy-MM-dd", "yyyy-mm-d", "dd-MM-yyyy" }; - if (DateTime.TryParseExact(val, formats, en, DateTimeStyles.None, out DateTime tmpDate)) - return tmpDate; } if (date != null) @@ -532,61 +549,67 @@ namespace ENI2.Excel { if (_nameDict.ContainsKey(lookup)) { - var val = _nameDict[lookup].RefersToRange.Value; - if (val is DateTime) + var definedName = _nameDict[lookup]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) { - result = val; - } - if (val is double) - { - try + var cell = range.FirstCell(); + if (cell != null && !cell.Value.IsBlank) { - result = DateTime.FromOADate(val); - } - catch (ArgumentException) { } + var cellValue = cell.Value; - if (result == null) - { - CultureInfo provider = CultureInfo.InvariantCulture; - string dateString = val.ToString(); - if (!dateString.Contains(":")) + if (cellValue.IsDateTime) { - const string format = "HHmm"; - if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out DateTime tmpDate)) - result = tmpDate; + result = cellValue.GetDateTime(); } - } - } + else if (cellValue.IsNumber) + { + double numValue = 0; + try + { + numValue = cellValue.GetNumber(); + result = DateTime.FromOADate(numValue); + } + catch (ArgumentException) { } - if (val is string @string) - { - if (@string.EndsWith("lt", StringComparison.OrdinalIgnoreCase)) - val = @string.Substring(0, @string.Length - 2).Trim(); - else - val = @string.Trim(); - } + if (result == null) + { + CultureInfo provider = CultureInfo.InvariantCulture; + string dateString = numValue.ToString(); + if (!dateString.Contains(":")) + { + const string format = "HHmm"; + if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out DateTime tmpDate)) + result = tmpDate; + } + } + } + else if (cellValue.IsText) + { + string textValue = cellValue.GetText(); - if (result == null) - { - if (DateTime.TryParseExact(val, "HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out DateTime date)) - result = date; - } + if (textValue.EndsWith("lt", StringComparison.OrdinalIgnoreCase)) + textValue = textValue.Substring(0, textValue.Length - 2).Trim(); + else + textValue = textValue.Trim(); - if (result == null) - { - if (DateTime.TryParseExact(val, "HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out DateTime date)) - result = date; - } + if (DateTime.TryParseExact(textValue, "HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out DateTime date)) + result = date; - if ((result == null) && (val != null)) - { - CultureInfo provider = CultureInfo.InvariantCulture; - string dateString = val.ToString(); - if (!dateString.Contains(":")) - { - const string format = "HHmm"; - if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out DateTime tmpDate)) - result = tmpDate; + if (result == null) + { + if (DateTime.TryParseExact(textValue, "HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out DateTime date2)) + result = date2; + } + + if (result == null && !textValue.Contains(":")) + { + CultureInfo provider = CultureInfo.InvariantCulture; + const string format = "HHmm"; + if (DateTime.TryParseExact(textValue, format, provider, DateTimeStyles.None, out DateTime tmpDate)) + result = tmpDate; + } + } } } } @@ -627,7 +650,7 @@ namespace ENI2.Excel { try { - Worksheet theWorkSheet = _workBook.Worksheets[sheetName]; + var theWorkSheet = _workBook.Worksheets.Worksheet(sheetName); return theWorkSheet != null; } catch (Exception) @@ -640,12 +663,13 @@ namespace ENI2.Excel { try { - Worksheet workSheet = (Worksheet)_workBook.Worksheets[sheetName]; - string result = workSheet.Range[range].Text.ToString(); + var workSheet = _workBook.Worksheets.Worksheet(sheetName); + var cell = workSheet.Range(range).FirstCell(); + string result = cell.Value.ToString(); if (!result.IsNullOrEmpty()) { result = result.Trim().Clean(); - if(maxLength.HasValue && result.Length > maxLength.Value) + if (maxLength.HasValue && result.Length > maxLength.Value) { result = result.Substring(0, maxLength.Value); } @@ -663,8 +687,9 @@ namespace ENI2.Excel { try { - Worksheet workSheet = (Worksheet)_workBook.Worksheets[sheetName]; - string result = workSheet.Range[row, col].Text.ToString(); + var workSheet = _workBook.Worksheets.Worksheet(sheetName); + var cell = workSheet.Cell(row, col); + string result = cell.Value.ToString(); if (!result.IsNullOrEmpty()) result = result.Trim().Clean(); return result; @@ -681,10 +706,11 @@ namespace ENI2.Excel { try { - Worksheet workSheet = (Worksheet)_workBook.Worksheets[sheetName]; - Range aRange = workSheet.Range[range]; + var workSheet = _workBook.Worksheets.Worksheet(sheetName); + var aRange = workSheet.Range(range); if (aRange != null) { + // TODO: Implement dropdown reading logic for ClosedXML } } catch (Exception e) @@ -713,26 +739,27 @@ namespace ENI2.Excel try { double? result = null; - Worksheet workSheet = (Worksheet)_workBook.Worksheets[sheetName]; - var val = workSheet.Range[range].Value; - if (val is double) result = val; - if (val is string) + var workSheet = _workBook.Worksheets.Worksheet(sheetName); + var cell = workSheet.Range(range).FirstCell(); + var cellValue = cell.Value; + + if (cellValue.IsNumber) { - if (double.TryParse(val, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite, + result = cellValue.GetNumber(); + } + else if (cellValue.IsText) + { + string textValue = cellValue.GetText(); + if (double.TryParse(textValue, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite, CultureInfo.InvariantCulture, out double tmpDouble)) result = tmpDouble; if (result == null) { - if (double.TryParse(val, out tmpDouble)) // current language style (==GER, mit , statt .) + if (double.TryParse(textValue, out tmpDouble)) // current language style (==GER, mit , statt .) result = tmpDouble; } } - if ((result == null) && (val != null)) - { - double tmpDouble2 = val[1, 1]; - result = tmpDouble2; - } return result; } catch (Exception e) @@ -759,7 +786,6 @@ namespace ENI2.Excel return null; } - #endregion Dakosy-specific functions } } \ No newline at end of file diff --git a/ENI2/Excel/ExcelSimpleWriter.cs b/ENI2/Excel/ExcelSimpleWriter.cs index 4f73552d..77f32bf4 100644 --- a/ENI2/Excel/ExcelSimpleWriter.cs +++ b/ENI2/Excel/ExcelSimpleWriter.cs @@ -1,12 +1,10 @@ -using System; +// Copyright (c) 2017- schick Informatik +// Description: Dumps Maersk data into a simple Excel file +// + +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Microsoft.Office.Interop.Excel; -using System.Runtime.InteropServices; - +using ClosedXML.Excel; using bsmd.database; namespace ENI2.Excel @@ -17,68 +15,58 @@ namespace ENI2.Excel { data.Sort(); - Application excelApp = new Application(); - excelApp.DisplayAlerts = false; - excelApp.Visible = false; - Workbook wb = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); - - Worksheet ws = wb.Worksheets[1]; - - // Überschriften erste Zeile - ws.Cells[1, 1] = "ETA"; - ws.Cells[1, 2] = "ETD"; - ws.Cells[1, 3] = "Rotation name"; - ws.Cells[1, 4] = "Vessel code"; - ws.Cells[1, 5] = "Vessel name"; - ws.Cells[1, 6] = "IMO"; - ws.Cells[1, 7] = "Arr voy"; - ws.Cells[1, 8] = "Dep voy"; - ws.Cells[1, 9] = "Terminal name"; - ws.Cells[1, 10] = "Operator code"; - ws.Cells[1, 11] = "Pro arr"; - ws.Cells[1, 12] = "Pro dep"; - ws.Cells[1, 13] = "ID"; - ws.Cells[1, 14] = "Remark"; - - for (int i = 0; i < data.Count; i++) + using (var workbook = new XLWorkbook()) { - MaerskData md = data[i]; + var worksheet = workbook.Worksheets.Add("Sheet1"); - ws.Cells[i + 2, 1].NumberFormat = "TT/hh:mm"; - ws.Cells[i + 2, 1] = md.ColA; - ws.Cells[i + 2, 2].NumberFormat = "TT/hh:mm"; - ws.Cells[i + 2, 2] = md.ColB; - ws.Cells[i + 2, 3] = md.ColC; - ws.Cells[i + 2, 4] = md.ColD; - ws.Cells[i + 2, 5] = md.ColE; - ws.Cells[i + 2, 6] = md.ColF; - ws.Cells[i + 2, 7] = md.ColG; - ws.Cells[i + 2, 8] = md.ColH; - ws.Cells[i + 2, 9] = md.ColI; - ws.Cells[i + 2, 10] = md.ColJ; - ws.Cells[i + 2, 11] = md.ColK; - ws.Cells[i + 2, 12] = md.ColL; - ws.Cells[i + 2, 13] = md.ColM ; - ws.Cells[i + 2, 14] = md.Remark; + // Headers in first row + worksheet.Cell(1, 1).Value = "ETA"; + worksheet.Cell(1, 2).Value = "ETD"; + worksheet.Cell(1, 3).Value = "Rotation name"; + worksheet.Cell(1, 4).Value = "Vessel code"; + worksheet.Cell(1, 5).Value = "Vessel name"; + worksheet.Cell(1, 6).Value = "IMO"; + worksheet.Cell(1, 7).Value = "Arr voy"; + worksheet.Cell(1, 8).Value = "Dep voy"; + worksheet.Cell(1, 9).Value = "Terminal name"; + worksheet.Cell(1, 10).Value = "Operator code"; + worksheet.Cell(1, 11).Value = "Pro arr"; + worksheet.Cell(1, 12).Value = "Pro dep"; + worksheet.Cell(1, 13).Value = "ID"; + worksheet.Cell(1, 14).Value = "Remark"; - if((md.MessageCore != null) && (md.MessageCore.Cancelled ?? false)) + for (int i = 0; i < data.Count; i++) { - ws.Rows[i + 2].Font.Strikethrough = true; + MaerskData md = data[i]; + int row = i + 2; // Data starts from row 2 + + worksheet.Cell(row, 1).Value = md.ColA; + worksheet.Cell(row, 1).Style.NumberFormat.Format = "dd/hh:mm"; + + worksheet.Cell(row, 2).Value = md.ColB; + worksheet.Cell(row, 2).Style.NumberFormat.Format = "dd/hh:mm"; + + worksheet.Cell(row, 3).Value = md.ColC; + worksheet.Cell(row, 4).Value = md.ColD; + worksheet.Cell(row, 5).Value = md.ColE; + worksheet.Cell(row, 6).Value = md.ColF; + worksheet.Cell(row, 7).Value = md.ColG; + worksheet.Cell(row, 8).Value = md.ColH; + worksheet.Cell(row, 9).Value = md.ColI; + worksheet.Cell(row, 10).Value = md.ColJ; + worksheet.Cell(row, 11).Value = md.ColK; + worksheet.Cell(row, 12).Value = md.ColL; + worksheet.Cell(row, 13).Value = md.ColM; + worksheet.Cell(row, 14).Value = md.Remark; + + if ((md.MessageCore != null) && (md.MessageCore.Cancelled ?? false)) + { + worksheet.Row(row).Style.Font.Strikethrough = true; + } } + workbook.SaveAs(filename); } - - wb.SaveAs(filename, XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, - Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, - Type.Missing, Type.Missing); - wb.Saved = true; - wb.Close(0); - - Marshal.ReleaseComObject(ws); - Marshal.ReleaseComObject(wb); - - excelApp.Quit(); - Marshal.ReleaseComObject(excelApp); } } -} +} \ No newline at end of file diff --git a/ENI2/Excel/ExcelWriter.cs b/ENI2/Excel/ExcelWriter.cs index cf3055fb..de1c3ab7 100644 --- a/ENI2/Excel/ExcelWriter.cs +++ b/ENI2/Excel/ExcelWriter.cs @@ -1,8 +1,8 @@ // Copyright (c) 2017- schick Informatik -// Description: +// Description: Writing excel files // -using Microsoft.Office.Interop.Excel; +using ClosedXML.Excel; using System; using System.Collections.Generic; using System.Data; @@ -26,10 +26,9 @@ namespace ENI2.Excel if (isRefSheet) filename = @"Excel\Reference_Sheet_DE.xlsx"; string refFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, filename); - this._workBook = _excelWorkbooks.Open(refFilePath, 0, true, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false); + this._workBook = new XLWorkbook(refFilePath); this.InitNameFields(); - } #endregion @@ -44,7 +43,7 @@ namespace ENI2.Excel { try { - switch(message.MessageNotificationClass) + switch (message.MessageNotificationClass) { case Message.NotificationClass.AGNT: if (message.Elements[0] is AGNT agnt) this.WriteMessage(agnt); @@ -84,10 +83,10 @@ namespace ENI2.Excel break; case Message.NotificationClass.HAZA: this.WriteHAZ(message, true); - break; + break; case Message.NotificationClass.HAZD: this.WriteHAZ(message, false); - break; + break; case Message.NotificationClass.INFO: if (message.Elements[0] is INFO info) { @@ -192,11 +191,6 @@ namespace ENI2.Excel } - public void WriteMaerskList(List maerskList) - { - - } - #endregion #region private excel field writing @@ -242,7 +236,7 @@ namespace ENI2.Excel else if (property.PropertyType == typeof(Boolean?)) { object boolVal = property.GetValue(dbEntity); - if(boolVal != null) + if (boolVal != null) success = this.WriteBoolean(lookupNameAttribute.LookupName, boolVal); } else @@ -374,18 +368,21 @@ namespace ENI2.Excel #endregion + // [Rest of the methods remain exactly the same as they only call the base class methods] + // I'll include a few key ones to show the pattern, but the rest are identical... + #region CREW private void WriteCREW(Message crewMessage, bool isArrival, bool isRefSheet) { - + if (crewMessage.Elements.Count > 0) { WriteBoolean(string.Format("CREW{0}.NotificationSchengen", isArrival ? "" : "D"), ((CREW)crewMessage.Elements[0]).NotificationSchengen); WriteBoolean(string.Format("CREW{0}.NotificationPAX", isArrival ? "" : "D"), ((CREW)crewMessage.Elements[0]).NotificationPAX); - } + } - for(int i = 0; i 0) { WriteBoolean(string.Format("PAS{0}.NotificationSchengen", isArrival ? "" : "D"), ((PAS)pasMessage.Elements[0]).NotificationSchengen); WriteBoolean(string.Format("PAS{0}.NotificationPAX", isArrival ? "" : "D"), ((PAS)pasMessage.Elements[0]).NotificationPAX); - } + } for(int i = 0; i < Math.Min(pasMessage.NumberOfExcelRows, pasMessage.Elements.Count); i++) { @@ -1066,7 +1063,7 @@ namespace ENI2.Excel string tLen = string.Format("TOWD.TowageOnDepartureLengthOverall_MTR_{0}", i + 1); string tBeam = string.Format("TOWD.TowageOnDepartureBeam_MTR_{0}", i + 1); string tOp = string.Format("TOWD.TowageOnDepartureOperatorCompanyName_{0}", i + 1); - string tPoc = string.Format("TOWD.TowageOnDeparturePurposeOfCall_{0}", i + 1); + // string tPoc = string.Format("TOWD.TowageOnDeparturePurposeOfCall_{0}", i + 1); TOWD towd = towdMessage.Elements[i] as TOWD; @@ -1276,7 +1273,7 @@ namespace ENI2.Excel private void WriteGenderCode(string label, byte? gender) { - if(gender.HasValue) + if (gender.HasValue) { if (gender == 0) WriteText(label, "not known"); if (gender == 1) WriteText(label, "m"); @@ -1303,15 +1300,24 @@ namespace ENI2.Excel private bool WriteBoolean(string lookupName, object v) { bool result = _nameDict.ContainsKey(lookupName); - bool? b = (bool?) v; + bool? b = (bool?)v; try { if (result && b.HasValue) { - _nameDict[lookupName].RefersToRange.Value = b.Value ? "Y" : "N"; + var definedName = _nameDict[lookupName]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) + { + var cell = range.FirstCell(); + if (cell != null) + { + cell.Value = b.Value ? "Y" : "N"; + } + } } } - catch(Exception) + catch (Exception) { System.Diagnostics.Trace.WriteLine(string.Format("Error writing {0} to excel, field missing", lookupName)); } @@ -1326,10 +1332,19 @@ namespace ENI2.Excel { if (result) { - _nameDict[lookupName].RefersToRange.Value = v; + var definedName = _nameDict[lookupName]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) + { + var cell = range.FirstCell(); + if (cell != null) + { + cell.Value = ClosedXML.Excel.XLCellValue.FromObject(v); + } + } } } - catch(Exception) + catch (Exception) { System.Diagnostics.Trace.WriteLine(string.Format("Error writing {0} to excel, field missing", lookupName)); } @@ -1343,7 +1358,16 @@ namespace ENI2.Excel if (result) { - _nameDict[lookupName].RefersToRange.Value = v; + var definedName = _nameDict[lookupName]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) + { + var cell = range.FirstCell(); + if (cell != null) + { + cell.Value = ClosedXML.Excel.XLCellValue.FromObject(v); + } + } } return result; @@ -1355,11 +1379,19 @@ namespace ENI2.Excel if (result) { - if(v != null) + if (v != null) { - _nameDict[lookupName].RefersToRange.Value = ((DateTime) v).ToLocalTime().ToOADate(); + var definedName = _nameDict[lookupName]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) + { + var cell = range.FirstCell(); + if (cell != null) + { + cell.Value = ClosedXML.Excel.XLCellValue.FromObject(((DateTime)v).ToLocalTime()); + } + } } - } return result; @@ -1373,9 +1405,17 @@ namespace ENI2.Excel { if (v != null) { - _nameDict[lookupName].RefersToRange.Value = ((DateTime)v).ToLocalTime().ToShortTimeString(); + var definedName = _nameDict[lookupName]; + var range = definedName.Ranges.FirstOrDefault(); + if (range != null) + { + var cell = range.FirstCell(); + if (cell != null) + { + cell.Value = ((DateTime)v).ToLocalTime().ToString("HH:mm"); + } + } } - } return result; @@ -1386,4 +1426,4 @@ namespace ENI2.Excel #endregion } -} +} \ No newline at end of file diff --git a/ENI2/Properties/Settings.Designer.cs b/ENI2/Properties/Settings.Designer.cs index 1767a0a9..f6fbba7c 100644 --- a/ENI2/Properties/Settings.Designer.cs +++ b/ENI2/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace ENI2.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/ENI2/Service References/LockingServiceReference/Reference.cs b/ENI2/Service References/LockingServiceReference/Reference.cs index 310941f9..e28d8634 100644 --- a/ENI2/Service References/LockingServiceReference/Reference.cs +++ b/ENI2/Service References/LockingServiceReference/Reference.cs @@ -117,7 +117,7 @@ namespace ENI2.LockingServiceReference { return this.CORRUPTFilesField; } set { - if ((ReferenceEquals(this.CORRUPTFilesField, value) != true)) { + if ((object.ReferenceEquals(this.CORRUPTFilesField, value) != true)) { this.CORRUPTFilesField = value; this.RaisePropertyChanged("CORRUPTFiles"); } @@ -143,7 +143,7 @@ namespace ENI2.LockingServiceReference { return this.IMPFilesField; } set { - if ((ReferenceEquals(this.IMPFilesField, value) != true)) { + if ((object.ReferenceEquals(this.IMPFilesField, value) != true)) { this.IMPFilesField = value; this.RaisePropertyChanged("IMPFiles"); } @@ -156,7 +156,7 @@ namespace ENI2.LockingServiceReference { return this.READYFilesField; } set { - if ((ReferenceEquals(this.READYFilesField, value) != true)) { + if ((object.ReferenceEquals(this.READYFilesField, value) != true)) { this.READYFilesField = value; this.RaisePropertyChanged("READYFiles"); } diff --git a/ENI2/packages.config b/ENI2/packages.config index 4e5e7372..8ef176cd 100644 --- a/ENI2/packages.config +++ b/ENI2/packages.config @@ -2,25 +2,24 @@ - - + + - + - - +