private static GemBox.Spreadsheet.CellRange getUsedCellRange(ExcelWorksheet ews, FORMAT format)
        {
            GemBox.Spreadsheet.CellRange rangeRes = null;

            int iRow  = -1
            , iColumn = -1;

            // только для 'FORMAT.HEAP'
            iRow    = 0;
            iColumn = 0;
            while (!(ews.Rows[iRow].Cells[0].Value == null))
            {
                while (!(ews.Rows[iRow].Cells[iColumn].Value == null))
                {
                    iColumn++;
                }

                iRow++;
            }

            if ((iRow > 0) &&
                (iColumn > 0))
            {
                rangeRes = ews.Cells.GetSubrangeAbsolute(0, 0, iRow - 1, iColumn - 1);
            }
            else
            {
                ;
            }

            return(rangeRes);
        }
        /// <summary>
        /// Очитсить содержимое книги MS Excel
        /// </summary>
        /// <param name="strNameSettingsExcelFile">Полный путь + наименование для очищаемой книги (файла конфигурации)</param>
        /// <param name="format">Формат книги MS Excel</param>
        private static void clearWorkbook(string strNameSettingsExcelFile = @"", FORMAT format = FORMAT.ORDER)
        {
            string strNameSettings = getFullNameSettingsExcelFile(strNameSettingsExcelFile);
            int    i = -1, j = -1;

            try {
                closeWorkbook(strNameSettings);

                ExcelFile ef = new ExcelFile();
                ef.LoadXls(strNameSettings, XlsOptions.None);

                if (ef.Protected == false)
                {
                    foreach (ExcelWorksheet ews in ef.Worksheets)
                    {
                        GemBox.Spreadsheet.CellRange range = ews.GetUsedCellRange();

                        Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"{0}Очистка листа с имененм = {1}", Environment.NewLine, ews.Name));

                        if ((range.LastRowIndex + 1) > 0)
                        {
                            // создать структуру таблицы - добавить поля в таблицу, при необходимости создать таблицу
                            createDataTableWorksheet(ews.Name, range);
                            // удалить значения, если есть
                            if (_dictDataTableOfExcelWorksheet[ews.Name].Rows.Count > 0)
                            {
                                _dictDataTableOfExcelWorksheet[ews.Name].Rows.Clear();
                            }
                            else
                            {
                                ;
                            }

                            for (i = range.FirstRowIndex + (format == FORMAT.HEAP ? 0 : format == FORMAT.ORDER ? 1 : 0); !(i > (range.LastRowIndex + 1)); i++)
                            {
                                for (j = range.FirstColumnIndex; !(j > range.LastColumnIndex); j++)
                                {
                                    range[i - range.FirstRowIndex, j - range.FirstColumnIndex].Value = string.Empty;
                                }
                            }
                        }
                        else
                        {
                            ;
                        }
                    }

                    ef.SaveXls(strNameSettings);
                }
                else
                {
                    Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"{0}Очистка книги с имененм = {1} невозможна", Environment.NewLine, strNameSettings));
                }
            } catch (Exception e) {
                Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"{0}Сохранение MSExcel-книги исключение: {1}{0}{2}", Environment.NewLine, e.Message, e.StackTrace));
            }
        }
        private static void extractDataWorksheet(ExcelWorksheet ews, GemBox.Spreadsheet.CellRange range, FORMAT format)
        {
            // создать структуру таблицы - добавить поля в таблицу, при необходимости создать таблицу
            createDataTableWorksheet(ews.Name, range, format);

            ews.ExtractDataEvent += new ExcelWorksheet.ExtractDataEventHandler((sender, e) => {
                e.DataTableValue = e.ExcelValue == null ? null : e.ExcelValue.ToString();
                e.Action         = ExtractDataEventAction.Continue;
            });

            try {
                ews.ExtractToDataTable(_dictDataTableOfExcelWorksheet[ews.Name]
                                       , range.LastRowIndex + 1
                                       , ExtractDataOptions.SkipEmptyRows | ExtractDataOptions.StopAtFirstEmptyRow
                                       , ews.Rows[range.FirstRowIndex + (format == FORMAT.HEAP ? 0 : format == FORMAT.ORDER ? 1 : 0)]
                                       , ews.Columns[range.FirstColumnIndex]
                                       );

                _dictDataTableOfExcelWorksheet[ews.Name].TableName = ews.Name;
            } catch (Exception e) {
                Logging.ExceptionCaller(MethodBase.GetCurrentMethod(), e, string.Format(@"Лист MS Excel: {0}", ews.Name));
            }

            Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"На листе с имененм = {0} полей = {1}", ews.Name, range.LastColumnIndex + 1));

            //// добавить записи в таблицу
            //for (i = range.FirstRowIndex + 1; !(i > range.LastRowIndex); i++) {
            //    dataRow = null;

            //    for (j = range.FirstColumnIndex; !(j > range.LastColumnIndex); j++) {
            //        cellValue = string.Empty;
            //        iValidateCellRes = validateCell(range, i, j);

            //        if (iValidateCellRes == VALIDATE_CELL_RESULT.NEW_ROW) {
            //            dataRow = _dictDataTableOfExcelWorksheet[ews.Name].Rows.Add();

            //            cellValue = range[i - range.FirstRowIndex, j - range.FirstColumnIndex].Value.ToString();
            //            acDoc.Editor.WriteMessage(string.Format(@"{0}Добавлена строка для элемента = {1}", Environment.NewLine, cellValue));
            //        } else
            //            if (iValidateCellRes == VALIDATE_CELL_RESULT.CONTINUE)
            //            continue;
            //        else
            //                if (iValidateCellRes == VALIDATE_CELL_RESULT.BREAK)
            //            break;
            //        else
            //            // значение для параметра (VALIDATE_CELL_RESULT.VALUE)
            //            cellValue = range[i - range.FirstRowIndex, j - range.FirstColumnIndex].Value.ToString();

            //        if (dataRow == null)
            //            break;
            //        else
            //            dataRow[j] = cellValue;
            //    }
            //}
        }
        /// <summary>
        /// Создать таблицу для проецирования значений с листа книги MS Excel
        ///  , где наименования полей таблицы содержатся в 0-ой строке листа книги MS Excel
        /// </summary>
        /// <param name="nameWorksheet">Наименование листа книги MS Excel</param>
        /// <param name="rg">Регион на листе(странице) книги MS Excel</param>
        /// <param name="format">Формат книги MS Excel</param>
        private static void createDataTableWorksheet(string nameWorksheet
                                                     , GemBox.Spreadsheet.CellRange rg
                                                     , FORMAT format = FORMAT.ORDER)
        {
            string nameColumn = string.Empty;

            if (_dictDataTableOfExcelWorksheet == null)
            {
                // добавить элемент
                _dictDataTableOfExcelWorksheet = new Dictionary <string, System.Data.DataTable>();
            }
            else
            {
                ;
            }

            if (_dictDataTableOfExcelWorksheet.Keys.Contains(nameWorksheet) == false)
            {
                // добавить таблицу (пустую)
                _dictDataTableOfExcelWorksheet.Add(nameWorksheet, new System.Data.DataTable());
            }
            else
            {
                ;
            }

            if (!(_dictDataTableOfExcelWorksheet[nameWorksheet].Columns.Count == (rg.LastColumnIndex + 1)))
            {
                _dictDataTableOfExcelWorksheet[nameWorksheet].Columns.Clear();

                for (int j = rg.FirstColumnIndex; !(j > rg.LastColumnIndex); j++)
                {
                    // наименование столбцов таблицы всегда в 0-ой строке листа книги MS Excel
                    switch (format)
                    {
                    case FORMAT.HEAP:
                        nameColumn = string.Format(@"{0:000}", j);
                        break;

                    case FORMAT.ORDER:
                    default:
                        nameColumn = rg[0, j - rg.FirstColumnIndex].Value.ToString();
                        break;
                    }
                    // все поля в таблице типа 'string'
                    _dictDataTableOfExcelWorksheet[nameWorksheet].Columns.Add(nameColumn, typeof(string));
                }
            }
            else
            {
                ;
            }
        }
        /// <summary>
        /// Проверить значение в ячейке
        /// </summary>
        /// <param name="range">Диапазон столбцов/строк</param>
        /// <param name="iRow">Номер строки</param>
        /// <param name="iColumn">Номер столбца</param>
        /// <returns>Результат проверки</returns>
        private static VALIDATE_CELL_RESULT validateCell(GemBox.Spreadsheet.CellRange range, int iRow, int iColumn)
        {
            VALIDATE_CELL_RESULT iRes = VALIDATE_CELL_RESULT.BREAK;

            ExcelCell cell = range[iRow - range.FirstRowIndex, iColumn - range.FirstColumnIndex];

            if ((!(cell == null)) &&
                (!(cell.Value == null)))
            {
                // только при наличии значения
                if (cell.Value.Equals(string.Empty) == true)
                {
                    // значение пустое
                    if (iColumn == range.FirstColumnIndex)
                    {
                        // если это ИМЯ элемента - запись не добавлять
                        ; // оставить как есть "-1"
                    }
                    else
                    {
                        // если это параметр - перейти к обработке следующего
                        iRes = VALIDATE_CELL_RESULT.CONTINUE;
                    }
                }
                else
                // значение НЕ пустое
                if (iColumn == range.FirstColumnIndex)
                {
                    // если это ИМЯ элемента - добавить запись
                    iRes = 0;
                }
                else
                {
                    // если это параметр - присвоить значение для параметра
                    iRes = VALIDATE_CELL_RESULT.VALUE;
                }
            }
            else
            // значения нет
            if (iColumn == range.FirstColumnIndex)
            {
                // если это ИМЯ элемента - запись не добавлять
                ;     // оставить как есть "-1"
            }
            else
            {
                // если это параметр - перейти к обработке следующего
                iRes = VALIDATE_CELL_RESULT.CONTINUE;
            }

            return(iRes);
        }
        /// <summary>
        /// Сохранить внесенные изменения в книге MS Excel
        /// </summary>
        /// <param name="strNameSettingsExcelFile">Полный путь + наименование для сохраняемой книги (файла конфигурации)</param>
        /// <param name="format">Формат книги MS Excel</param>
        private static void saveWorkbook(string strNameSettingsExcelFile = @"", FORMAT format = FORMAT.ORDER)
        {
            string strNameSettings = getFullNameSettingsExcelFile(strNameSettingsExcelFile);
            int    i = -1, j = -1;

            try {
                closeWorkbook(strNameSettings);

                ExcelFile ef = new ExcelFile();
                ef.LoadXls(strNameSettings, XlsOptions.None);

                if (ef.Protected == false)
                {
                    foreach (ExcelWorksheet ews in ef.Worksheets)
                    {
                        GemBox.Spreadsheet.CellRange range = ews.GetUsedCellRange();

                        Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"{0}Сохранение листа с имененм = {1}", Environment.NewLine, ews.Name));

                        try {
                            ews.InsertDataTable(_dictDataTableOfExcelWorksheet[ews.Name]
                                                , range.FirstRowIndex + (format == FORMAT.HEAP ? 0 : format == FORMAT.ORDER ? 1 : 0)
                                                , range.FirstColumnIndex
                                                , false
                                                );

                            //if ((range.LastRowIndex + 1) > 0) {
                            //    for (i = range.FirstRowIndex + 1; !(i > (range.LastRowIndex + 1)); i++) {
                            //        for (j = range.FirstColumnIndex; !(j > range.LastColumnIndex); j++) {
                            //            range[i - range.FirstRowIndex, j - range.FirstColumnIndex].Value = string.Empty;
                            //        }
                            //    }
                            //} else
                            //    ;
                        } catch (Exception e) {
                            Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"{0}Сохранение книги с имененм = {1}, лист = {2} невозможна", Environment.NewLine, strNameSettings, ews.Name));
                        }
                    }

                    ef.SaveXls(strNameSettings);
                }
                else
                {
                    Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"{0}Сохранение книги с имененм = {1} невозможна", Environment.NewLine, strNameSettings));
                }
            } catch (Exception e) {
                Logging.DebugCaller(MethodBase.GetCurrentMethod(), string.Format(@"{0}Сохранение MSExcel-книги исключение: {1}{0}{2}", Environment.NewLine, e.Message, e.StackTrace));
            }
        }