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)); } }