From 6525178314985f815213ceef548656bdee6bec2d Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 1 Jan 2017 18:19:00 +0000 Subject: [PATCH] Version 3.3.1 Funktioniert leider noch nicht richtig, einige Zellen werden einfach nicht geschrieben. --- Stundensheet.xlsx | Bin 25230 -> 25308 bytes .../bsmd.ExcelReadService/Confirmation.cs | 89 +++++++++++++----- .../bsmd.ExcelReadService/ExcelReadService.cs | 3 +- nsw/Source/bsmd.ExcelReadService/Program.cs | 1 + nsw/Source/bsmd.ExcelReadService/Util.cs | 75 +++++++++++++-- .../Properties/AssemblyProductInfo.cs | 2 +- .../Properties/AssemblyProjectInfo.cs | 2 +- nsw/Source/misc/info_service_installation.txt | 1 + 8 files changed, 142 insertions(+), 31 deletions(-) diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 2926e12dbbdb1b9fd9a39d1e74632c9ab8d466b3..e9fb384390c28b2a4a586c667325812539029e72 100644 GIT binary patch delta 14868 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≈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 internal class Confirmation : IDisposable { - private ILog _log = LogManager.GetLogger(typeof(Confirmation)); + private static ILog _log = LogManager.GetLogger(typeof(Confirmation)); private int okColor = ColorTranslator.ToOle(Color.FromArgb(200, 255, 200)); // light green private int warnColor = ColorTranslator.ToOle(Color.FromArgb(255, 255, 200)); // yellow @@ -28,23 +26,54 @@ namespace bsmd.ExcelReadService private List workbooks = new List(); private List> nameDicts = new List>(); - private List templateNames = new List(); + private List templateNames = new List(); + private List> actualNameDict = null; #region Construction public Confirmation(System.Collections.Specialized.StringCollection sheetCollection, Application excelInstance) { - foreach(string template in sheetCollection) + string nameDictKey = ""; + + foreach (string template in sheetCollection) { try { + nameDictKey += template; // die Templates sollten echte Excel Templates (.xlst) sein Workbook aWorkbook = excelInstance.Workbooks.Open(template, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, false, false, false); + + + /* + if (aWorkbook == excelInstance.ActiveWorkbook) + _log.Info("aWorkbook is active workbook"); + else + aWorkbook.Activate(); + + */ + Dictionary nameDict = new Dictionary(); - foreach (Name name in aWorkbook.Names) + + + // hier müsste etwas hin das nur aus der eben geladenen Vorlage die Namen rauszieht.. + // eben nicht aus *allen* Vorlagen. Das funktioniert auch nur liefern einige der Names keine Ranges.. + + foreach(Name workbookName in aWorkbook.Names) { - nameDict[name.Name] = name; - } + _log.Info(workbookName.Name); + if (workbookName.Name.Contains("!")) + { + continue; + } + else + { + nameDict[workbookName.Name] = workbookName; + } + + } + + + workbooks.Add(aWorkbook); nameDicts.Add(nameDict); templateNames.Add(Path.GetFileNameWithoutExtension(template)); @@ -54,6 +83,8 @@ namespace bsmd.ExcelReadService _log.ErrorFormat("Failure creating sheet from template {0}:{1}", template, ex.Message); } } + + } #endregion @@ -90,9 +121,9 @@ namespace bsmd.ExcelReadService // construct file path string fileNameWithPath = Path.Combine(Path.GetDirectoryName(receivedFileName), string.Format("{0}_{1}.xlsx", this.templateNames[i], Path.GetFileNameWithoutExtension(receivedFileName))); - this.workbooks[i].SaveAs(fileNameWithPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, + this.workbooks[i].SaveAs(fileNameWithPath, XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, - Type.Missing, Type.Missing); + Type.Missing, Type.Missing); this.workbooks[i].Saved = true; result.Add(fileNameWithPath); this.workbooks[i].Close(); @@ -115,18 +146,33 @@ namespace bsmd.ExcelReadService #region private private void ConfirmValue(string lookup, object value, ExcelReader.ReadState state) - { - for (int i = 0; i < this.nameDicts.Count; i++) + { + for(int i=0;i nameDict = this.nameDicts[i]; + + Name someName = null; + if(nameDict.ContainsKey(lookup)) { - Range range = this.nameDicts[i][lookup].RefersToRange; - if (range != null) + try { - range.Interior.Color = this.ColorForState(state); - range.Value = value; + someName = nameDict[lookup]; + + Range range = someName.RefersToRange; + if (range != null) + { + range.Interior.Color = this.ColorForState(state); + range.Value = value; + } + Marshal.ReleaseComObject(range); + _log.InfoFormat("Value {0} for lookup {1} OK", value, lookup); + } + catch(Exception ex) + { + _log.WarnFormat("cannot set value {0} for lookup {1}: {2}", + value, lookup, ex.Message); } - Marshal.ReleaseComObject(range); } } } @@ -148,7 +194,6 @@ namespace bsmd.ExcelReadService return this.whiteColor; } - #endregion } diff --git a/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs b/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs index c858f9ed..ae54290a 100644 --- a/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs +++ b/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs @@ -33,7 +33,8 @@ namespace bsmd.ExcelReadService System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); string version = fvi.FileVersion; - this._log.InfoFormat("Starting NSW Excel Read Service. v.{0} -------------- ", version); + _log.InfoFormat("Starting NSW Excel Read Service. v.{0} -------------- ", version); + //Confirmation.InitDictionaries(); this.DoOnce(); } diff --git a/nsw/Source/bsmd.ExcelReadService/Program.cs b/nsw/Source/bsmd.ExcelReadService/Program.cs index fbddd2c1..1987eeb5 100644 --- a/nsw/Source/bsmd.ExcelReadService/Program.cs +++ b/nsw/Source/bsmd.ExcelReadService/Program.cs @@ -18,6 +18,7 @@ namespace bsmd.ExcelReadService if (Debugger.IsAttached) { + // Confirmation.InitDictionaries(); ((ExcelReadService)ServicesToRun[0]).DoOnce(); } else diff --git a/nsw/Source/bsmd.ExcelReadService/Util.cs b/nsw/Source/bsmd.ExcelReadService/Util.cs index 4412198e..dbfdbc91 100644 --- a/nsw/Source/bsmd.ExcelReadService/Util.cs +++ b/nsw/Source/bsmd.ExcelReadService/Util.cs @@ -1184,37 +1184,82 @@ namespace bsmd.ExcelReadService { DateTime? sheetValue = reader.ReadDate(lookupNameAttribute.LookupName); if (sheetValue != null) + { property.SetValue(dbEntity, sheetValue); - } + reader.Conf.ConfirmDate(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.OK); + } + else + { + reader.Conf.ConfirmDate(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.WARN); + } + + } else if (property.PropertyType == typeof(double?)) { double? sheetValue = reader.ReadNumber(lookupNameAttribute.LookupName); if (sheetValue != null) + { property.SetValue(dbEntity, sheetValue); - } + reader.Conf.ConfirmNumber(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.OK); + } + else + { + reader.Conf.ConfirmNumber(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.WARN); + } + } else if (property.PropertyType == typeof(string)) { string sheetValue = reader.ReadText(lookupNameAttribute.LookupName); if (sheetValue != null) + { property.SetValue(dbEntity, sheetValue); + reader.Conf.ConfirmText(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.OK); + } + else + { + reader.Conf.ConfirmText(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.WARN); + } } - else if(property.PropertyType == typeof(int?)) + else if (property.PropertyType == typeof(int?)) { double? sheetValue = reader.ReadNumber(lookupNameAttribute.LookupName); if (sheetValue.HasValue) + { property.SetValue(dbEntity, (int)sheetValue.Value); + reader.Conf.ConfirmNumber(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.OK); + } + else + { + reader.Conf.ConfirmNumber(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.WARN); + } } - else if(property.PropertyType == typeof(byte?)) + else if (property.PropertyType == typeof(byte?)) { double? sheetValue = reader.ReadNumber(lookupNameAttribute.LookupName); if (sheetValue.HasValue) + { property.SetValue(dbEntity, (byte)sheetValue.Value); + reader.Conf.ConfirmNumber(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.OK); + } + else + { + reader.Conf.ConfirmNumber(lookupNameAttribute.LookupName, sheetValue, ExcelReader.ReadState.WARN); + } + } - else if(property.PropertyType == typeof(Boolean?)) + else if (property.PropertyType == typeof(Boolean?)) { bool? sheetValue = reader.ReadBoolean(lookupNameAttribute.LookupName); - if (sheetValue.HasValue) + string boolStringValue = reader.ReadText(lookupNameAttribute.LookupName); + if (sheetValue.HasValue) { property.SetValue(dbEntity, sheetValue); + reader.Conf.ConfirmText(lookupNameAttribute.LookupName, sheetValue.Value ? "Y" : "N", + ExcelReader.ReadState.OK); + } + else + { + reader.Conf.ConfirmText(lookupNameAttribute.LookupName, boolStringValue, ExcelReader.ReadState.WARN); + } } else { @@ -1298,6 +1343,24 @@ namespace bsmd.ExcelReadService // somehow lookup LOCODE from the port's name! poc = LocodeDB.LocodeGERFromCity(aGermanPortName); } + + // okay, könnte DK Locode etc sein.. + if(poc == null) + { + if((aGermanPortName != null) && (aGermanPortName.Length == 5)) // possible locode? + { + if (LocodeDB.PortNameFromLocode(aGermanPortName) != null) + poc = aGermanPortName; + } + } + + if(poc == null) + { + List locodes = LocodeDB.AllLocodesForCityName(aGermanPortName); + if (locodes.Count > 0) + poc = locodes[0]; + } + } if (poc != null) diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs index 4a2be253..a6c6dca6 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs @@ -2,6 +2,6 @@ [assembly: AssemblyCompany("Informatikbüro Daniel Schick")] [assembly: AssemblyProduct("BSMD NSW interface")] -[assembly: AssemblyInformationalVersion("3.3.0")] +[assembly: AssemblyInformationalVersion("3.3.1")] [assembly: AssemblyCopyright("Copyright © 2014-2016 Informatikbüro Daniel Schick. All rights reserved.")] [assembly: AssemblyTrademark("")] \ No newline at end of file diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs index 72cc0f52..cb5009fe 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs @@ -1,4 +1,4 @@ using System.Reflection; -[assembly: AssemblyVersion("3.3.0.*")] +[assembly: AssemblyVersion("3.3.1.*")] diff --git a/nsw/Source/misc/info_service_installation.txt b/nsw/Source/misc/info_service_installation.txt index 7fe79e69..7af2dd32 100644 --- a/nsw/Source/misc/info_service_installation.txt +++ b/nsw/Source/misc/info_service_installation.txt @@ -7,3 +7,4 @@ So hat es dann geklappt: - Dann erscheint ein Dialog, in dem man Username + Passwort für den Service angeben muss. Das hat nicht funktioniert für den Admin, auch nicht für meinen User ohne die Domäne vorne dran. mit BSMD\daniel.schick# hat es dann geklappt. +Anschließend kann man in "Dienste" die Anmeldeinformationen wieder auf das normale Systemkonto setzen.