private void AddRowRangeToFormulaSum(string id, FormulaRowsRange addedRange) { if (!_isFormingFormulasToCell) { return; } List <FormulaRowsRange> existsRanges; if (!_formulas.TryGetValue(id, out existsRanges)) { existsRanges = new List <FormulaRowsRange>(); _formulas.Add(id, existsRanges); } existsRanges.Add(addedRange); }
internal void AddRowRangeToFormulaSum(XlsFileExBase xls, string id, FormulaRowsRange addedRange) { if (!_isFormingFormulasToCell) { return; } List <FormulaRowsRange> existsRanges; if (!xls.FormulasSum.TryGetValue(id, out existsRanges)) { existsRanges = new List <FormulaRowsRange>(); xls.FormulasSum.Add(id, existsRanges); } existsRanges.Add(addedRange); }
/// <summary> /// Пишем формулу в excel /// </summary> /// <param name="id">Идентификатор</param> /// <param name="row">Ячейка</param> /// <param name="col">Колонка</param> /// <param name="format">Формат</param> /// <param name="defaultValue">Значение по умолчанию, если не excel, или не найдена формула</param> internal void WriteRowRangeFormulaToCell(string id, int row, int col, int format, double defaultValue, FormulaRowsRange rowsRange = null) { if (_isFormingFormulasToCell) { var formula = new StringBuilder("=SUM("); #region Формирование формулы var formingFormulaAction = (Action <string, int, int, int, int?, bool>)((sheetName, row1, row2, col1, col2, isMinus) => { var sheet = isMinus ? "-" : string.Empty; if (!string.IsNullOrEmpty(sheetName)) { sheet = "'" + sheetName + "'!"; } if (row1 == row2 && !col2.HasValue) { formula.Append(sheet + TCellAddress.EncodeColumn(col1)).Append(row1) .Append(","); } else { formula.Append(sheet + TCellAddress.EncodeColumn(col1)).Append(row1) .Append(":") .Append(sheet + TCellAddress.EncodeColumn(col2 ?? col1)).Append(row2) .Append(","); } }); #endregion #region Если пишем формулу не из словаря if (rowsRange != null) { formingFormulaAction(rowsRange.SheetName, rowsRange.Row1, rowsRange.Row2, rowsRange.Col, rowsRange.Col2, rowsRange.IsMinus); formula.Replace(",", ")", formula.Length - 1, 1); //Удаляем последний ; _xls.SetCellValue(row, col, new TFormula(formula.ToString()), format); return; } #endregion #region Пишем формулу из словаря List <FormulaRowsRange> existsRanges; if (_formulas.TryGetValue(id, out existsRanges) && existsRanges.Count > 0) { var prevSheetName = string.Empty; var prevCol = -1; var prevRow1 = -1; var prevRow2 = -1; bool isMinus = false; foreach (var formulasRange in existsRanges.OrderBy(r => r.SheetName) .ThenBy(r => r.Row1).ThenBy(r => r.Row2)) { //Обрабатываем предыдущую запись if (Equals(prevSheetName, (formulasRange.SheetName ?? string.Empty)) && prevCol == formulasRange.Col && prevRow2 >= formulasRange.Row1 - 1) { //Пересекаются диапазоны, присоединяем диапазон к предыдущему prevRow2 = formulasRange.Row2; } else { //Пишем предыдущую запись if (prevCol > 0) { formingFormulaAction(prevSheetName, prevRow1, prevRow2, prevCol, null, isMinus); } //Сохраняем текущую prevSheetName = formulasRange.SheetName ?? string.Empty; prevCol = formulasRange.Col; prevRow1 = formulasRange.Row1; prevRow2 = formulasRange.Row2; } isMinus = formulasRange.IsMinus; } //Обрабатываем последнюю запись if (prevCol > 0) { formingFormulaAction(prevSheetName, prevRow1, prevRow2, prevCol, null, isMinus); } formula.Replace(",", ")", formula.Length - 1, 1); //Удаляем последний if (col <= 16384) { _xls.SetCellValue(row, col, new TFormula(formula.ToString()), format); } _formulas.Remove(id); return; } #endregion } //Нет формулы, или не надо ее формировать _xls.SetCellValue(row, col, defaultValue, format); }