コード例 #1
0
        private void RenderSubrange(RangeTemplate ownRng, object item, FormulaEvaluator evaluator, TemplateCell cell,
                                    TagsList tags, ref int iCell, ref int row)
        {
            var start = _buff.NextAddress;
            // the child template to which the cell belongs
            var formula = ownRng.Source.ReplaceLast("_", ".");

            if (evaluator.Evaluate(formula, new Parameter(Name, item)) is IEnumerable value)
            {
                var valArr = value.Cast <object>().ToArray();
                ownRng.Generate(valArr);

                if (ownRng.IsHorizontal)
                {
                    int shiftLen = ownRng._colCnt * (valArr.Length - 1);
                    tags.Where(tag => tag.Cell.Row == cell.Row && tag.Cell.Column > cell.Column)
                    .ForEach(t =>
                    {
                        t.Cell.Column += shiftLen;
                        t.Cell.XLCell  = _rowRange.Cell(t.Cell.Row, t.Cell.Column);
                    });
                }
                else
                {
                    // move current template cell to next (skip subrange)
                    row += ownRng._rowCnt + 1;
                    while (_cells[iCell].Row <= row - 1)
                    {
                        iCell++;
                    }

                    iCell--; // roll back. After it became clear that it was too much, we must go back.

                    int shiftLen = ownRng._rowCnt * (valArr.Length - 1);
                    tags.Where(tag => tag.Cell.Row > cell.Row)
                    .ForEach(t =>
                    {
                        t.Cell.Row   += shiftLen;
                        t.Cell.XLCell = _rowRange.Cell(t.Cell.Row, t.Cell.Column);
                    });
                }
            }

            var rng       = _buff.GetRange(start, _buff.PrevAddress);
            var rangeName = ownRng.Name;
            var dnr       = rng.Worksheet.Workbook.NamedRange(rangeName);

            dnr.SetRefersTo(rng);
        }
コード例 #2
0
        private void RenderSubrange(object item, FormulaEvaluator evaluator, TemplateCell cell, TagsList tags, ref int iCell, ref int row)
        {
            var start = _buff.NextAddress;
            // дочерний шаблон, к которому принадлежит ячейка
            var xlCell  = _rowRange.Cell(cell.Row, cell.Column);
            var ownRng  = _subranges.First(r => r._cells.Any(c => c.CellType != TemplateCellType.None && c.XLCell != null && Equals(c.XLCell.Address, xlCell.Address)));
            var formula = "{{" + ownRng.Source.ReplaceLast("_", ".") + "}}";

            if (evaluator.Evaluate(formula, new Parameter(Name, item)) is IEnumerable value)
            {
                var valArr = value.Cast <object>().ToArray();
                ownRng.Generate(valArr);

                if (ownRng.IsHorizontal)
                {
                    iCell += ownRng._colCnt - 1;
                    int shiftLen = ownRng._colCnt * (valArr.Length - 1);
                    tags.Where(tag => tag.Cell.Row == cell.Row && tag.Cell.Column > cell.Column)
                    .ForEach(t =>
                    {
                        t.Cell.Column += shiftLen;
                        t.Cell.XLCell  = _rowRange.Cell(t.Cell.Row, t.Cell.Column);
                    });
                }
                else
                {
                    row += ownRng._rowCnt - 1;
                    while (_cells[iCell].Row <= row + 1)
                    {
                        iCell++;
                    }

                    int shiftLen = ownRng._rowCnt * (valArr.Length - 1);
                    tags.Where(tag => tag.Cell.Row > cell.Row)
                    .ForEach(t =>
                    {
                        t.Cell.Row   += shiftLen;
                        t.Cell.XLCell = _rowRange.Cell(t.Cell.Row, t.Cell.Column);
                    });
                }
            }

            var rng       = _buff.GetRange(start, _buff.PrevAddress);
            var rangeName = ownRng.Name;
            var dnr       = rng.Worksheet.Workbook.NamedRange(rangeName);

            dnr.SetRefersTo(rng);
        }