Beispiel #1
0
        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);
        }
Beispiel #3
0
        /// <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);
        }