// // Class: ExcelReader // Current CLR: 4.0.30319.34209 // System: Microsoft Visual Studio 10.0 // Author: dani // Created: 6/15/2015 10:03:40 PM // // Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved. using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.IO; using log4net; using Microsoft.Office.Interop.Excel; namespace bsmd.ExcelReadService { public class ExcelReader : IDisposable { private ILog _log = LogManager.GetLogger(typeof(ExcelReader)); private Workbooks _excelWorkbooks; private Application _excelApp; private Dictionary _nameDict; public ExcelReader(string filePath) { this._excelApp = new Application(); this._excelWorkbooks = _excelApp.Workbooks; Workbook portcall = _excelWorkbooks.Open(filePath, 0, true, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false); _nameDict = new Dictionary(); foreach(Name name in portcall.Names) { _nameDict[name.Name] = name; } } public string ReadText(string lookup) { if (!_nameDict.ContainsKey(lookup)) return null; var val = _nameDict[lookup].RefersToRange.Value; var val2 = _nameDict[lookup].RefersToRange.Value2; if(val != null) return val.ToString(); if (val2 != null) return val2.ToString(); return null; } public void Dispose() { if (this._excelWorkbooks != null) this._excelWorkbooks.Close(); if (this._excelApp != null) this._excelApp.Quit(); } internal DateTime? ReadDate(string lookup) { try { var val = _nameDict[lookup].RefersToRange.Value; if (val is DateTime) return val; if (val is double) return DateTime.FromOADate(val); DateTime date; if (DateTime.TryParse(val, out date)) return date; // TODO: weitere varianten ausprobieren return null; } catch (Exception) { _log.WarnFormat("error parsing datetime for lookup {0}", lookup); return null; } } internal DateTime? ReadTime(string lookup) { try { var val = _nameDict[lookup].RefersToRange.Value; if (val is DateTime) return val; if (val is double) return DateTime.FromOADate(val); DateTime date; if (DateTime.TryParseExact(val, "HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out date)) return date; if (DateTime.TryParseExact(val, "HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out date)) return date; return null; } catch (Exception) { _log.WarnFormat("error reading time for lookup {0}", lookup); return null; } } internal double? ReadNumber(string lookup) { double result; try { var val = _nameDict[lookup].RefersToRange.Value; if (val is double) return val; if (val is string) { if (double.TryParse(val, NumberStyles.None, CultureInfo.InvariantCulture, out result)) return result; if (double.TryParse(val, out result)) return result; } return null; } catch (Exception) { _log.WarnFormat("error reading number for lookup {0}", lookup); return null; } } } }