/// <summary> </summary> /// <param name="additionalFields"> /// - , - /// ( ) /// </param> /// <returns> </returns> public static MemoryStream CreateNewTemplate(Dictionary<string, string> additionalFields) { var doc = new Document(); var docBuilder = new DocumentBuilder(doc); docBuilder.MoveToDocumentEnd();// , foreach (var field in additionalFields) { docBuilder.Font.Bold = true; docBuilder.InsertHtml(string.Format("{0}: ", field.Value)); docBuilder.Font.Bold = false; // , - , - , , Word docBuilder.InsertField(string.Format(@"MERGEFIELD {0} \* MERGEFORMAT", field.Key), field.Key); docBuilder.InsertHtml("<br>"); } var stream = new MemoryStream(); doc.Save(stream, SaveFormat.Doc); // stream.Position = 0; return stream; } /// <summary> </summary> /// <param name="stream"> </param> /// <param name="tableSysName"> ( )</param> /// <param name="additionalFields"> ( - , - ) </param> /// <param name="tableRusName"> </param> /// <returns> </returns> public static MemoryStream AddTable(Stream stream, string tableSysName, Dictionary<string, string> additionalFields, string tableRusName) { var doc = new Document(stream); var docBuilder = new DocumentBuilder(doc); docBuilder.MoveToDocumentEnd(); docBuilder.Font.Bold = true; docBuilder.Font.Size = 14; docBuilder.Writeln(tableRusName); docBuilder.Font.Size = 12; docBuilder.StartTable(); docBuilder.InsertCell(); foreach (var field in additionalFields) { docBuilder.Writeln(field.Value); if (field.Key != additionalFields.Last().Key) { docBuilder.InsertCell(); } } docBuilder.EndRow(); docBuilder.Font.Bold = false; docBuilder.InsertCell(); docBuilder.InsertField(string.Format("MERGEFIELD TableStart:{0}", tableSysName), "{"); foreach (var field in additionalFields) { docBuilder.InsertField(string.Format(@"MERGEFIELD {0} \* MERGEFORMAT", field.Key), field.Key); if (field.Key != additionalFields.Last().Key) { docBuilder.InsertCell(); } } docBuilder.InsertField(string.Format("MERGEFIELD TableEnd:{0}", tableSysName), "}"); docBuilder.Writeln(); docBuilder.EndTable(); docBuilder.Writeln(); stream.Close(); var newStream = new MemoryStream(); doc.Save(newStream, SaveFormat.Doc); newStream.Position = 0; return newStream; }
docBuilder.InsertField(string.Format("MERGEFIELD TableStart:{0}", tableSysName), "{");
/// <summary> </summary> /// <param name="stream"> () </param> /// <param name="fieldsToFill"> ( - , - ) </param> /// <returns> </returns> public static MemoryStream FillTemplate(Stream stream, Dictionary<string, string> fieldsToFill) { var doc = new Document(stream); var firstArray = fieldsToFill.Select(keys => keys.Key).ToArray(); var secondArray = fieldsToFill.Select(a => (object)a.Value).ToArray(); /* object. , . , , IFieldMergingCallback, . */ doc.MailMerge.Execute(firstArray, secondArray); var newStream = new MemoryStream(); doc.Save(newStream, SaveFormat.Doc); newStream.Position = 0; stream.Close(); return newStream; }
/// <summary> /// /// </summary> /// <param name="stream"> </param> /// <param name="tableSysName"> </param> /// <param name="tableValues"> </param> /// <returns> </returns> public static MemoryStream FillTable(Stream stream, string tableSysName, List<Dictionary<string, string>> tableValues) { var doc = new Document(stream); // , var customersDataSource = new CustomerMailMergeDataSource(tableValues.ToArray(), tableSysName); // , IMailMergeDataSource, doc.MailMerge.ExecuteWithRegions(customersDataSource); var newStream = new MemoryStream(); doc.Save(newStream, SaveFormat.Doc); newStream.Position = 0; stream.Close(); return newStream; }
/// <summary> </summary> internal class CustomerMailMergeDataSource : IMailMergeDataSource { /// <summary> </summary> private readonly Dictionary<string, string>[] tableValue; /// <summary> </summary> private int recordIndex; /// <summary> </summary> /// <param name="data"> </param> /// <param name="tableName"> </param> public CustomerMailMergeDataSource(Dictionary<string, string>[] data, string tableName) { tableValue = data; recordIndex = -1; TableNamePrivate = tableName; } /// <summary> </summary> public string TableName { get { return TableNamePrivate; } } /// <summary> </summary> private static string TableNamePrivate { get; set; } /// <summary> </summary> private bool IsEof { get { return recordIndex >= tableValue.Count(); } } /// <summary> Aspose.Words , </summary> /// <param name="fieldName"> </param> /// <param name="fieldValue"> </param> /// <returns> </returns> public bool GetValue(string fieldName, out object fieldValue) { var containsKey = tableValue[recordIndex].ContainsKey(fieldName); fieldValue = containsKey ? tableValue[recordIndex][fieldName] : null; return containsKey; } /// <summary> </summary> /// <returns> , false </returns> public bool MoveNext() { if (!IsEof) { recordIndex++; } return !IsEof; } /// <summary> </summary> /// <param name="tableName"> </param> /// <returns> </returns> public IMailMergeDataSource GetChildDataSource(string tableName) { return null; } }
Source: https://habr.com/ru/post/135170/
All Articles