Как вставить многострочный текст в ячейку таблицы с помощью ассемблера документов powertools
Я оцениваю открытый XML и мощные инструменты для генерации документов. Инструмент отличный и выполняет много задач. Я попробовал образец DocumentAssembler, и он работал. У меня есть пара требований, которые я не знаю, как этого добиться.
- У меня есть элемент управления содержимым таблицы в моем шаблоне, и я хочу заменить один из столбцов многострочным значением (ограниченным \r\n в содержимом данных XML).
Например, рассмотрим таблицу, в которой есть 2 столбца, имя сотрудника и адрес сотрудника. Столбец адреса содержит многострочные данные, разделенные новыми строками. Но новые строки игнорируются, и данные отображаются в виде единого текста. 2. Можно ли отобразить два разных значения внутри столбца таблицы, например, имя элемента, фамилия внутри одной ячейки?
Я приложил изображение шаблона docx. Надеюсь, что это правильный форум для openxml powertools. Пожалуйста, дайте мне знать, если вам нужно больше информации. Благодарю.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using DocumentFormat.OpenXml.Packaging;
using OpenXmlPowerTools;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml;
using System.Xml;
namespace DocuGenerator
{
class Program
{
static void Main(string[] args)
{
var n = DateTime.Now;
var tempDi = new DirectoryInfo(string.Format("ExampleOutput-{0:00}-{1:00}-{2:00}-{3:00}{4:00}{5:00}", n.Year - 2000, n.Month, n.Day, n.Hour, n.Minute, n.Second));
tempDi.Create();
FileInfo templateDoc = new FileInfo("../../TemplateDocument.docx");
FileInfo dataFile = new FileInfo(Path.Combine(tempDi.FullName, "Data.xml"));
// The following method generates a large data file with random data.
// In a real world scenario, this is where you would query your data source and produce XML that will drive your document generation process.
XElement data = GenerateDataFromDataSource(dataFile);
WmlDocument wmlDoc = new WmlDocument(templateDoc.FullName);
int count = 1;
foreach (var customer in data.Elements("Customer"))
{
FileInfo assembledDoc = new FileInfo(Path.Combine(tempDi.FullName, string.Format("Letter-{0:0000}.docx", count++)));
Console.WriteLine(assembledDoc.Name);
bool templateError;
WmlDocument wmlAssembledDoc = DocumentAssembler.AssembleDocument(wmlDoc, customer, out templateError);
if (templateError)
{
Console.WriteLine("Errors in template.");
Console.WriteLine("See {0} to determine the errors in the template.", assembledDoc.Name);
}
wmlAssembledDoc.SaveAs(assembledDoc.FullName);
}
}
private static string[] s_productNames = new[] {
"Unicycle",
"Bicycle",
"Tricycle",
"Skateboard",
"Roller Blades",
"Hang Glider",
};
private static XElement GenerateDataFromDataSource(FileInfo dataFi)
{
int numberOfDocumentsToGenerate = 5;
var customers = new XElement("Customers");
Random r = new Random();
for (int i = 0; i < numberOfDocumentsToGenerate; ++i)
{
var customer = new XElement("Customer",
new XElement("CustomerID", i + 1 +"\r\n"+44),
new XElement("Name", "Sample name"),
new XElement("HighValueCustomer", r.Next(2) == 0 ? "True" : "False"),
new XElement("Orders"));
var orders = customer.Element("Orders");
int numberOfOrders = r.Next(10) + 1;
for (int j = 0; j < numberOfOrders; j++)
{
var order = new XElement("Order",
new XAttribute("Number", j + 1),
new XElement("ProductDescription", "ssss"+j+"\r\n" +s_productNames[r.Next(s_productNames.Length)]),//
new XElement("Quantity", r.Next(10) + "\r\n" + 33),
new XElement("OrderDate", "September 26, 2015"));
orders.Add(order);
}
customers.Add(customer);
}
customers.Save(dataFi.FullName);
return customers;
}
public static void createdoc(string docName)
{
// Create a Wordprocessing document.
using (WordprocessingDocument package = WordprocessingDocument.Create(docName, WordprocessingDocumentType.Document))
{
// Add a new main document part.
package.AddMainDocumentPart();
// Create the Document DOM.
package.MainDocumentPart.Document =
new Document(
new Body(
new Paragraph(
new Run(
new Text("Hello World!")))));
// Save changes to the main document part.
package.MainDocumentPart.Document.Save();
}
}
private static void SaveXDocument(WordprocessingDocument myDoc,
XDocument mainDocumentXDoc)
{
// Serialize the XDocument back into the part
using (Stream str = myDoc.MainDocumentPart.GetStream(
FileMode.Create, FileAccess.Write))
using (System.Xml.XmlWriter xw = XmlWriter.Create(str))
mainDocumentXDoc.Save(xw);
}
private static XDocument GetXDocument(WordprocessingDocument myDoc)
{
// Load the main document part into an XDocument
XDocument mainDocumentXDoc;
using (Stream str = myDoc.MainDocumentPart.GetStream())
using (XmlReader xr = XmlReader.Create(str))
mainDocumentXDoc = XDocument.Load(xr);
return mainDocumentXDoc;
}
}
}