C#OpenXML在Word文档中嵌入电子表格图表

时间:2018-10-16 01:06:25

标签: c# excel ms-word openxml

我已经使用C#OpenXML生成了包含数据的电子表格和基于该数据的图表。

enter image description here

我现在想现在将此图表嵌入到Word文档中,以便在发送这些报告时,可以根据需要编辑这些图表(不是外部链接)。

我已经逛了好几个小时,找不到能达成此目的的文章的任何一致文档。大多数潜在客户似乎都在谈论“ EmbeddedPackageParts”。

如果任何人有任何有用的文章或可以提供一些清晰度,将不胜感激。

干杯, 邓肯。

2 个答案:

答案 0 :(得分:2)

我最终弄明白了!

步骤: 1.生成包含我的数据的xlsx文件。 2.在本地保存xlsx文件 3.在我的Word文档中,创建一个新的图表部件并生成图形内容

ChartPart wordChartPart = document.MainDocumentPart.AddNewPart<ChartPart>();
string wordChartId = document.MainDocumentPart.GetIdOfPart(wordChartPart);

WordDocumentBuilder.Workflows.SpreadsheetUtils.GenerateBarChartPart(wordChartPart, categories, dataRows);
  1. 将电子表格嵌入ChartPart中

    EmbeddedPackagePart EmbeddedObjectPart = wordChartPart.AddEmbeddedPackagePart(@“ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”);

    使用(FileStream流=新的FileStream(file,FileMode.Open)) {     byte [] documentBytes =新的byte [stream.Length];

    stream.Read(documentBytes, 0, documentBytes.Length);
    
    using (BinaryWriter writer = new BinaryWriter(embeddedObjectPart.GetStream()))
    {
        writer.Write(documentBytes);
        writer.Flush();
    }
    

    }

  2. 然后,我可以在引用图表部分的Word文档中插入内嵌图形。

答案 1 :(得分:0)

您可以同时打开新的Word文档和当前包含图表的Excel工作表。 您可以在Word文档中添加一些富文本内容控件,然后在这些位置插入excel工作表的Chartparts。 确保您的图表具有标题。您可以从标题中阅读图表 要将它们附加到word文档,您需要创建一个段落对象并将其附加到Run对象,并且还需要定义一个Inline以便附加图表。 我希望您可以通过看下面的例子来使我的观点清楚。

private string WordReportGeneration(string docPath, string excelPath)
    {

        string[] chartTitles = new string[] {"","","","","","",.... };//Chart titles
        string[] bookMark = new string[] { "C1", "C2", "C3",..... };//rich text controls of the word doc

        for (int i = 0; i < chartTitles.Length; i++) //going through the chart title array
        {
            using (WordprocessingDocument myWordDoc = WordprocessingDocument.Open(docPath, true))
            {

                MainDocumentPart mainPart = myWordDoc.MainDocumentPart;

                SdtBlock sdt = null;
                mainPart.Document.Descendants<SdtBlock>().ToList().ForEach(b => {
                    var child = b.SdtProperties.GetFirstChild<Tag>();
                    if (child != null && child.Val.Equals(bookMark[i]))
                        sdt = b;
                });

                Paragraph p = sdt.SdtContentBlock.GetFirstChild<Paragraph>();
                p.RemoveAllChildren();

                Run r = new Run();
                p.Append(r);
                Drawing drawing = new Drawing();
                r.Append(drawing);


                Inline inline = new Inline(
                    new Extent()

                    { Cx = 5486400, Cy = 3200400 });

                using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(excelPath, true))
                {
                    WorkbookPart workbookPart = mySpreadsheet.WorkbookPart;
                    Sheet theSheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == "Report");

                    WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(theSheet.Id);

                    DrawingsPart drawingPart = worksheetPart.DrawingsPart;

                    ChartPart chartPart = (ChartPart)drawingPart.ChartParts.FirstOrDefault(x =>
                    x.ChartSpace.ChildElements[4].FirstChild.InnerText.Trim() == chartTitles[i]);

                    ChartPart importedChartPart = mainPart.AddPart<ChartPart>(chartPart);

                    string relId = mainPart.GetIdOfPart(importedChartPart);

                    DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame frame = drawingPart.WorksheetDrawing.Descendants<DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame>().First();

                    Graphic clonedGraphic = (Graphic)frame.Graphic.CloneNode(true);

                    ChartReference c = clonedGraphic.GraphicData.GetFirstChild<ChartReference>();

                    c.Id = relId;

                    DocProperties docPr = new DocProperties();

                    docPr.Name = "XXX";

                    docPr.Id = GetMaxDocPrId(mainPart) + 1;

                    inline.Append(docPr, clonedGraphic);
                    drawing.Append(inline);


                }
                myWordDoc.Save();
                myWordDoc.Close();
            }

        }

        return docPath;
    }

在此处输入代码

enter code here