c# - 使用 openxml 创建折线图

标签 c# .net charts openxml linechart

我正在尝试在 excel 工作表上创建一个新的折线图,但我不知道如何感受此图表上的数据以及如何为每个系列添加值。 以下是我尝试做的事情:

    static void Main(string[] args)
    {
        string docName = @"myFile.xlsx";
        string worksheetName = "Sheet1";
        string title = "My Chart";
        InsertChartInSpreadsheet(docName, worksheetName, title);
    }


    private static void InsertChartInSpreadsheet(string docName, string worksheetName, string title)
    {

    // Open Document for editing
        using (SpreadsheetDocument document = SpreadsheetDocument.Open(docName, true))
        {
            IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().
    Where(s => s.Name == worksheetName);
            if (sheets.Count() == 0)
            {
                // The specified worksheet does not exist.
                return;
            }

            WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);

            // Add a new drawing to the worksheet.
            DrawingsPart drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();
            worksheetPart.Worksheet.Append(new DocumentFormat.OpenXml.Spreadsheet.Drawing() { Id = worksheetPart.GetIdOfPart(drawingsPart) });
            worksheetPart.Worksheet.Save();

            // Add a new chart and set the chart language to English-US.
            ChartPart chartPart = drawingsPart.AddNewPart<ChartPart>();
            chartPart.ChartSpace = new ChartSpace();
            chartPart.ChartSpace.Append(new EditingLanguage() { Val = new StringValue("en-US") });
            DocumentFormat.OpenXml.Drawing.Charts.Chart chart = chartPart.ChartSpace.AppendChild<DocumentFormat.OpenXml.Drawing.Charts.Chart>(
                new DocumentFormat.OpenXml.Drawing.Charts.Chart());

            // Create a new clustered column chart.
            PlotArea plotArea = chart.AppendChild<PlotArea>(new PlotArea());
            Layout layout = plotArea.AppendChild<Layout>(new Layout());
            uint i = 0;
            LineChart lineChart = plotArea.AppendChild<LineChart>(new LineChart());
            LineChartSeries[] series = new LineChartSeries() {} ;
            uint j ; 
            // add series to the lineChart
            for (LineChartSeries s in series) {
                s = lineChart.AppendChild<LineChartSeries>(new LineChartSeries());
                s.SeriesText = new SeriesText(new NumericValue() { Text = "Ser "+j } );
                series1.Index = new Index() { Val = new UInt32Value(j) };
                series1.Order = new Order() { Val = new UInt32Value(j) } ;
                j++;
            }
            i = 1;

            /***
            Here is my question , how can i add values to my chart
            Example data: 
                    Ser1    Ser2    Ser3    Ser4
            2010    5       6       12      41
            2011    65      1       31      43
            2012    75      8       64      40
            2013    12      31      47      66
            ***/

            // Save the chart part.
            chartPart.ChartSpace.Save();
            /* Here i'll add the position of the chart on the worksheet */ 
            // Save the WorksheetDrawing object.
            drawingsPart.WorksheetDrawing.Save();
        }
    }

在上面的代码中,我举例说明了我想在图表上感受到的数据:

                    Ser1    Ser2    Ser3    Ser4
            2010    5       6       12      41
            2011    65      1       31      43
            2012    75      8       64      40
            2013    12      31      47      66

我是 C# 和 OpenXml 的初学者,请帮助我:-) 谢谢。

最佳答案

经过几个小时的搜索,我终于找到了解决这个问题的方法,方法是使用 spreadsheetlight图书馆,这个图书馆和我想要的不一样,但最后我得到了我希望的结果。 SpreadSheetLight,帮助我轻松地从 DataTable 创建图表,然后我使用以下函数将图表从 excel 文件复制到新的 powerpoint 文件:

    public CopyChartFromXlsx2Pptx(string SourceFile, string TargetFile, string targetppt)
    {

        ChartPart chartPart;

        ChartPart newChartPart;

        //SlidePart slidepartbkMark = null;

        string chartPartIdBookMark = null;

        File.Copy(TargetFile, targetppt, true);

        //Powerpoint document

        using (OpenXmlPkg.PresentationDocument pptPackage = OpenXmlPkg.PresentationDocument.Open(targetppt, true))
        {

            OpenXmlPkg.PresentationPart presentationPart = pptPackage.PresentationPart;

            var secondSlidePart = pptPackage.PresentationPart.SlideParts.Skip(0).First();  // this will retrieve your second slide

            chartPart = secondSlidePart.ChartParts.First();

            chartPartIdBookMark = secondSlidePart.GetIdOfPart(chartPart);

            //Console.WriteLine("ID:"+chartPartIdBookMark.ToString());

            secondSlidePart.DeletePart(chartPart);

            secondSlidePart.Slide.Save();

            newChartPart = secondSlidePart.AddNewPart<ChartPart>(chartPartIdBookMark);

            ChartPart saveXlsChart = null;

            using (SpreadsheetDocument xlsDocument = SpreadsheetDocument.Open(SourceFile.ToString(), true))
            {

                WorkbookPart xlsbookpart = xlsDocument.WorkbookPart;

                foreach (var worksheetPart in xlsDocument.WorkbookPart.WorksheetParts)
                {

                    if (worksheetPart.DrawingsPart != null)

                        if (worksheetPart.DrawingsPart.ChartParts.Any())
                        {
                            saveXlsChart = worksheetPart.DrawingsPart.ChartParts.First();
                        }

                }

                newChartPart.FeedData(saveXlsChart.GetStream());
                //newChartPart.FeedData(
                secondSlidePart.Slide.Save();

                xlsDocument.Close();

                pptPackage.Close();

            }

        }
    }

在我可以删除生成的 excel 文件之后:-)

希望这个解决方案能帮到你!

关于c# - 使用 openxml 创建折线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14623070/

相关文章:

ios - 快速设置图像中心饼图

c# - 在 C# 中为对象指定动态属性

c# - 如何将数据序列化为缩进的json

c# - HttpResponse、HttpRequest、网络客户端

c# - 使用 Microsoft Graph 从日历中删除日期范围内的许多事件和某个扩展属性值

C# LINQ - 找不到 IListSource [Xamarin Forms]

c# - 这是在滥用 IEnumerator 结构吗?

c# - 适用于 Windows 7 的 Microsoft Windows SDK 是否包含用于 MS 单元测试的库?

javascript - 激活阈值时 JQuery Flot 出现问题

javascript - Chart.js - 柱形值显示在柱形中间