OpenXML C#中的嵌套表是否可能?

时间:2018-10-17 20:56:04

标签: c# ms-word openxml openxml-sdk

我有一个要打开Word文档(Avery网站的模板)的要求,该模板使用的是单词表。

处理数据的最易管理的方法是添加嵌套表(允许使用此词)。我知道OpenXML标准也允许它,但是当我使用OpenXML.DocumentFormat时,它似乎会将我的所有数据添加到单个单元格中。当我使用不带子表的纯文本时,它可以正常工作,并且可以遍历模板中的所有单元格,但是当我添加嵌套表时,它将所有数据放在模板的第一个单元格中。

我意识到我可以通过互操作来实现这一点,但是在托管该服务的盒子上安装了Word并不是一种选择,我宁愿远离书签或对基础文档进行任何类型的修改。

        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));
    }

编辑: 为了明确起见,文档可以很好地打开,格式仅适用于软管。它会将所有数据推送到一个表单元格中。

0 个答案:

没有答案