git_bsmd/ENI2/Excel/ExcelBase.cs

201 lines
6.3 KiB
C#

// Copyright (c) 2017-today Informatikbüro Daniel Schick
// Base class excel (writer not yet implemented but eventually..)
using System;
using System.Collections.Generic;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using log4net;
using System.Globalization;
namespace ENI2.Excel
{
internal class ExcelBase : IDisposable
{
#region Fields
internal enum CountryMode { NONE, DE, DK };
protected CountryMode _countryMode = CountryMode.DE;
protected Workbooks _excelWorkbooks;
protected Workbook _workBook;
protected Application _excelApp;
protected Dictionary<string, Name> _nameDict;
protected ILog _log;
#endregion
#region Construction
public ExcelBase()
{
_log = LogManager.GetLogger(this.GetType().Name);
this._excelApp = new Application();
this._excelApp.DisplayAlerts = false;
this._excelWorkbooks = _excelApp.Workbooks;
}
#endregion
#region Properties
internal CountryMode Mode { get { return _countryMode; } }
internal Dictionary<string, Name> NameDict { get { return _nameDict; } }
#endregion
#region protected methods
protected void InitNameFields()
{
_nameDict = new Dictionary<string, Name>();
int bookCnt = 0;
foreach (Name name in _workBook.Names)
{
string theValue = name.Value;
// Namensbezug: =SheetZelle. Leere Referenzen überspringen (kommt immer mal wieder vor!)
string nameKey = name.Name;
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 _workBook.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 double? ReadNumber(string lookup)
{
double? result = null;
try
{
if (_nameDict.ContainsKey(lookup))
{
var val = _nameDict[lookup].RefersToRange.Value;
if (val is double) result = val;
if (val is string)
{
if (double.TryParse(val, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite,
CultureInfo.InvariantCulture, out double tmpDouble))
result = tmpDouble;
if (result == null)
{
if (double.TryParse(val, out tmpDouble)) // current language style (==GER, mit , statt .)
result = tmpDouble;
}
}
if ((result == null) && (val != null))
{
double tmpDouble2 = val[1, 1];
result = tmpDouble2;
}
}
}
catch (Exception)
{
_log.WarnFormat("error reading number for lookup {0}", lookup);
}
return result;
}
internal void Colorize(string lookup, int color)
{
if(_nameDict.ContainsKey(lookup))
{
var range = _nameDict[lookup].RefersToRange;
range.Interior.Color = color;
// range.Worksheet.Tab.ColorIndex = XlColorIndex.xlColorIndexAutomatic;
range.Worksheet.Tab.Color = color;
}
}
#endregion
#region public methods
public void Save(string path)
{
this._workBook.SaveAs(path, 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;
}
#endregion
#region Dispose
public void Dispose()
{
try
{
if (this._workBook != null)
{
this._workBook.Close(0);
_log.Debug("Close Worksheet");
Marshal.ReleaseComObject(this._workBook);
}
if (this._excelWorkbooks != null)
{
this._excelWorkbooks.Close();
_log.Debug("Close Workbooks");
Marshal.ReleaseComObject(this._excelWorkbooks);
}
if (this._excelApp != null)
{
_log.Debug("Quit Excel");
this._excelApp.Quit();
Marshal.ReleaseComObject(this._excelApp);
}
}
catch(Exception ex)
{
_log.ErrorFormat("Exception disposing ExcelReader: {0}", ex.Message);
}
}
#endregion
}
}