У меня есть требование, когда я буду открывать текстовый документ (шаблон с веб-сайта Avery), шаблон использует таблицы слов.
Наиболее управляемым способом обработки данных будет добавление вложенных таблиц.(Какое слово позволяет).Я знаю, что стандарт OpenXML также допускает это, но когда я использую OpenXML.DocumentFormat, кажется, что все мои данные добавляются в одну ячейку.Когда я использую прямой текст без вложенных таблиц, он работает нормально, и я могу обойти все ячейки в шаблоне, но когда я добавляю вложенную таблицу, он помещает все мои данные в первую ячейку (шаблона).
Я понимаю, что, вероятно, смогу осуществить это с помощью взаимодействия, но слово будет установлено на поле, в котором размещается служба, а не вариант, также я бы предпочел держаться подальше от закладок или любого типа изменения базового документа.
public void GenerateLabels(Stream stream, List<ItemValue> items, int offset)
{
using (MemoryStream docStream = new MemoryStream())
{
docStream.Write(LabelTemplates.Avery22806PrinttotheEdgeSquareLabels, 0, LabelTemplates.Avery22806PrinttotheEdgeSquareLabels.Length);
long cellCount = 0;
int parcount = 0;
using (WordprocessingDocument document = WordprocessingDocument.Open(docStream, true))
{
Body body = document.MainDocumentPart.Document.Body;
foreach (Table table in body.Descendants<Table>())
{
long rowCount = 0;
foreach (TableRow row in table.Descendants<TableRow>())
{
if (rowCount % 2 == 0)
{
int processCount = 0;
foreach (TableCell cell in row.Descendants<TableCell>())
{
if (items.Count() <= parcount)
{
break;
}
if (processCount % 2 == 0 && cellCount >= offset)
{
cell.Append(CreateBarcodeLabel(items[parcount], document));
cellCount++;
parcount++;
}
processCount++;
}
}
rowCount++;
}
}
stream.Write(docStream.ToArray(), 0, docStream.ToArray().Length);
document.SaveAs("C:\\labels\\labels1.docx");
}
}
}
private Paragraph CreateBarcodeLabel(ItemValue par, WordprocessingDocument document)
{
Table table = new Table();
List<TableRow> rows = new List<TableRow>();
rows.Add(new TableRow());
TableGrid headerRow = new TableGrid(new GridColumn(), new GridColumn());
TableCell imageCell = new TableCell();
imageCell.AppendChild(new Paragraph(new Run(new Text("Image Goes here!"))));
rows[0].Append(new TableCell(new Paragraph(new Run(new Text(par.Catalog.CatalogExternRef)))),imageCell);
rows.Add(new TableRow());
TableCell locatorCell = rows[1].AppendChild(new TableCell());
locatorCell.Append(new Paragraph(new Run(new Text(par.LocatorString))));
foreach (TableRow row in rows)
{
table.AppendChild(row);
}
return new Paragraph(new Run(table));
}
Редактировать: чтобы уточнить, документ открывается нормально, форматирование просто скрыто.он помещает все данные в одну ячейку таблицы.