From 96b593bbde672d8c1021269701d6f8c044458ab6 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 27 Dec 2021 12:16:08 +0100 Subject: [PATCH] Excel schreiben Pt.2 soweit fertig, Testversion 6.9 erstellt --- ENI2/Excel/ExcelUtil.cs | 12 +- ENI2/Excel/ExcelWriter.cs | 726 ++++++++++++++++++++++++++++++++++---- 2 files changed, 673 insertions(+), 65 deletions(-) diff --git a/ENI2/Excel/ExcelUtil.cs b/ENI2/Excel/ExcelUtil.cs index b1ec1919..2751a346 100644 --- a/ENI2/Excel/ExcelUtil.cs +++ b/ENI2/Excel/ExcelUtil.cs @@ -903,10 +903,16 @@ namespace ENI2.Excel stat.CallSign = reader.ReadTextNoWhitespace("STAT.CallSign"); stat.ISMCompanyId = reader.ReadTextNoWhitespace("STAT.ISMCompanyId"); - if (!stat.ISMCompanyId.IsNullOrEmpty() && stat.ISMCompanyId.Length < 7) + if (!stat.ISMCompanyId.IsNullOrEmpty()) { - while (stat.ISMCompanyId.Length < 7) - stat.ISMCompanyId = "0" + stat.ISMCompanyId; + // strip "ISM" at the beginning if it is there (27.12.21) + if (stat.ISMCompanyId.StartsWith("ism", StringComparison.OrdinalIgnoreCase)) + stat.ISMCompanyId = stat.ISMCompanyId.Substring(3); + + if(stat.ISMCompanyId.Length < 7) { // zero - fill + while (stat.ISMCompanyId.Length < 7) + stat.ISMCompanyId = "0" + stat.ISMCompanyId; + } } string transportMode = reader.ReadText("STAT.TransportMode"); diff --git a/ENI2/Excel/ExcelWriter.cs b/ENI2/Excel/ExcelWriter.cs index 15ecbff7..c7cabf7b 100644 --- a/ENI2/Excel/ExcelWriter.cs +++ b/ENI2/Excel/ExcelWriter.cs @@ -70,18 +70,16 @@ namespace ENI2.Excel } break; case Message.NotificationClass.CREW: - this.WriteCREW(message); + this.WriteCREW(message, true); break; case Message.NotificationClass.CREWD: - this.WriteCREWD(message); + this.WriteCREW(message, false); break; - case Message.NotificationClass.HAZA: - if (message.Elements[0] is HAZ haza) this.WriteMessage(haza); - + case Message.NotificationClass.HAZA: + this.WriteHAZ(message, true); break; - case Message.NotificationClass.HAZD: - if (message.Elements[0] is HAZ hazd) this.WriteMessage(hazd); - + case Message.NotificationClass.HAZD: + this.WriteHAZ(message, false); break; case Message.NotificationClass.INFO: if (message.Elements[0] is INFO info) this.WriteMessage(info); @@ -90,21 +88,23 @@ namespace ENI2.Excel this.WriteLADG(message); break; case Message.NotificationClass.MDH: - if (message.Elements[0] is MDH mdh) this.WriteMessage(mdh); - + if (message.Elements[0] is MDH mdh) + { + this.WriteMessage(mdh); + this.WriteMDH(mdh); + } break; case Message.NotificationClass.NAME: if (message.Elements[0] is NAME name) this.WriteMessage(name); break; case Message.NotificationClass.NOA_NOD: - if (message.Elements[0] is NOA_NOD noa_nod) this.WriteMessage(noa_nod); - + if (message.Elements[0] is NOA_NOD noa_nod) this.WriteNOA_NOD(noa_nod, core.IsTransit); break; case Message.NotificationClass.PAS: - + this.WritePAS(message, true); break; case Message.NotificationClass.PASD: - + this.WritePAS(message, false); break; case Message.NotificationClass.POBA: if (message.Elements[0] is POBA poba) this.WriteMessage(poba); @@ -117,16 +117,16 @@ namespace ENI2.Excel break; case Message.NotificationClass.SEC: if (message.Elements[0] is SEC sec) this.WriteMessage(sec); - + this.WriteSEC(message); break; case Message.NotificationClass.SERV: - + this.WriteSERV(message); break; case Message.NotificationClass.STAT: if (message.Elements[0] is STAT stat) this.WriteMessage(stat); break; case Message.NotificationClass.STO: - + this.WriteSTO(message); break; case Message.NotificationClass.TIEFA: if (message.Elements[0] is TIEFA tiefa) this.WriteMessage(tiefa); @@ -135,14 +135,14 @@ namespace ENI2.Excel if (message.Elements[0] is TIEFD tiefd) this.WriteMessage(tiefd); break; case Message.NotificationClass.TOWA: - + WriteTOWA(message); break; case Message.NotificationClass.TOWD: - + WriteTOWD(message); break; case Message.NotificationClass.WAS: if (message.Elements[0] is WAS was) this.WriteMessage(was); - + WriteWAS(message); break; default: @@ -234,11 +234,17 @@ namespace ENI2.Excel private void WriteCore(MessageCore core) { - + WriteText("ID", core.IsTransit ? core.TransitId : core.VisitId); + WriteText("Visit.PortOfCall", core.PoC); + WriteText("Visit.IMONumber", core.IMO); + WriteText("ReferenceNumber", core.HerbergReportType); + WriteText("ShipMail", core.HerbergEmailContactReportingVessel); } #region list / special message classes + #region LADG + private void WriteLADG(Message ladgMessage) { for (int i = 0; i < Math.Min(ladgMessage.NumberOfExcelRows, ladgMessage.Elements.Count); i++) @@ -274,6 +280,10 @@ namespace ENI2.Excel } } + #endregion + + #region BKRA + private void WriteBKRA(Message bkraMessage) { for (int i = 0; i < Math.Min(bkraMessage.NumberOfExcelRows, bkraMessage.Elements.Count); i++) @@ -286,6 +296,10 @@ namespace ENI2.Excel } } + #endregion + + #region BKRD + private void WriteBKRD(Message bkrdMessage) { for (int i = 0; i < Math.Min(bkrdMessage.NumberOfExcelRows, bkrdMessage.Elements.Count); i++) @@ -298,6 +312,10 @@ namespace ENI2.Excel } } + #endregion + + #region BPOL + private void WriteItineraries(BPOL bpol) { for (int i = 0; i < Math.Min(10, bpol.PortOfItineraries.Count); i++) @@ -311,27 +329,31 @@ namespace ENI2.Excel WriteText(bpolLocode, poi.PortOfItineraryLocode); if (poi.PortOfItineraryETA.HasValue) { - WriteDate(bpolETADate, poi.PortOfItineraryETA.Value.Date); - WriteText(bpolETATime, poi.PortOfItineraryETA.Value.ToShortTimeString()); + WriteDate(bpolETADate, poi.PortOfItineraryETA.Value); + WriteTime(bpolETATime, poi.PortOfItineraryETA.Value); } } } - private void WriteCREW(Message crewMessage) + #endregion + + #region CREW + + private void WriteCREW(Message crewMessage, bool isArrival) { for(int i = 0; i 0) + { + SERV serv = servMessage.Elements[0] as SERV; + WriteMessage(serv); + } + } + + #endregion + + #region STO + + private void WriteSTO(Message stoMessage) + { + for(int i = 0; i < Math.Min(stoMessage.Elements.Count, stoMessage.NumberOfExcelRows); i++) + { + string stoName = string.Format("STO.Name_{0}", i + 1); + string stoQuantity = string.Format("STO.Quantity_{0}", i + 1); + string stoQuantityUnit = string.Format("STO.QuantityUnit_{0}", i + 1); + string stoLocationOnBoard = string.Format("STO.LocationOnBoard_{0}", i + 1); + string stoOfficialUse = string.Format("STO.OfficialUse_{0}", i + 1); + + STO sto = stoMessage.Elements[i] as STO; + + WriteText(stoName, sto.Name); + if (sto.Quantity.HasValue) + WriteNumber(stoQuantity, sto.Quantity.Value); + WriteText(stoQuantityUnit, sto.QuantityUnit); + WriteText(stoLocationOnBoard, sto.LocationOnBoard); + WriteText(stoOfficialUse, sto.OfficialUse); + } + } + + #endregion + + #region TOWA + + private void WriteTOWA(Message towaMessage) + { + for(int i = 0; i < Math.Min(towaMessage.Elements.Count, towaMessage.NumberOfExcelRows); i++) + { + string tName = string.Format("TOWA.TowageOnArrivalName_{0}", i + 1); + string tFlag = string.Format("TOWA.TowageOnArrivalFlag_{0}", i + 1); + string tPoC = string.Format("TOWA.TowageOnArrivalPurposeOfCall_{0}", i + 1); + string tDraft = string.Format("TOWA.TowageOnArrivalDraught_DMT_{0}", i + 1); + string tGT = string.Format("TOWA.TowageOnArrivalGrossTonnage_{0}", i + 1); + string tLen = string.Format("TOWA.TowageOnArrivalLengthOverall_MTR_{0}", i + 1); + string tBeam = string.Format("TOWA.TowageOnArrivalBeam_MTR_{0}", i + 1); + string tOp = string.Format("TOWA.TowageOnArrivalOperatorCompanyName_{0}", i + 1); + + TOWA towa = towaMessage.Elements[i] as TOWA; + + WriteText(tName, towa.TowageOnArrivalName); + WriteText(tFlag, towa.TowageOnArrivalFlag); + WriteText(tPoC, towa.TowageOnArrivalPurposeOfCall); + if (towa.TowageOnArrivalDraught_DMT.HasValue) + WriteNumber(tDraft, towa.TowageOnArrivalDraught_DMT.Value); + if (towa.TowageOnArrivalGrossTonnage.HasValue) + WriteNumber(tGT, towa.TowageOnArrivalGrossTonnage.Value); + if (towa.TowageOnArrivalLengthOverall_MTR.HasValue) + WriteNumber(tLen, towa.TowageOnArrivalLengthOverall_MTR.Value); + if (towa.TowageOnArrivalBeam_MTR.HasValue) + WriteNumber(tBeam, towa.TowageOnArrivalBeam_MTR.Value); + WriteText(tOp, towa.TowageOnArrivalOperatorCompanyName); + } + } + + #endregion + + #region TOWD + + private void WriteTOWD(Message towdMessage) + { + for(int i = 0; i < Math.Min(towdMessage.Elements.Count, towdMessage.NumberOfExcelRows); i++) + { + string tName = string.Format("TOWD.TowageOnDepartureName_{0}", i + 1); + string tFlag = string.Format("TOWD.TowageOnDepartureFlag_{0}", i + 1); + string tDraft = string.Format("TOWD.TowageOnDepartureDraught_DMT_{0}", i + 1); + 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); + + TOWD towd = towdMessage.Elements[i] as TOWD; + + WriteText(tName, towd.TowageOnDepartureName); + WriteText(tFlag, towd.TowageOnDepartureFlag); + if (towd.TowageOnDepartureDraught_DMT.HasValue) + WriteNumber(tDraft, towd.TowageOnDepartureDraught_DMT.Value); + if (towd.TowageOnDepartureLengthOverall_MTR.HasValue) + WriteNumber(tLen, towd.TowageOnDepartureLengthOverall_MTR.Value); + if (towd.TowageOnDepartureBeam_MTR.HasValue) + WriteNumber(tBeam, towd.TowageOnDepartureBeam_MTR.Value); + WriteText(tOp, towd.TowageOnDepartureOperatorCompanyName); + } + } + + #endregion + + #region WAS + + private void WriteWAS(Message wasMessage) + { + if (wasMessage.Elements.Count == 0) return; + WAS was = wasMessage.Elements[0] as WAS; + + WriteText("WAS.WasteDisposalDelivery", was.WasteDisposalDelivery); + WriteText("WAS.LastWasteDisposalPort", was.LastWasteDisposalPort); + WriteText("WAS.WasteDisposalServiceProviderName", was.WasteDisposalServiceProviderText); + + for(int i = 0; i < Math.Min(was.NumberOfExcelRows, was.Waste.Count); i++) + { + string wastetype = string.Format("WAS.WasteType_{0}", i + 1); + string wasteCode = string.Format("WAS.WasteCode_{0}", i + 1); + string wasteDescription = string.Format("WAS.WasteDescription_{0}", i + 1); + string wasteAmount = string.Format("WAS.WasteDisposalAmount_MTQ_{0}", i + 1); + string wasteCapacity = string.Format("WAS.WasteCapacity_MTQ_{0}", i + 1); + string wasteRetained = string.Format("WAS.WasteAmountRetained_MTQ_{0}", i + 1); + string wastePort = string.Format("WAS.WasteDisposalPort_{0}", i + 1); + string amountGen = string.Format("WAS.WasteAmountGeneratedTillNextPort_MTQ_{0}", i + 1); + string wasteDis = string.Format("WAS.WasteDisposedAtLastPort_MTQ_{0}", i + 1); + + Waste waste = was.Waste[i]; + + if(waste.WasteType.HasValue) + WriteNumber(wasteCode, waste.WasteType.Value); + WriteText(wastetype, waste.WasteTypeDisplay); + WriteText(wasteDescription, waste.WasteDescription); + if (waste.WasteDisposalAmount_MTQ.HasValue) + WriteNumber(wasteAmount, waste.WasteDisposalAmount_MTQ.Value); + if (waste.WasteCapacity_MTQ.HasValue) + WriteNumber(wasteCapacity, waste.WasteCapacity_MTQ.Value); + if (waste.WasteAmountRetained_MTQ.HasValue) + WriteNumber(wasteRetained, waste.WasteAmountRetained_MTQ.Value); + WriteText(wastePort, waste.WasteDisposalPort); + if (waste.WasteAmountGeneratedTillNextPort_MTQ.HasValue) + WriteNumber(amountGen, waste.WasteAmountGeneratedTillNextPort_MTQ.Value); + if (waste.WasteDisposedAtLastPort_MTQ.HasValue) + WriteNumber(wasteDis, waste.WasteDisposedAtLastPort_MTQ.Value); + } + + } + + #endregion + + #endregion + #region write simple things private void WriteIdentityDocumentType(string label, byte? docType) @@ -413,10 +999,10 @@ namespace ENI2.Excel private bool WriteBoolean(string lookupName, object v) { bool result = _nameDict.ContainsKey(lookupName); - bool b = (bool) v; - if (result) + bool? b = (bool?) v; + if (result && b.HasValue) { - _nameDict[lookupName].RefersToRange.Value = b ? "Y" : "N"; + _nameDict[lookupName].RefersToRange.Value = b.Value ? "Y" : "N"; } return result; @@ -462,6 +1048,22 @@ namespace ENI2.Excel return result; } + private bool WriteTime(string lookupName, object v) + { + bool result = _nameDict.ContainsKey(lookupName); + + if (result) + { + if (v != null) + { + _nameDict[lookupName].RefersToRange.Value = ((DateTime)v).ToShortTimeString(); + } + + } + + return result; + } + #endregion #endregion