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 31277d91..cfcef3df 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 @@
-
-
+
+
-
+
-
-
+