Writer erstellt und generische Schreibfunktionen vorbereitet

This commit is contained in:
Daniel Schick 2021-12-26 09:34:13 +01:00
parent d23833414a
commit 2eae1a43bb
7 changed files with 300 additions and 371 deletions

View File

@ -11,7 +11,7 @@ using System.Timers;
using bsmd.database; using bsmd.database;
using ENI2.EditControls; using ENI2.EditControls;
using ENI2.Export; using ENI2.Excel;
using ENI2.Report; using ENI2.Report;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;

View File

@ -395,6 +395,7 @@
<Compile Include="EditControls\VisitIdDialog.xaml.cs"> <Compile Include="EditControls\VisitIdDialog.xaml.cs">
<DependentUpon>VisitIdDialog.xaml</DependentUpon> <DependentUpon>VisitIdDialog.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Excel\ExcelWriter.cs" />
<Compile Include="LocalizedLookup.cs" /> <Compile Include="LocalizedLookup.cs" />
<Compile Include="Report\LabelStorage.cs" /> <Compile Include="Report\LabelStorage.cs" />
<Compile Include="Report\ReportDocument.cs" /> <Compile Include="Report\ReportDocument.cs" />
@ -710,6 +711,10 @@
<Link>report.db</Link> <Link>report.db</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<None Include="..\misc\Reference_Sheet_DE.xlsx">
<Link>Excel\Reference_Sheet_DE.xlsx</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="ENI2_2_TemporaryKey.pfx" /> <None Include="ENI2_2_TemporaryKey.pfx" />
<None Include="ENI2_3_TemporaryKey.pfx" /> <None Include="ENI2_3_TemporaryKey.pfx" />
<None Include="ENI2_4_TemporaryKey.pfx" /> <None Include="ENI2_4_TemporaryKey.pfx" />

View File

@ -7,7 +7,7 @@ using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using log4net; using log4net;
namespace ENI2.Export namespace ENI2.Excel
{ {
internal class ExcelBase : IDisposable internal class ExcelBase : IDisposable
{ {
@ -19,52 +19,85 @@ namespace ENI2.Export
protected CountryMode _countryMode = CountryMode.NONE; protected CountryMode _countryMode = CountryMode.NONE;
protected Workbooks _excelWorkbooks; protected Workbooks _excelWorkbooks;
protected Workbook _portcall; protected Workbook _workBook;
protected Application _excelApp; protected Application _excelApp;
protected Dictionary<string, Name> _nameDict; protected Dictionary<string, Name> _nameDict;
protected ILog _log; protected ILog _log;
#endregion #endregion
#region Construction
public ExcelBase(string filePath)
{
_log = LogManager.GetLogger(this.GetType().Name);
this._excelApp = new Application();
this._excelApp.DisplayAlerts = false;
this._excelWorkbooks = _excelApp.Workbooks;
}
#endregion
#region Properties #region Properties
internal CountryMode Mode { get { return _countryMode; } } internal CountryMode Mode { get { return _countryMode; } }
#endregion #endregion
#region Saving #region protected methods
internal bool Save(string filePath) protected void InitNameFields()
{ {
bool result = true; _nameDict = new Dictionary<string, Name>();
if (this._excelApp == null) return false; int bookCnt = 0;
try foreach (Name name in _workBook.Names)
{ {
this._excelApp.SaveWorkspace(filePath); string theValue = name.Value;
} // Namensbezug: =SheetZelle. Leere Referenzen überspringen (kommt immer mal wieder vor!)
catch (Exception ex)
{
_log.WarnFormat("cannot save workspace: {0}", ex.Message);
result = false;
}
return result;
}
internal bool SaveCopy(string filePath) string nameKey = name.Name;
{
bool result = true; try
if (this._excelApp == null) return false; {
try if (nameKey.Contains("!"))
{ nameKey = nameKey.Substring(nameKey.IndexOf('!') + 1);
this._portcall.Saved = true; }
this._portcall.SaveCopyAs(filePath); catch (Exception)
{
_log.DebugFormat("Strange name in Sheet: {0}", nameKey);
continue;
}
if ((theValue != "=#REF!#REF!") && (theValue != "=#BEZUG!#BEZUG!"))
{
_nameDict[nameKey] = name;
bookCnt++;
}
} }
catch (Exception ex) _log.DebugFormat("{0} named ranges found at Workbook level", bookCnt);
foreach (Worksheet ws in _workBook.Worksheets)
{ {
_log.WarnFormat("cannot save copy of workbook: {0}", ex.Message); int wsCnt = 0;
result = false; foreach (Name name in ws.Names)
{
string theValue = name.Value;
// Namensbezug: =SheetZelle. Leere Referenzen überspringen (kommt immer mal wieder vor!)
if (!_nameDict.ContainsKey(name.Name))
{
if ((theValue != "=#REF!#REF!") && (theValue != "=#BEZUG!#BEZUG!"))
{
_nameDict[name.Name] = name;
wsCnt++;
}
}
}
if (wsCnt > 0)
_log.DebugFormat("{0} named ranges found in Worksheet {1}", wsCnt, ws.Name);
} }
return result;
} }
#endregion #endregion
@ -75,19 +108,18 @@ namespace ENI2.Export
{ {
try try
{ {
if (this._portcall != null) if (this._workBook != null)
{ {
this._portcall.Close(0); this._workBook.Close(0);
_log.Debug("Close Worksheet"); _log.Debug("Close Worksheet");
Marshal.ReleaseComObject(this._portcall); Marshal.ReleaseComObject(this._workBook);
} }
if (this._excelWorkbooks != null) if (this._excelWorkbooks != null)
{ {
this._excelWorkbooks.Close(); this._excelWorkbooks.Close();
_log.Debug("Close Workbooks"); _log.Debug("Close Workbooks");
Marshal.ReleaseComObject(this._excelWorkbooks); Marshal.ReleaseComObject(this._excelWorkbooks);
// this._excelWorkbooks.Close();
} }
if (this._excelApp != null) if (this._excelApp != null)
{ {

View File

@ -7,7 +7,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
namespace ENI2.Export namespace ENI2.Excel
{ {
public class ExcelManager public class ExcelManager
{ {
@ -52,23 +52,18 @@ namespace ENI2.Export
_log.Error(ex); _log.Error(ex);
} }
return result; return result;
} }
// TODO: ich finde man müsste den Folder zu "excel" umbenennen es ist ja nicht nur "import"..
internal void Export(string fileName, MessageCore core, List<Message> messages, out string resultMessage) internal void Export(string fileName, MessageCore core, List<Message> messages, out string resultMessage)
{ {
throw new NotImplementedException(); resultMessage = "";
// Create ExcelWriter // Create ExcelWriter
using (ExcelWriter ew = new ExcelWriter(fileName))
// Open reference Sheet {
ew.WriteData(messages, core, out resultMessage);
// somehow loop across all messages and derive their label names from it ew.Save();
}
// save excel
} }
} }
} }

View File

@ -19,7 +19,7 @@ using System.Runtime.InteropServices;
using ENI2.Locode; using ENI2.Locode;
using bsmd.database; using bsmd.database;
namespace ENI2.Export namespace ENI2.Excel
{ {
internal class ExcelReader : ExcelBase internal class ExcelReader : ExcelBase
{ {
@ -27,65 +27,13 @@ namespace ENI2.Export
internal Dictionary<string, string> ImportValues { get; } = new Dictionary<string, string>(); internal Dictionary<string, string> ImportValues { get; } = new Dictionary<string, string>();
public ExcelReader(string filePath) public ExcelReader(string filePath) : base(filePath)
{ {
_log = LogManager.GetLogger(typeof(ExcelReader));
this._excelApp = new Application(); this._workBook = _excelWorkbooks.Open(filePath, 0, true, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false);
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);
_nameDict = new Dictionary<string, Name>();
int bookCnt = 0;
foreach(Name name in _portcall.Names)
{
string theValue = name.Value;
// Namensbezug: =SheetZelle. Leere Referenzen überspringen (kommt immer mal wieder vor!)
string nameKey = name.Name; this.InitNameFields();
}
try
{
if (nameKey.Contains("!"))
nameKey = nameKey.Substring(nameKey.IndexOf('!') + 1);
}
catch(Exception)
{
_log.DebugFormat("Strange name in Sheet: {0}", nameKey);
continue;
}
if ((theValue != "=#REF!#REF!") && (theValue != "=#BEZUG!#BEZUG!"))
{
_nameDict[nameKey] = name;
bookCnt++;
}
}
_log.DebugFormat("{0} named ranges found at Workbook level", bookCnt);
foreach(Worksheet ws in _portcall.Worksheets)
{
int wsCnt = 0;
foreach(Name name in ws.Names)
{
string theValue = name.Value;
// Namensbezug: =SheetZelle. Leere Referenzen überspringen (kommt immer mal wieder vor!)
if (!_nameDict.ContainsKey(name.Name))
{
if ((theValue != "=#REF!#REF!") && (theValue != "=#BEZUG!#BEZUG!"))
{
_nameDict[name.Name] = name;
wsCnt++;
}
}
}
if (wsCnt > 0)
_log.DebugFormat("{0} named ranges found in Worksheet {1}", wsCnt, ws.Name);
}
}
internal string ReadText(string lookup) internal string ReadText(string lookup)
{ {
@ -377,7 +325,7 @@ namespace ENI2.Export
return result; return result;
} }
internal DateTime? ReadDate(string lookup, bool noHighlight = false) internal DateTime? ReadDate(string lookup)
{ {
try try
{ {
@ -431,11 +379,11 @@ namespace ENI2.Export
} }
} }
internal DateTime? ReadDateTime(string dateField, string timeField, bool noHighlight = false) internal DateTime? ReadDateTime(string dateField, string timeField)
{ {
DateTime? result = null; DateTime? result = null;
DateTime? etaDate = this.ReadDate(dateField, noHighlight); DateTime? etaDate = this.ReadDate(dateField);
DateTime? etaTime = this.ReadTime(timeField, noHighlight); DateTime? etaTime = this.ReadTime(timeField);
if (etaDate != null) if (etaDate != null)
{ {
result = new DateTime(etaDate.Value.Year, etaDate.Value.Month, etaDate.Value.Day); result = new DateTime(etaDate.Value.Year, etaDate.Value.Month, etaDate.Value.Day);
@ -449,7 +397,7 @@ namespace ENI2.Export
return result; return result;
} }
internal DateTime? ReadTime(string lookup, bool noHighlight = false) internal DateTime? ReadTime(string lookup)
{ {
DateTime? result = null; DateTime? result = null;
@ -561,7 +509,7 @@ namespace ENI2.Export
return result.Value; return result.Value;
} }
internal bool? ReadBoolean(string lookup, bool noHighlight = false) internal bool? ReadBoolean(string lookup)
{ {
string val = this.ReadText(lookup); string val = this.ReadText(lookup);
if (val == null) if (val == null)

View File

@ -15,7 +15,7 @@ using log4net;
using bsmd.database; using bsmd.database;
using ENI2.Locode; using ENI2.Locode;
namespace ENI2.Export namespace ENI2.Excel
{ {
public static class ExcelUtil public static class ExcelUtil
{ {
@ -43,63 +43,63 @@ namespace ENI2.Export
foreach (Message message in messages) foreach (Message message in messages)
{ {
if ((message.MessageNotificationClass == Message.NotificationClass.AGNT) && notificationClasses.Contains(Message.NotificationClass.AGNT)) if ((message.MessageNotificationClass == Message.NotificationClass.AGNT) && notificationClasses.Contains(Message.NotificationClass.AGNT))
{ if (ScanAGNT(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanAGNT(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.ATA) && notificationClasses.Contains(Message.NotificationClass.ATA)) if ((message.MessageNotificationClass == Message.NotificationClass.ATA) && notificationClasses.Contains(Message.NotificationClass.ATA))
{ if (ScanATA(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanATA(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.ATD) && notificationClasses.Contains(Message.NotificationClass.ATD)) if ((message.MessageNotificationClass == Message.NotificationClass.ATD) && notificationClasses.Contains(Message.NotificationClass.ATD))
{ if (ScanATD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanATD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.BKRA) && notificationClasses.Contains(Message.NotificationClass.BKRA)) if ((message.MessageNotificationClass == Message.NotificationClass.BKRA) && notificationClasses.Contains(Message.NotificationClass.BKRA))
{ if (ScanBKRA(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanBKRA(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.BKRD) && notificationClasses.Contains(Message.NotificationClass.BKRD)) if ((message.MessageNotificationClass == Message.NotificationClass.BKRD) && notificationClasses.Contains(Message.NotificationClass.BKRD))
{ if (ScanBKRD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanBKRD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.BPOL) && notificationClasses.Contains(Message.NotificationClass.BPOL)) if ((message.MessageNotificationClass == Message.NotificationClass.BPOL) && notificationClasses.Contains(Message.NotificationClass.BPOL))
{ if (ScanBPOL(message, messages, messageCore, reader)) SaveMessage(message); } { if (ScanBPOL(message, messages, messageCore, reader)) SaveMessage(message); }
if ((message.MessageNotificationClass == Message.NotificationClass.CREW) && notificationClasses.Contains(Message.NotificationClass.CREW)) if ((message.MessageNotificationClass == Message.NotificationClass.CREW) && notificationClasses.Contains(Message.NotificationClass.CREW))
{ if (ScanCREW(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanCREW(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.CREWD) && notificationClasses.Contains(Message.NotificationClass.CREWD)) if ((message.MessageNotificationClass == Message.NotificationClass.CREWD) && notificationClasses.Contains(Message.NotificationClass.CREWD))
{ if (ScanCREWD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanCREWD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.HAZA) && notificationClasses.Contains(Message.NotificationClass.HAZA)) if ((message.MessageNotificationClass == Message.NotificationClass.HAZA) && notificationClasses.Contains(Message.NotificationClass.HAZA))
{ if (ScanHAZA(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanHAZA(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.HAZD) && notificationClasses.Contains(Message.NotificationClass.HAZD)) if ((message.MessageNotificationClass == Message.NotificationClass.HAZD) && notificationClasses.Contains(Message.NotificationClass.HAZD))
{ if (ScanHAZD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanHAZD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.INFO) && notificationClasses.Contains(Message.NotificationClass.INFO)) if ((message.MessageNotificationClass == Message.NotificationClass.INFO) && notificationClasses.Contains(Message.NotificationClass.INFO))
{ if (ScanINFO(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanINFO(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.LADG) && notificationClasses.Contains(Message.NotificationClass.LADG)) if ((message.MessageNotificationClass == Message.NotificationClass.LADG) && notificationClasses.Contains(Message.NotificationClass.LADG))
{ if (ScanLADG(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanLADG(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.MDH) && notificationClasses.Contains(Message.NotificationClass.MDH)) if ((message.MessageNotificationClass == Message.NotificationClass.MDH) && notificationClasses.Contains(Message.NotificationClass.MDH))
{ if (ScanMDH(message, messages, messageCore, reader)) SaveMessage(message); continue; } { if (ScanMDH(message, messages, messageCore, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.NAME) && notificationClasses.Contains(Message.NotificationClass.NAME)) if ((message.MessageNotificationClass == Message.NotificationClass.NAME) && notificationClasses.Contains(Message.NotificationClass.NAME))
{ if (ScanNAME(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanNAME(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.NOA_NOD) && notificationClasses.Contains(Message.NotificationClass.NOA_NOD)) if ((message.MessageNotificationClass == Message.NotificationClass.NOA_NOD) && notificationClasses.Contains(Message.NotificationClass.NOA_NOD))
{ if (ScanNOA_NOD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanNOA_NOD(message, messageCore, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.PAS) && notificationClasses.Contains(Message.NotificationClass.PAS)) if ((message.MessageNotificationClass == Message.NotificationClass.PAS) && notificationClasses.Contains(Message.NotificationClass.PAS))
{ if (ScanPAS(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanPAS(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.PASD) && notificationClasses.Contains(Message.NotificationClass.PASD)) if ((message.MessageNotificationClass == Message.NotificationClass.PASD) && notificationClasses.Contains(Message.NotificationClass.PASD))
{ if (ScanPASD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanPASD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.POBA) && notificationClasses.Contains(Message.NotificationClass.POBA)) if ((message.MessageNotificationClass == Message.NotificationClass.POBA) && notificationClasses.Contains(Message.NotificationClass.POBA))
{ if (ScanPOBA(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanPOBA(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.POBD) && notificationClasses.Contains(Message.NotificationClass.POBD)) if ((message.MessageNotificationClass == Message.NotificationClass.POBD) && notificationClasses.Contains(Message.NotificationClass.POBD))
{ if (ScanPOBD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanPOBD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.PRE72H) && notificationClasses.Contains(Message.NotificationClass.PRE72H)) if ((message.MessageNotificationClass == Message.NotificationClass.PRE72H) && notificationClasses.Contains(Message.NotificationClass.PRE72H))
{ if (ScanPRE72H(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanPRE72H(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.SEC) && notificationClasses.Contains(Message.NotificationClass.SEC)) if ((message.MessageNotificationClass == Message.NotificationClass.SEC) && notificationClasses.Contains(Message.NotificationClass.SEC))
{ if (ScanSEC(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanSEC(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.SERV) && notificationClasses.Contains(Message.NotificationClass.SERV)) if ((message.MessageNotificationClass == Message.NotificationClass.SERV) && notificationClasses.Contains(Message.NotificationClass.SERV))
{ if (ScanSERV(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanSERV(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.STAT) && notificationClasses.Contains(Message.NotificationClass.STAT)) if ((message.MessageNotificationClass == Message.NotificationClass.STAT) && notificationClasses.Contains(Message.NotificationClass.STAT))
{ if (ScanSTAT(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanSTAT(message, messageCore, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.STO) && notificationClasses.Contains(Message.NotificationClass.STO)) if ((message.MessageNotificationClass == Message.NotificationClass.STO) && notificationClasses.Contains(Message.NotificationClass.STO))
{ if (ScanSTO(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanSTO(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.TIEFA) && notificationClasses.Contains(Message.NotificationClass.TIEFA)) if ((message.MessageNotificationClass == Message.NotificationClass.TIEFA) && notificationClasses.Contains(Message.NotificationClass.TIEFA))
{ if (ScanTIEFA(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanTIEFA(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.TIEFD) && notificationClasses.Contains(Message.NotificationClass.TIEFD)) if ((message.MessageNotificationClass == Message.NotificationClass.TIEFD) && notificationClasses.Contains(Message.NotificationClass.TIEFD))
{ if (ScanTIEFD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanTIEFD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.TOWA) && notificationClasses.Contains(Message.NotificationClass.TOWA)) if ((message.MessageNotificationClass == Message.NotificationClass.TOWA) && notificationClasses.Contains(Message.NotificationClass.TOWA))
{ if (ScanTOWA(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanTOWA(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.TOWD) && notificationClasses.Contains(Message.NotificationClass.TOWD)) if ((message.MessageNotificationClass == Message.NotificationClass.TOWD) && notificationClasses.Contains(Message.NotificationClass.TOWD))
{ if (ScanTOWD(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanTOWD(message, reader)) SaveMessage(message); continue; }
if ((message.MessageNotificationClass == Message.NotificationClass.WAS) && notificationClasses.Contains(Message.NotificationClass.WAS)) if ((message.MessageNotificationClass == Message.NotificationClass.WAS) && notificationClasses.Contains(Message.NotificationClass.WAS))
{ if (ScanWAS(message, messageCore, reader)) SaveMessage(message); continue; } { if (ScanWAS(message, reader)) SaveMessage(message); continue; }
} }
@ -129,7 +129,7 @@ namespace ENI2.Export
#region ATA #region ATA
private static bool ScanATA(Message ataMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanATA(Message ataMessage, ExcelReader reader)
{ {
if (ataMessage.Elements.Count == 0) if (ataMessage.Elements.Count == 0)
{ {
@ -152,7 +152,7 @@ namespace ENI2.Export
#region ATD #region ATD
private static bool ScanATD(Message atdMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanATD(Message atdMessage, ExcelReader reader)
{ {
if (atdMessage.Elements.Count == 0) if (atdMessage.Elements.Count == 0)
{ {
@ -175,7 +175,7 @@ namespace ENI2.Export
#region TIEFA #region TIEFA
private static bool ScanTIEFA(Message tiefaMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanTIEFA(Message tiefaMessage, ExcelReader reader)
{ {
if (tiefaMessage.Elements.Count == 0) if (tiefaMessage.Elements.Count == 0)
{ {
@ -194,7 +194,7 @@ namespace ENI2.Export
#region TIEFD #region TIEFD
private static bool ScanTIEFD(Message tiefdMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanTIEFD(Message tiefdMessage, ExcelReader reader)
{ {
if(tiefdMessage.Elements.Count == 0) if(tiefdMessage.Elements.Count == 0)
{ {
@ -213,7 +213,7 @@ namespace ENI2.Export
#region NAME #region NAME
private static bool ScanNAME(Message nameMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanNAME(Message nameMessage, ExcelReader reader)
{ {
if (nameMessage.Elements.Count == 0) if (nameMessage.Elements.Count == 0)
{ {
@ -294,7 +294,7 @@ namespace ENI2.Export
#region POBA #region POBA
private static bool ScanPOBA(Message pobaMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanPOBA(Message pobaMessage, ExcelReader reader)
{ {
if(pobaMessage.Elements.Count == 0) if(pobaMessage.Elements.Count == 0)
{ {
@ -315,7 +315,7 @@ namespace ENI2.Export
#region POBD #region POBD
private static bool ScanPOBD(Message pobdMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanPOBD(Message pobdMessage, ExcelReader reader)
{ {
if(pobdMessage.Elements.Count == 0) if(pobdMessage.Elements.Count == 0)
{ {
@ -336,7 +336,7 @@ namespace ENI2.Export
#region HAZA #region HAZA
private static bool ScanHAZA(Message hazaMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanHAZA(Message hazaMessage, ExcelReader reader)
{ {
if(hazaMessage.Elements.Count == 0) if(hazaMessage.Elements.Count == 0)
@ -603,7 +603,7 @@ namespace ENI2.Export
#region HAZD #region HAZD
private static bool ScanHAZD(Message hazdMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanHAZD(Message hazdMessage, ExcelReader reader)
{ {
if (hazdMessage.Elements.Count == 0) if (hazdMessage.Elements.Count == 0)
{ {
@ -864,7 +864,7 @@ namespace ENI2.Export
#region INFO #region INFO
private static bool ScanINFO(Message infoMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanINFO(Message infoMessage, ExcelReader reader)
{ {
if(infoMessage.Elements.Count == 0) if(infoMessage.Elements.Count == 0)
{ {
@ -1011,7 +1011,7 @@ namespace ENI2.Export
noa_nod.ETDFromLastPort = reader.ReadDateTime("NOA_NOD.ETDDateFromLastPort", "NOA_NOD.ETDTimeFromLastPort"); noa_nod.ETDFromLastPort = reader.ReadDateTime("NOA_NOD.ETDDateFromLastPort", "NOA_NOD.ETDTimeFromLastPort");
noa_nod.ETAToNextPort = reader.ReadDateTime("NOA_NOD.ETADateToNextPort", "NOA_NOD.ETATimeToNextPort"); noa_nod.ETAToNextPort = reader.ReadDateTime("NOA_NOD.ETADateToNextPort", "NOA_NOD.ETATimeToNextPort");
// DK // DK
noa_nod.IsAnchored = reader.ReadBoolean("NOA_NOD.IsAnchored", reader.Mode == ExcelReader.CountryMode.DE); noa_nod.IsAnchored = reader.ReadBoolean("NOA_NOD.IsAnchored");
return true; return true;
} }
@ -1020,7 +1020,7 @@ namespace ENI2.Export
#region AGNT #region AGNT
private static bool ScanAGNT(Message agntMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanAGNT(Message agntMessage, ExcelReader reader)
{ {
if(agntMessage.Elements.Count == 0) if(agntMessage.Elements.Count == 0)
{ {
@ -1041,7 +1041,7 @@ namespace ENI2.Export
#region WAS #region WAS
private static bool ScanWAS(Message wasMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanWAS(Message wasMessage, ExcelReader reader)
{ {
if (wasMessage.Elements.Count == 0) if (wasMessage.Elements.Count == 0)
{ {
@ -1379,7 +1379,7 @@ namespace ENI2.Export
#region SEC #region SEC
private static bool ScanSEC(Message secMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanSEC(Message secMessage, ExcelReader reader)
{ {
if (secMessage.Elements.Count == 0) if (secMessage.Elements.Count == 0)
{ {
@ -1429,8 +1429,8 @@ namespace ENI2.Export
sec.KielCanalPassagePlanned = (secKielArrival ?? false) || (secKielDeparture ?? false); sec.KielCanalPassagePlanned = (secKielArrival ?? false) || (secKielDeparture ?? false);
// if (sec.KielCanalPassagePlanned ?? false) // if (sec.KielCanalPassagePlanned ?? false)
// { // {
sec.KielCanalPassagePlannedIncomming = reader.ReadDateTime("SEC.ETADateKielCanalPassagePlannedIncomming", "SEC.ETATimeKielCanalPassagePlannedIncomming", !(secKielArrival ?? false)); sec.KielCanalPassagePlannedIncomming = reader.ReadDateTime("SEC.ETADateKielCanalPassagePlannedIncomming", "SEC.ETATimeKielCanalPassagePlannedIncomming");
sec.KielCanalPassagePlannedOutgoing = reader.ReadDateTime("SEC.ETADateKielCanalPassagePlannedOutgoing", "SEC.ETATimeKielCanalPassagePlannedOutgoing", !(secKielDeparture ?? false)); sec.KielCanalPassagePlannedOutgoing = reader.ReadDateTime("SEC.ETADateKielCanalPassagePlannedOutgoing", "SEC.ETATimeKielCanalPassagePlannedOutgoing");
// } // }
if ((!sec.KielCanalPassagePlanned ?? false) && sec.KielCanalPassagePlannedIncomming.HasValue) sec.KielCanalPassagePlanned = true; if ((!sec.KielCanalPassagePlanned ?? false) && sec.KielCanalPassagePlannedIncomming.HasValue) sec.KielCanalPassagePlanned = true;
@ -1540,7 +1540,7 @@ namespace ENI2.Export
#region BKRA #region BKRA
private static bool ScanBKRA(Message bkraMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanBKRA(Message bkraMessage,ExcelReader reader)
{ {
bkraMessage.DeleteElements(); bkraMessage.DeleteElements();
for (int i = 1; i <= bkraMessage.NumberOfExcelRows; i++) for (int i = 1; i <= bkraMessage.NumberOfExcelRows; i++)
@ -1570,7 +1570,7 @@ namespace ENI2.Export
#region BKRD #region BKRD
private static bool ScanBKRD(Message bkrdMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanBKRD(Message bkrdMessage, ExcelReader reader)
{ {
bkrdMessage.DeleteElements(); bkrdMessage.DeleteElements();
for (int i = 1; i <= bkrdMessage.NumberOfExcelRows; i++) for (int i = 1; i <= bkrdMessage.NumberOfExcelRows; i++)
@ -1599,7 +1599,7 @@ namespace ENI2.Export
#region TOWA #region TOWA
private static bool ScanTOWA(Message towaMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanTOWA(Message towaMessage, ExcelReader reader)
{ {
// 24.4.21: TOWA beim Excel import // 24.4.21: TOWA beim Excel import
bool hasTOWAMarker = false; bool hasTOWAMarker = false;
@ -1655,7 +1655,7 @@ namespace ENI2.Export
#region TOWD #region TOWD
private static bool ScanTOWD(Message towdMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanTOWD(Message towdMessage,ExcelReader reader)
{ {
// 24.4.21: TOWD beim Excel import // 24.4.21: TOWD beim Excel import
@ -1708,7 +1708,7 @@ namespace ENI2.Export
#region PRE72H #region PRE72H
private static bool ScanPRE72H(Message pre72hMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanPRE72H(Message pre72hMessage, ExcelReader reader)
{ {
if (pre72hMessage.Elements.Count == 0) if (pre72hMessage.Elements.Count == 0)
{ {
@ -1729,7 +1729,7 @@ namespace ENI2.Export
#region SERV #region SERV
private static bool ScanSERV(Message servMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanSERV(Message servMessage, ExcelReader reader)
{ {
if(servMessage.Elements.Count == 0) if(servMessage.Elements.Count == 0)
{ {
@ -1750,7 +1750,7 @@ namespace ENI2.Export
#region STO #region STO
private static bool ScanSTO(Message stoMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanSTO(Message stoMessage, ExcelReader reader)
{ {
stoMessage.DeleteElements(); stoMessage.DeleteElements();
@ -1788,7 +1788,7 @@ namespace ENI2.Export
#region LADG #region LADG
private static bool ScanLADG(Message ladgMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanLADG(Message ladgMessage, ExcelReader reader)
{ {
ladgMessage.DeleteElements(); ladgMessage.DeleteElements();
@ -1875,7 +1875,7 @@ namespace ENI2.Export
#region CREW #region CREW
private static bool ScanCREW(Message crewMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanCREW(Message crewMessage, ExcelReader reader)
{ {
crewMessage.DeleteElements(); crewMessage.DeleteElements();
@ -1921,7 +1921,7 @@ namespace ENI2.Export
return true; return true;
} }
private static bool ScanCREWD(Message crewdMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanCREWD(Message crewdMessage, ExcelReader reader)
{ {
crewdMessage.DeleteElements(); crewdMessage.DeleteElements();
// CREW DEPARTURE // CREW DEPARTURE
@ -1971,7 +1971,7 @@ namespace ENI2.Export
#region PAS #region PAS
private static bool ScanPAS(Message pasMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanPAS(Message pasMessage, ExcelReader reader)
{ {
pasMessage.DeleteElements(); pasMessage.DeleteElements();
@ -2026,7 +2026,7 @@ namespace ENI2.Export
#region PASD #region PASD
private static bool ScanPASD(Message pasMessage, MessageCore messageCore, ExcelReader reader) private static bool ScanPASD(Message pasMessage, ExcelReader reader)
{ {
pasMessage.DeleteElements(); pasMessage.DeleteElements();
@ -2149,7 +2149,7 @@ namespace ENI2.Export
} }
} }
#endregion #endregion
@ -2179,211 +2179,6 @@ namespace ENI2.Export
return result; return result;
} }
/// <summary>
/// Check with cell values if this message core is already in our DB
/// </summary>
private static MessageCore LookupMessageCore(ExcelReader reader, out string message)
{
// lookup using field values
MessageCore result = null;
DateTime? eta = null;
string poc;
string imo = null;
message = string.Empty;
bool isTransit = false;
// first check with visit/transit ID
string visitTransitId = reader.ReadTextNoWhitespace("ID");
if (visitTransitId != null)
{
if (bsmd.database.Util.IsVisitId(visitTransitId))
{
result = DBManager.Instance.GetMessageCoreByVisitId(visitTransitId);
}
else if (bsmd.database.Util.IsTransitId(visitTransitId))
{
result = DBManager.Instance.GetMessageCoreByTransitId(visitTransitId);
}
}
else
{
message = "Visit / Transit Id missing!";
return null;
}
if (result != null)
{
// copy poc/imo/eta to return sheet
poc = reader.ReadText("Visit.PortOfCall");
imo = reader.ReadText("Visit.IMONumber");
eta = reader.ReadDateTime("NOA_NOD.ETADateToPortOfCall", "NOA_NOD.ETATimeToPortOfCall");
result.HerbergReportType = reader.ReadText("ReferenceNumber");
}
else
{
// lookup poc, imo, eta
poc = reader.ReadText("Visit.PortOfCall");
if (poc != null)
{
// Prüfen auf Transit
if (poc.IndexOf("CANAL", StringComparison.OrdinalIgnoreCase) >= 0 || poc.Equals("ZZNOK", StringComparison.OrdinalIgnoreCase))
{
poc = "ZZNOK";
isTransit = true;
}
else
{
// Im Sheet könnte der Name statt des LOCODES stehen!
if (!RuleEngine.IsGermanLocode(poc))
{
string aGermanPortName = poc;
if(poc.Contains(',')) // irgendwas wie "Hamburg, Germany"
{
aGermanPortName = poc.Split(',')[0];
}
if (RuleEngine.IsGermanLocode(aGermanPortName))
{
poc = aGermanPortName;
}
else
{
// somehow lookup LOCODE from the port's name!
poc = LocodeDB.LocodeGERFromCity(aGermanPortName);
}
// okay, könnte DK Locode etc sein..
if(poc == null)
{
if(aGermanPortName?.Length == 5) // possible locode?
{
if (LocodeDB.PortNameFromLocode(aGermanPortName) != null)
poc = aGermanPortName;
}
}
if(poc == null)
{
List<string> locodes = LocodeDB.AllLocodesForCityName(aGermanPortName);
if (locodes.Count > 0)
poc = locodes[0];
}
}
if (poc == null)
{
message = "invalid PoC";
return null;
}
}
imo = reader.ReadText("Visit.IMONumber");
// ETA
if (poc != null)
eta = reader.ReadDateTime("NOA_NOD.ETADateToPortOfCall", "NOA_NOD.ETATimeToPortOfCall");
if ((imo != null) && (eta.HasValue) && (poc != null))
{
result = DBManager.Instance.GetMessageCoreByShipInfos(imo, eta.Value, poc);
if(result != null)
{
_log.InfoFormat("Core [{3}] found for IMO {0}, ETA {1}, Poc {2}", imo, eta, poc, result.Id);
result.HerbergReportType = reader.ReadText("ReferenceNumber");
// Spezialfall: Wenn ein Core gefunden wird, dieser jedoch eine andere Visit/Transit Id hat als die Anmeldung ist das eine Neuanlage!
// Eingebaut 17.11.17
if(!visitTransitId.IsNullOrEmpty() && !result.DisplayId.IsNullOrEmpty() &&
(visitTransitId != result.DisplayId))
{
_log.WarnFormat("Different visit ID ({0} (Sheet) {1} (Core) for the same decl. treating as NEW!", visitTransitId, result.DisplayId);
result = null;
}
}
}
}
else
{
message = string.Format("Port of call missing or not found for IMO {0}", imo);
return null;
}
}
if (result == null)
{
if (imo == null)
{
message = "IMO number missing or not found";
return null;
}
if(poc == null)
{
message = string.Format("Port of call missing or not found for IMO {0}", imo);
return null;
}
if(eta == null)
{
message = string.Format("ETA missing or not found for IMO {0}", imo);
return null;
}
// neuen MessageCore erzeugen
result = new MessageCore();
result.Incoming = true;
result.HerbergFormGuid = Guid.Empty;
result.IMO = imo;
result.IsTransit = isTransit;
result.ReportStatus = MessageCore.ReportStatusEnum.NONE; // Bestätigungs-Sheet reicht als Report, keine separate Generierung
result.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE;
result.PoC = poc;
result.Portname = LocodeDB.PortNameFromLocode(poc);
result.HerbergEmailContactReportingVessel = reader.ReadText("ShipMail");
result.HerbergReportType = reader.ReadText("ReferenceNumber");
if (result.IsTransit)
result.ETAKielCanal = eta;
else
result.ETA = eta;
if (result.IMO.Length > 7)
{
_log.WarnFormat("IMO {0} is longer than 7 chars, truncating!", result.IMO);
result.IMO = result.IMO.Substring(0, 7);
}
if((result.IMO.Length == 7) && !bsmd.database.Util.IsIMOValid(result.IMO))
{
_log.WarnFormat("IMO {0} possibly invalid (checksum number violation)", result.IMO);
}
if(visitTransitId != null)
{
if (bsmd.database.Util.IsTransitId(visitTransitId))
result.TransitId = visitTransitId;
else
result.VisitId = visitTransitId;
}
DBManager.Instance.Save(result);
// Meldeklassen erzeugen um doppelte Generierung über ENI-2 zu vermeiden
bsmd.database.Util.CreateMessagesForCore(result, new List<Message>(), null);
}
return result;
}
#endregion #endregion
#region GetMessageWithType #region GetMessageWithType

154
ENI2/Excel/ExcelWriter.cs Normal file
View File

@ -0,0 +1,154 @@
// Copyright (c) 2017- schick Informatik
// Description:
//
using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using bsmd.database;
namespace ENI2.Excel
{
internal class ExcelWriter : ExcelBase
{
#region Fields
private readonly string _saveFilePath;
#endregion
#region Construction
public ExcelWriter(string filePath) : base(filePath)
{
string refFilePath = @"Excel\Reference_Sheet_DE.xlsx";
this._workBook = _excelWorkbooks.Open(refFilePath, 0, true, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false);
this.InitNameFields();
_saveFilePath = filePath;
}
#endregion
#region public methods
public void WriteData(List<Message> messages, MessageCore core, out string resultMessage)
{
resultMessage = "";
foreach (Message message in messages)
{
try
{
this.WriteMessage(message);
}
catch (Exception ex)
{
resultMessage += string.Format("{2}:{0}{1}", ex.Message, Environment.NewLine, message.MessageNotificationClassDisplay);
}
}
WriteCore(core);
}
public void Save()
{
this._workBook.SaveAs(_saveFilePath, 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;
this._workBook.Close();
}
#endregion
#region private excel field writing
private void WriteMessage(DatabaseEntity dbEntity)
{
Type objType = dbEntity.GetType();
List<PropertyInfo> props = new List<PropertyInfo>();
// add lookup properties to scan list
props.AddRange(objType.GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(LookupNameAttribute))));
foreach (PropertyInfo property in props)
{
object propValue = property.GetValue(dbEntity, null);
string value = (propValue == null) ? string.Empty : propValue.ToString();
LookupNameAttribute lookupNameAttribute = Attribute.GetCustomAttribute(property, typeof(LookupNameAttribute)) as LookupNameAttribute;
bool success = true;
if (property.PropertyType == typeof(DateTime?))
{
success = this.WriteDate(lookupNameAttribute.LookupName, property.GetValue(dbEntity));
}
else if (property.PropertyType == typeof(double?))
{
success = this.WriteNumber(lookupNameAttribute.LookupName, property.GetValue(dbEntity));
}
else if (property.PropertyType == typeof(string))
{
success = this.WriteText(lookupNameAttribute.LookupName, property.GetValue(dbEntity));
}
else if (property.PropertyType == typeof(int?))
{
success = this.WriteNumber(lookupNameAttribute.LookupName, property.GetValue(dbEntity));
}
else if (property.PropertyType == typeof(byte?))
{
success = this.WriteNumber(lookupNameAttribute.LookupName, property.GetValue(dbEntity));
}
else if (property.PropertyType == typeof(Boolean?))
{
success = this.WriteBoolean(lookupNameAttribute.LookupName, property.GetValue(dbEntity));
}
else
{
string message = string.Format("unhandled property type: {0} for lookup {1}", property.PropertyType, lookupNameAttribute.LookupName);
_log.Warn(message);
}
if(!success)
{
string message = string.Format("Sheet does not contain lookup field {0}", lookupNameAttribute.LookupName);
_log.Error(message);
throw new FormatException(message);
}
}
}
private void WriteCore(MessageCore core)
{
}
private bool WriteBoolean(string lookupName, object v)
{
throw new NotImplementedException();
}
private bool WriteText(string lookupName, object v)
{
throw new NotImplementedException();
}
private bool WriteNumber(string lookupName, object v)
{
throw new NotImplementedException();
}
private bool WriteDate(string lookupName, object v)
{
throw new NotImplementedException();
}
#endregion
}
}