public SacmigFileData Parse(Stream stream)
        {
            ExcelPackage   excelDocument = new ExcelPackage(stream);
            ExcelWorksheet workSheet     = excelDocument.Workbook.Worksheets.First();

            var startRow    = 1;
            var startColumn = 1;
            var endRow      = workSheet.Dimension.End.Row;
            var endColumn   = workSheet.Dimension.End.Column;

            var data = new SacmigFileData
            {
                ObjectName          = workSheet.Cells[startRow++, 1].Value?.ToString(),
                SubjectOfMonitoring = workSheet.Cells[startRow++, 1].Value?.ToString()
            };
            var keys = ParseHeader(workSheet, startRow, startColumn, endColumn);

            for (int rowId = startRow + 1; rowId <= endRow; rowId++)
            {
                try
                {
                    ParseRow(workSheet, rowId, startColumn, keys, data);
                }
                catch
                {
                    continue;
                }
            }
            return(data);
        }
        private void ParseRow(ExcelWorksheet worksheet, int row, int startColumn, List <string> keys, SacmigFileData data)
        {
            //first column alays is date!
            var dateValue = worksheet.Cells[row, startColumn].Value;
            var dateTuple = dateValue is double?
                            ParseDateCell((double)dateValue) : ParseDateCell(dateValue.ToString());

            for (int keyIndex = 0; keyIndex < keys.Count; keyIndex++)
            {
                var value = worksheet.Cells[row, startColumn + keyIndex + 1].Value;
                if (value != null)
                {
                    try
                    {
                        var doubleValue = value is double?
                                          (double)value : Double.Parse(value.ToString(), CultureInfo.InvariantCulture);
                        data.AddCharacteristicValue(keys[keyIndex], doubleValue, dateTuple.Item1, dateTuple.Item2);
                    }
                    catch
                    {
                        continue;
                    }
                }
            }
        }