/// <summary> /// Render a foreach page element /// </summary> /// <param name="forEach"></param> /// <param name="document"></param> /// <param name="wdDoc"></param> /// <param name="context"></param> /// <param name="mainDocumentPart"></param> /// <param name="formatProvider"></param> public static void Render(this ForEachPage forEach, Document document, OpenXmlElement wdDoc, ContextModel context, MainDocumentPart mainDocumentPart, IFormatProvider formatProvider) { context.ReplaceItem(forEach, formatProvider); if (string.IsNullOrEmpty(forEach.DataSourceKey) || !context.ExistItem <DataSourceModel>(forEach.DataSourceKey)) { return; } var datasource = context.GetItem <DataSourceModel>(forEach.DataSourceKey); if (datasource == null || datasource.Items == null) { return; } int i = 0; foreach (var item in datasource.Items) { var newPage = forEach.Clone(); // doc inherit margin from page if (document.Margin == null && newPage.Margin != null) { document.Margin = newPage.Margin; } // newPage inherit margin from doc else if (document.Margin != null && newPage.Margin == null) { newPage.Margin = document.Margin; } if (!string.IsNullOrWhiteSpace(forEach.AutoContextAddItemsPrefix)) { // We add automatic keys : // Is first item item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsFirstItem#", new BooleanModel(i == 0)); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsNotFirstItem#", new BooleanModel(i > 0)); // Is last item item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsLastItem#", new BooleanModel(i == datasource.Items.Count - 1)); // Index of the element (Based on 0, and based on 1) item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IndexBaseZero#", new StringModel(i.ToString())); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IndexBaseOne#", new StringModel((i + 1).ToString())); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsOdd#", new BooleanModel(i % 2 == 1)); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsEven#", new BooleanModel(i % 2 == 0)); } newPage.Clone().Render(document, wdDoc, item, mainDocumentPart, formatProvider); i++; } }
/// <summary> /// Render a ForEach element in the document /// </summary> /// <param name="forEach"></param> /// <param name="document"></param> /// <param name="parent"></param> /// <param name="context"></param> /// <param name="documentPart"></param> /// <param name="formatProvider"></param> public static void Render(this ForEach forEach, Document document, OpenXmlElement parent, ContextModel context, OpenXmlPart documentPart, IFormatProvider formatProvider) { context.ReplaceItem(forEach, formatProvider); if (string.IsNullOrEmpty(forEach.DataSourceKey) || !context.ExistItem <DataSourceModel>(forEach.DataSourceKey)) { return; } var datasource = context.GetItem <DataSourceModel>(forEach.DataSourceKey); if (datasource == null || datasource.Items == null) { return; } int i = 0; foreach (var item in datasource.Items) { item.AddAutoContextAddItemsPrefix(forEach, i, datasource); for (int j = 0; j < forEach.ItemTemplate.Count; j++) { var template = forEach.ItemTemplate[j]; var clone = template.Clone(); // Specific rule for TemplateModels in childs : if (clone is TemplateModel) { var templateElements = (clone as TemplateModel).ExtractTemplateItems(document); foreach (var templateEement in templateElements) { templateEement.Render(document, parent, item, documentPart, formatProvider); } } else { clone.Render(document, parent, item, documentPart, formatProvider); } } i++; } }
/// <summary> /// Render a table element /// </summary> /// <param name="table"></param> /// <param name="parent"></param> /// <param name="context"></param> /// <param name="documentPart"></param> /// <param name="formatProvider"></param> /// <returns></returns> public static Run Render(this BarModel barChart, OpenXmlElement parent, ContextModel context, OpenXmlPart documentPart, IFormatProvider formatProvider) { context.ReplaceItem(barChart, formatProvider); Run runItem = null; if (!string.IsNullOrWhiteSpace(barChart.DataSourceKey) && context.ExistItem <BarChartModel>(barChart.DataSourceKey)) { // We construct categories and series from the context object var contextModel = context.GetItem <BarChartModel>(barChart.DataSourceKey); if (contextModel.BarChartContent != null && contextModel.BarChartContent.Categories != null && contextModel.BarChartContent.Series != null) { // Update barChart object : barChart.Categories = contextModel.BarChartContent.Categories.Select(e => new BarCategory() { Name = e.Name, Color = e.Color }).ToList(); // We update barChart.Series = contextModel.BarChartContent.Series.Select(e => new BarSerie() { LabelFormatString = e.LabelFormatString, Color = e.Color, DataLabelColor = e.DataLabelColor, Values = e.Values, Name = e.Name }).ToList(); } else { return(runItem); } } switch (barChart.BarChartType) { case BarChartType.BarChart: runItem = CreateBarGraph(barChart, documentPart); break; } if (runItem != null) { parent.AppendChild(runItem); } return(runItem); }
/// <summary> /// /// </summary> /// <param name="row"></param> /// <param name="document"></param> /// <param name="parent"></param> /// <param name="context"></param> /// <param name="documentPart"></param> /// <param name="isHeader"></param> /// <param name="isAlternateRow">true for even lines</param> /// <param name="formatProvider"></param> /// <returns></returns> public static TableRow Render(this Row row, Models.Document document, OpenXmlElement parent, ContextModel context, OpenXmlPart documentPart, bool isHeader, bool isAlternateRow, IFormatProvider formatProvider) { if (!string.IsNullOrWhiteSpace(row.ShowKey) && context.ExistItem <BooleanModel>(row.ShowKey) && !context.GetItem <BooleanModel>(row.ShowKey).Value) { return(null); } context.ReplaceItem(row, formatProvider); TableRow wordRow = new TableRow(); TableRowProperties wordRowProperties = new TableRowProperties(); if (isHeader) { wordRowProperties.AppendChild(new TableHeader() { Val = OnOffOnlyValues.On }); } wordRow.AppendChild(wordRowProperties); if (row.RowHeight.HasValue) { wordRowProperties.AppendChild(new TableRowHeight() { Val = UInt32Value.FromUInt32((uint)row.RowHeight.Value) }); } if (row.CantSplit) { wordRowProperties.AppendChild(new CantSplit()); } foreach (var cell in row.Cells) { cell.InheritFromParent(row); wordRow.AppendChild(cell.Render(document, wordRow, context, documentPart, isAlternateRow, formatProvider)); } return(wordRow); }
public static void Render(this Page page, Models.Document document, OpenXmlElement wdDoc, ContextModel context, MainDocumentPart mainDocumentPart, IFormatProvider formatProvider) { if (!string.IsNullOrWhiteSpace(page.ShowKey) && context.ExistItem <BooleanModel>(page.ShowKey) && !context.GetItem <BooleanModel>(page.ShowKey).Value) { return; } // add page content ((BaseElement)page).Render(document, wdDoc, context, mainDocumentPart, formatProvider); // add section to manage orientation. Last section is at the end of document var pageSize = new PageSize() { Orient = page.PageOrientation.ToOOxml(), Width = UInt32Value.FromUInt32(page.PageOrientation == PageOrientationValues.Landscape ? (uint)16839 : 11907), Height = UInt32Value.FromUInt32(page.PageOrientation == PageOrientationValues.Landscape ? (uint)11907 : 16839) }; var sectionProps = new SectionProperties(pageSize); // document margins if (page.Margin != null) { var pageMargins = new PageMargin() { Left = page.Margin.Left, Top = page.Margin.Top, Right = page.Margin.Right, Bottom = page.Margin.Bottom, Footer = page.Margin.Footer, Header = page.Margin.Header }; sectionProps.AppendChild(pageMargins); } var p = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); var ppr = new ParagraphProperties(); p.AppendChild(ppr); ppr.AppendChild(sectionProps); wdDoc.AppendChild(p); }
/// <summary> /// Render a table element /// </summary> /// <param name="uniformGrid"></param> /// <param name="parent"></param> /// <param name="context"></param> /// <returns></returns> public static DocumentFormat.OpenXml.Wordprocessing.Table Render(this UniformGrid uniformGrid, Document document, OpenXmlElement parent, ContextModel context, OpenXmlPart documentPart, IFormatProvider formatProvider) { context.ReplaceItem(uniformGrid, formatProvider); if (!string.IsNullOrEmpty(uniformGrid.DataSourceKey) && context.ExistItem <DataSourceModel>(uniformGrid.DataSourceKey)) { var datasource = context.GetItem <DataSourceModel>(uniformGrid.DataSourceKey); if (datasource != null && datasource.Items.Count > 0) { var createdTable = TableExtensions.CreateTable(document, uniformGrid, context, documentPart, formatProvider); var wordTable = createdTable.Item1; var tableLook = createdTable.Item2; // Before rows : TableExtensions.ManageBeforeAfterRows(document, uniformGrid, uniformGrid.BeforeRows, wordTable, context, documentPart, formatProvider); // Table of cells : List <List <ContextModel> > rowsContentContexts = new List <List <ContextModel> >(); int i = 0; var lastCellsRow = new List <ContextModel>(); // add content rows foreach (var item in datasource.Items) { if (i > 0 && i % uniformGrid.ColsWidth.Length == 0) { // end of line : rowsContentContexts.Add(lastCellsRow); lastCellsRow = new List <ContextModel>(); } lastCellsRow.Add(item); i++; } if (i % uniformGrid.ColsWidth.Length == 0) { rowsContentContexts.Add(lastCellsRow); } if (datasource.Items.Count % uniformGrid.ColsWidth.Length > 0) { var acountAddNullItems = uniformGrid.ColsWidth.Length - (datasource.Items.Count % uniformGrid.ColsWidth.Length); if (acountAddNullItems > 0) { for (int j = 0; j < acountAddNullItems; j++) { lastCellsRow.Add(new ContextModel()); } rowsContentContexts.Add(lastCellsRow); } } // Now we create all row : i = 0; foreach (var rowContentContext in rowsContentContexts) { var row = new Row { CantSplit = uniformGrid.CantSplitRows, }; row.InheritFromParent(uniformGrid); wordTable.AppendChild(row.Render(document, wordTable, context, rowContentContext, uniformGrid.CellModel, documentPart, false, (i % 2 == 1), formatProvider)); i++; } // After rows : TableExtensions.ManageBeforeAfterRows(document, uniformGrid, uniformGrid.AfterRows, wordTable, context, documentPart, formatProvider); TableExtensions.ManageFooterRow(document, uniformGrid, wordTable, tableLook, context, documentPart, formatProvider); parent.AppendChild(wordTable); return(wordTable); } } return(null); }
/// <summary> /// Render a table element /// </summary> /// <param name="table"></param> /// <param name="parent"></param> /// <param name="context"></param> /// <param name="formatProvider"></param> /// <returns></returns> public static Table Render(this Models.Table table, Models.Document document, OpenXmlElement parent, ContextModel context, OpenXmlPart documentPart, IFormatProvider formatProvider) { context.ReplaceItem(table, formatProvider); var createdTable = CreateTable(document, table, context, documentPart, formatProvider); var wordTable = createdTable.Item1; var tableLook = createdTable.Item2; // Before rows : ManageBeforeAfterRows(document, table, table.BeforeRows, wordTable, context, documentPart, formatProvider); // add content rows if (!string.IsNullOrEmpty(table.DataSourceKey)) { if (context.ExistItem <DataSourceModel>(table.DataSourceKey)) { var datasource = context.GetItem <DataSourceModel>(table.DataSourceKey); int i = 0; foreach (var item in datasource.Items) { var row = table.RowModel.Clone(); row.InheritFromParent(table); if (!string.IsNullOrWhiteSpace(table.AutoContextAddItemsPrefix)) { // We add automatic keys : // Is first item item.AddItem("#" + table.AutoContextAddItemsPrefix + "_TableRow_IsFirstItem#", new BooleanModel(i == 0)); item.AddItem("#" + table.AutoContextAddItemsPrefix + "_TableRow_IsNotFirstItem#", new BooleanModel(i > 0)); // Is last item item.AddItem("#" + table.AutoContextAddItemsPrefix + "_TableRow_IsLastItem#", new BooleanModel(i == datasource.Items.Count - 1)); // Index of the element (Based on 0, and based on 1) item.AddItem("#" + table.AutoContextAddItemsPrefix + "_TableRow_IndexBaseZero#", new StringModel(i.ToString())); item.AddItem("#" + table.AutoContextAddItemsPrefix + "_TableRow_IndexBaseOne#", new StringModel((i + 1).ToString())); item.AddItem("#" + table.AutoContextAddItemsPrefix + "_TableRow_IsOdd#", new BooleanModel(i % 2 == 1)); item.AddItem("#" + table.AutoContextAddItemsPrefix + "_TableRow_IsEven#", new BooleanModel(i % 2 == 0)); } wordTable.AppendChild(row.Render(document, wordTable, item, documentPart, false, (i % 2 == 1), formatProvider)); i++; } } } else { int i = 0; foreach (var row in table.Rows) { row.InheritFromParent(table); wordTable.AppendChild(row.Render(document, wordTable, context, documentPart, false, (i % 2 == 1), formatProvider)); i++; } } // After rows : ManageBeforeAfterRows(document, table, table.AfterRows, wordTable, context, documentPart, formatProvider); // Footer ManageFooterRow(document, table, wordTable, tableLook, context, documentPart, formatProvider); parent.AppendChild(wordTable); return(wordTable); }