private void RenderCell(FormulaEvaluator evaluator, TemplateCell cell, params Parameter[] pars) { object value; try { value = cell.IsCalculated ? evaluator.Evaluate(cell.GetString(), pars) : cell.CellType == TemplateCellType.Formula ? cell.Formula : cell.Value; } catch (ParseException ex) { _buff.WriteValue(ex.Message, cell.Style); _buff.GetCell(_buff.PrevAddress.RowNumber, _buff.PrevAddress.ColumnNumber).Style.Font.FontColor = XLColor.Red; _errors.Add(new TemplateError(ex.Message, cell.XLCell.AsRange())); return; } if (cell.CellType == TemplateCellType.Formula) { var r1c1 = cell.XLCell.GetFormulaR1C1(value.ToString()); _buff.WriteFormulaR1C1(r1c1, cell.Style); } else { _buff.WriteValue(value, cell.Style); } }
public void ParseTags(IXLRange range, string rangeName) { var innerRanges = range.GetContainingNames().Where(nr => _variables.ContainsKey(nr.Name)).ToArray(); var cells = from c in range.CellsUsed() let value = c.GetString() where !c.HasFormula && (value.StartsWith("<<") || value.EndsWith(">>")) && !innerRanges.Any(nr => { using (var r = nr.Ranges) using (var cr = c.AsRange()) return(r.Contains(cr)); }) select c; if (!_tags.ContainsKey(rangeName)) { _tags.Add(rangeName, new TagsList()); } foreach (var cell in cells) { string value = cell.GetString(); OptionTag[] tags; string newValue; var templateCell = new TemplateCell(cell.Address.RowNumber, cell.Address.ColumnNumber, cell); if (value.StartsWith("&=")) { tags = _tagsEvaluator.Parse(value.Substring(2), range, templateCell, out newValue); cell.FormulaA1 = newValue; } else { tags = _tagsEvaluator.Parse(value, range, templateCell, out newValue); cell.Value = newValue; } _tags[rangeName].AddRange(tags); } }
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); }
private void RenderCell(FormulaEvaluator evaluator, TemplateCell cell, params Parameter[] pars) { var value = cell.IsCalculated ? evaluator.Evaluate(cell.GetString(), pars) : cell.CellType == TemplateCellType.Formula ? cell.Formula : cell.Value; if (cell.CellType == TemplateCellType.Formula) { var r1c1 = cell.XLCell.GetFormulaR1C1(value.ToString()); _buff.WriteFormulaR1C1(r1c1, cell.Style); } else { _buff.WriteValue(value, cell.Style); } }
private void RenderCell(object[] items, int i, FormulaEvaluator evaluator, TemplateCell cell) { RenderCell(evaluator, cell, new Parameter("item", items[i]), new Parameter("index", i)); }
private void RenderCell(FormulaEvaluator evaluator, TemplateCell cell, params Parameter[] pars) { object value; try { value = cell.IsCalculated ? evaluator.Evaluate(cell.GetString(), pars) : cell.CellType == TemplateCellType.Formula ? cell.Formula : cell.Value; } catch (ParseException ex) { _buff.WriteValue(ex.Message, cell.XLCell); _buff.GetCell(_buff.PrevAddress.RowNumber, _buff.PrevAddress.ColumnNumber).Style.Font.FontColor = XLColor.Red; _errors.Add(new TemplateError(ex.Message, cell.XLCell.AsRange())); return; } IXLCell xlCell; if (cell.CellType == TemplateCellType.Formula) { var r1c1 = cell.XLCell.GetFormulaR1C1(value.ToString()); xlCell = _buff.WriteFormulaR1C1(r1c1, cell.XLCell); } else { xlCell = _buff.WriteValue(value, cell.XLCell); } string EvalString(string str) { try { return(evaluator.Evaluate(str, pars).ToString()); } catch (ParseException ex) { _errors.Add(new TemplateError(ex.Message, cell.XLCell.AsRange())); return(ex.Message); } } if (xlCell.HasComment) { var comment = EvalString(xlCell.Comment.Text); xlCell.Comment.ClearText(); xlCell.Comment.AddText(comment); } if (xlCell.HasHyperlink) { if (xlCell.Hyperlink.IsExternal) { xlCell.Hyperlink.ExternalAddress = new Uri(EvalString(xlCell.Hyperlink.ExternalAddress.ToString())); } else { xlCell.Hyperlink.InternalAddress = EvalString(xlCell.Hyperlink.InternalAddress); } } if (xlCell.HasRichText) { var richText = EvalString(xlCell.RichText.Text); xlCell.RichText.ClearText(); xlCell.RichText.AddText(richText); } }
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); }