git_bsmd/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs
2016-01-17 15:00:26 +00:00

130 lines
4.3 KiB
C#

//
// 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<string, Name> _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<string, Name>();
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;
}
}
}
}