diff --git a/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON.sln b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON.sln new file mode 100644 index 00000000..1caae199 --- /dev/null +++ b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31911.196 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NestedGroup-Conditional-Filtering-MailMerge-with-JSON", "NestedGroup-Conditional-Filtering-MailMerge-with-JSON\NestedGroup-Conditional-Filtering-MailMerge-with-JSON.csproj", "{C17B90BC-F559-456B-B189-90B53FF6CDD4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C17B90BC-F559-456B-B189-90B53FF6CDD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C17B90BC-F559-456B-B189-90B53FF6CDD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C17B90BC-F559-456B-B189-90B53FF6CDD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C17B90BC-F559-456B-B189-90B53FF6CDD4}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EF357FC6-E9E5-4E3C-B932-43F727BE1DE4} + EndGlobalSection +EndGlobal diff --git a/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Data/Data.json b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Data/Data.json new file mode 100644 index 00000000..18233780 --- /dev/null +++ b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Data/Data.json @@ -0,0 +1,25 @@ +{ + "User": [ + { + "name": "Syncfusion", + "ExpectedType": "All", + "SectionDisplay": "true", + "Expense": [ + { + "Type": "Reimbursement", + "InvoiceNumber": "INV-1001", + "IsPaid": "true", + "Description": "Travel reimbursement", + "Amount": 150.00, + }, + { + "Type": "Expense", + "InvoiceNumber": "INV-1002", + "IsPaid": "false", + "Description": "Hotel accommodation", + "Amount": 550.00, + } + ] + } + ] +} \ No newline at end of file diff --git a/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Data/Template.docx b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Data/Template.docx new file mode 100644 index 00000000..1e7ee655 Binary files /dev/null and b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Data/Template.docx differ diff --git a/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/NestedGroup-Conditional-Filtering-MailMerge-with-JSON.csproj b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/NestedGroup-Conditional-Filtering-MailMerge-with-JSON.csproj new file mode 100644 index 00000000..0e02f12e --- /dev/null +++ b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/NestedGroup-Conditional-Filtering-MailMerge-with-JSON.csproj @@ -0,0 +1,26 @@ + + + + Exe + net8.0 + NestedGroup_MailMerge_with_JSON + + + + + + + + + + Always + + + Always + + + Always + + + + diff --git a/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Output/.gitkeep b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Output/.gitkeep new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Output/.gitkeep @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Output/Result.docx b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Output/Result.docx new file mode 100644 index 00000000..ceb07c83 Binary files /dev/null and b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Output/Result.docx differ diff --git a/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Program.cs b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Program.cs new file mode 100644 index 00000000..012b3eaa --- /dev/null +++ b/Mail-Merge/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/.NET/NestedGroup-Conditional-Filtering-MailMerge-with-JSON/Program.cs @@ -0,0 +1,89 @@ +using Newtonsoft.Json.Linq; +using Syncfusion.DocIO; +using Syncfusion.DocIO.DLS; +using System.Collections.Generic; +using System.IO; +namespace NestedGroup_Conditional_Filtering_MailMerge_with_JSON +{ + class Program + { + static void Main(string[] args) + { + Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR LICENSE KEY"); + using (FileStream fileStream = new FileStream(Path.GetFullPath(@"../../../Data/Template.docx"), FileMode.Open, FileAccess.ReadWrite)) + { + //Open the template document. + using (WordDocument document = new WordDocument(fileStream, FormatType.Docx)) + { + //Get the Json data details as DataTable + List jsonData = GetJsonData(); + //Creates the mail merge data table in order to perform mail merge + MailMergeDataTable dataTable = new MailMergeDataTable("User", jsonData); + document.MailMerge.RemoveEmptyParagraphs = true; + // Perform mail merge with the prepared data table. + document.MailMerge.ExecuteNestedGroup(dataTable); + document.UpdateDocumentFields(); + //Create file stream. + using (FileStream outputStream = new FileStream(Path.GetFullPath(@"../../../Output/Result.docx"), FileMode.Create, FileAccess.ReadWrite)) + { + //Save the Word document to file stream. + document.Save(outputStream, FormatType.Docx); + } + } + } + } + + #region Helper methods + /// + /// Prepares the data table from JSON data for processing. + /// + private static List GetJsonData() + { + //Reads the JSON object from JSON file. + JObject jsonObject = JObject.Parse(File.ReadAllText(Path.GetFullPath(@"Data/Data.json"))); + //Converts JSON object to Dictionary. + + + IDictionary data = GetData(jsonObject); + return data["User"] as List; + } + + /// + /// Gets data from JSON object. + /// + /// JSON object. + /// Dictionary of data. + private static IDictionary GetData(JObject jsonObject) + { + Dictionary dictionary = new Dictionary(); + foreach (var item in jsonObject) + { + object keyValue = null; + if (item.Value is JArray) + keyValue = GetData((JArray)item.Value); + else if (item.Value is JToken) + keyValue = ((JToken)item.Value).ToObject(); + dictionary.Add(item.Key, keyValue); + } + return dictionary; + } + /// + /// Gets array of items from JSON array. + /// + /// JSON array. + /// List of objects. + private static List GetData(JArray jArray) + { + List jArrayItems = new List(); + foreach (var item in jArray) + { + object keyValue = null; + if (item is JObject) + keyValue = GetData((JObject)item); + jArrayItems.Add(keyValue); + } + return jArrayItems; + } + #endregion + } +}