【问题标题】:C# OpenXML- Copying charts from Word document to another Word docuC# OpenXML- 将图表从 Word 文档复制到另一个 Word 文档
【发布时间】:2020-02-26 13:12:30
【问题描述】:

我试图将图表从一个 word 文档复制到另一个,并使用 OpenXml 将它们放置在书签位置。但是我不确定如何将复制的图表附加或插入到书签中。我相信在将图表对象添加到段落之前,我必须将其添加到绘图或其他对象中,但我无法让它工作。下面的代码是我用来测试的基础:

  using (WordprocessingDocument doc = WordprocessingDocument.Open(SourceDoc, false))
        {
            List<ChartPart> chartFind = doc.MainDocumentPart.ChartParts.ToList();
            using (WordprocessingDocument copydoc = WordprocessingDocument.Open(stream, true))
            {

                MainDocumentPart mainPart = copydoc.MainDocumentPart;
                Body body = mainPart.Document.GetFirstChild<Body>();
                var bmStart = body.Descendants<BookmarkStart>();
                var bmEnd = body.Descendants<BookmarkEnd>();
                //phone calls Chart
                ChartPart PhoneChart = chartFind[0];
                ChartPart chartPart = mainPart.AddNewPart<ChartPart>();
                chartPart.ChartSpace = (ChartSpace)PhoneChart.ChartSpace.Clone();

                foreach (BookmarkStart bookMarkStart in bmStart)
                {

                    if (bookMarkStart.Name == "test")
                    {

                        var id = bookMarkStart.Id.Value;
                        var bookmarkEnd = bmEnd.Where(b => b.Id.Value == id).First();
                        Paragraph chartPara = new Paragraph();
                        bookmarkEnd.Parent.InsertAfterSelf(chartPara);
                        chartPara.InsertAfterSelf(chartPart.ChartSpace);


                    }

                }

            }
        }

【问题讨论】:

  • 图表是 docx zip 包中的附加 xml 部分。不可能简单地“复制/粘贴”:需要关系。我建议您从 1) 打开您正在使用的示例文档,然后按照您希望代码执行的操作将该图表复制/粘贴到书签中。 2)将此保存为新文件名并关闭...
  • ...3) 在 Open XML SDK Productivity Tool 中打开原始文档。花点时间查看底层的 xml 文件,尤其是文档的 BODY,即图表所在的位置。现在使用“比较”功能引入第二个文件。查看生成的代码以将第一个转换为第二个。这将使您了解如何在新图表中插入和链接。

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


【解决方案1】:

Open XML SDK Productivity Tool 对故障排除有很大帮助。我可以通过以下方式添加图表:

  1. 创建 ChartPart 对象
  2. 克隆原始图表 ChartSpace 并将其添加到我的 ChartPart 中
  3. 按顺序创建具有与我的 ChartPart 相同 ID 的 ChartReference 的绘图对象 链接它们
  4. 在插入书签之前将绘图对象附加到新的运行和段落

我确实遇到了一个浪费了一些时间的问题,这是由于图表中的数据链接到了一个我无法通过我的应用程序访问的 Excel 文档造成的。为了显示图表,我必须通过以下方式打破外部数据关系: chartPart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/ relationships/oleObject", new System.Uri("NULL", System.UriKind.Relative), "rId2");

下面的代码供以后参考

        using (WordprocessingDocument doc = WordprocessingDocument.Open(SourceDoc, false))
        {


            //List<ChartPart> chartFind = doc.MainDocumentPart.ChartParts.ToList();
            //List<Drawing> drawingList = doc.MainDocumentPart.Document.Descendants<Drawing>().ToList();

            MainDocumentPart mainPartDoc = doc.MainDocumentPart;

            var mainDoc = mainPartDoc.Document;



            using (WordprocessingDocument copydoc = WordprocessingDocument.Open(stream, true))
            {


                MainDocumentPart mainPart = copydoc.MainDocumentPart;
                var document = mainPart.Document;
                var bmStart = document.Descendants<BookmarkStart>();
                var bmEnd = document.Descendants<BookmarkEnd>();

                foreach (BookmarkStart bookMarkStart in bmStart)

                {


                    if (bookMarkStart.Name == "test")
                    {
                        //find charts and names from original document
                        List<ChartPart> findCharts = mainPartDoc.ChartParts.ToList();
                        var partCheck = (from f in findCharts
                                         select f.ChartSpace.GetFirstChild<Chart>().Title.InnerText).ToList();



                        ChartPart chartPart = mainPart.AddNewPart<ChartPart>();

                        ChartPart chartSelect = findCharts[3];
                        //ChartPart chartSelect = mainPartDoc.ChartParts.FirstOrDefault();


                        chartPart.ChartSpace = (ChartSpace)chartSelect.ChartSpace.Clone();


                        string relId = mainPart.GetIdOfPart(chartPart);


                        AutoUpdate autoUpdate1 = new AutoUpdate() { Val = false };

                        chartPart.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject", 
                            new System.Uri("NULL", System.UriKind.Relative), "rId2");

                        Paragraph paragraph = new Paragraph();


                        Drawing drawing = new Drawing();
                        Run run = new Run();

                        Inline inline = new Inline() { DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U, AnchorId = "716A168E", EditId = "2D11B07F" };

                        Extent extent = new Extent() { Cx = 6572250L, Cy = 2586038L };

                        EffectExtent effectExtent1 = new EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 5080L };

                        DocProperties docProperties1 = new DocProperties() { Id = (UInt32Value)13U, Name = "Chart 13" };

                        NonVisualGraphicFrameDrawingProperties nonVisualGraphicFrameDrawingProperties1 = new NonVisualGraphicFrameDrawingProperties();

                        dr.Graphic graphic = new dr.Graphic();
                        graphic.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main");

                        dr.GraphicData graphicData = new dr.GraphicData() { Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" };

                        ChartReference chartReference1 = new ChartReference() { Id = relId };
                        chartReference1.AddNamespaceDeclaration("c", "http://schemas.openxmlformats.org/drawingml/2006/chart");
                        chartReference1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");

                        graphicData.Append(chartReference1);
                        graphic.Append(graphicData);
                        inline.Append(extent);
                        inline.Append(effectExtent1);
                        inline.Append(docProperties1);
                        inline.Append(nonVisualGraphicFrameDrawingProperties1);
                        inline.Append(graphic);
                        drawing.Append(inline);
                        run.Append(drawing);
                        paragraph.Append(run);

                        var id = bookMarkStart.Id.Value;
                        var bookmarkEnd = bmEnd.Where(i => i.Id.Value == id).First();

                        bookmarkEnd.Parent.InsertAfterSelf(paragraph);

                        // mainPart.Document.Body.Append(paragraph);
                    }


                }


            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多