c# - 使用 open xml 将嵌入图表添加到 word 文档

标签 c# openxml openxml-sdk

word 文档包含嵌入式图表,我想使用打开的 xml 将相同的图表复制并粘贴到其他文档中。我使用了以下代码,但粘贴图表后文件已损坏。你能找到我的错误吗?

这里的 doc 是我的原始文件 WordprocessingDocument 对象。

using (WordprocessingDocument wordprocessingDocument =
           WordprocessingDocument.Create("C:\\Sample.docx", WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;
            if (mainPart == null)
            {
                mainPart = wordprocessingDocument.AddMainDocumentPart();
                new Document(new Body()).Save(mainPart);
            }

            var chart = mainPart.AddNewPart<ChartPart>();
            chart.FeedData(doc.MainDocumentPart.ChartParts.First().GetStream());

            string type = doc.MainDocumentPart.ChartParts.ElementAt(0).EmbeddedPackagePart.ContentType;
            var embdedPkgPart = mainPart.AddEmbeddedPackagePart(type);
            embdedPkgPart.FeedData(doc.MainDocumentPart.ChartParts.ElementAt(0).EmbeddedPackagePart.GetStream());

            string rellId = mainPart.GetIdOfPart(chart);
            string uyo = chart.CreateRelationshipToPart(embdedPkgPart);
            uyo.ToString();

            AddChart(wordprocessingDocument, rellId);
            wordprocessingDocument.MainDocumentPart.Document.Save();               
        }
public static void AddChart(WordprocessingDocument wordDoc, string relId)
    {
        DocumentFormat.OpenXml.Wordprocessing.Drawing element =
            new Drawing(
              new Inline(
                new Extent()
                {
                    Cx = 5486400,
                    Cy = 3200400
                },

                 new DW.EffectExtent()
                 {
                     LeftEdge = 19050L,
                     TopEdge = 0L,
                     RightEdge = 19050L,
                     BottomEdge = 0L
                 },

                new DocProperties()
                {
                    Id = (UInt32Value)5U,
                    Name = "Chart 5"
                },

                new DocumentFormat.OpenXml.Drawing.Wordprocessing.NonVisualGraphicFrameDrawingProperties(
                  new GraphicFrameLocks() { NoChangeAspect = true }),

                new Graphic(
                  new GraphicData(
                      new DocumentFormat.OpenXml.Drawing.Charts.ChartReference() { Id = relId }
                  ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" })
              )
              {
                  DistanceFromTop = (UInt32Value)0U,
                  DistanceFromBottom = (UInt32Value)0U,
                  DistanceFromLeft = (UInt32Value)0U,
                  DistanceFromRight = (UInt32Value)0U
              }

        );

        wordDoc.MainDocumentPart.Document.Body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(element)));
    }

最佳答案

  public static void WriteChartParts(MainDocumentPart sourcePart, MainDocumentPart destnPart)
    {
        var paras = sourcePart.Document.Descendants<DocumentFormat.OpenXml.Wordprocessing.Run>();
        var drawingElements = from run in paras
                              where run.Descendants<Drawing>().Count() != 0
                              select run.Descendants<Drawing>().First();

       sourcePart.ChartParts.ForAll(chartPart =>
       {
           destnPart.AddPart<ChartPart>(chartPart, sourcePart.GetIdOfPart(chartPart));
       });

       drawingElements.ForAll(drw =>
       {
           destnPart.Document.Body.Append((drw as OpenXmlElement).Clone() as OpenXmlElement);
       });
       destnPart.Document.Save();
    }

关于c# - 使用 open xml 将嵌入图表添加到 word 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15017895/

相关文章:

c# - 使用 OpenXML SDK 将包含注释的幻灯片从一个 PowerPoint 演示文稿复制到另一个演示文稿

c# - OpenXML 将段落样式(Heading1、Heading2、Head 3 等)添加到文字处理文档

c# - 2个项目1个解决方案分享课?

c# - 如何将打开的xml字符串转换为word文档c#

c# - 使用 OpenXML 2.5 将数据写入 docx 文档中的 TextInput 元素

c# - DocumentFormat.OpenXml 将图像添加到 word 文档

c# - 打开 XML SDK 2.0 以按名称访问 excel 2010 工作表

c# - 按句点将字符串格式化为 3 位数字组

c# - 使用 XPATH 或 CSS 选择器在 Selenium 中查找元素

c# - 在 ADO.Net C# 中执行并行数据库访问