Возможны ли вложенные таблицы в OpenXML C #? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть требование, когда я буду открывать текстовый документ (шаблон с веб-сайта 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));
    }

Редактировать: чтобы уточнить, документ открывается нормально, форматирование просто скрыто.он помещает все данные в одну ячейку таблицы.

...