繁体   English   中英

具有多个系列的C#图表,每个系列具有不同的x轴

[英]C# chart with multiple series, each with different x axis

我正在尝试将数据导出到excel文件(工作得很好)并创建图表。

我所拥有的:3列-ID,值,日期。 有多个具有相同ID,但值和日期时间不同的行。

例:
ID-值-日期时间
1-14-21.11.2017 2:17:08
1-15-22.11.2017 14:25:45
3-12.5-21.11.2017 15:12:12
3-18.7-21.11.2017 19:27:35
3-13-22.11.2017 0:47:17

我想要的是一个图表,其中Value是Y轴,每个ID是一个序列,Datetime是X轴。 但是,每个ID的日期时间不同。

这就是它的外观,但X轴上使用日期而不是数字。 图表图像

我一直在寻找解决方案,并从类似的问题中尝试解决方案,但是还没有一个“切合实际”。 这是我到目前为止的内容:

Excel.ChartObjects ChartObjects = (Excel.ChartObjects)WS.ChartObjects();
Excel.ChartObject chartObject = ChartObjects.Add(400, 40, 450, 300);
chartObject.Chart.ChartType = Excel.XlChartType.xlXYScatterLines;
Excel.SeriesCollection oSeriesCollection = (Excel.SeriesCollection)chartObject.Chart.SeriesCollection();

Excel.Axis xAxis = (Excel.Axis)chartObject.Chart.Axes(Excel.XlAxisType.xlCategory, Excel.XlAxisGroup.xlPrimary);
xAxis.HasTitle = true;
xAxis.AxisTitle.Text = "Date";   

Excel.Axis yAxis = (Excel.Axis)chartObject.Chart.Axes(Excel.XlAxisType.xlValue, Excel.XlAxisGroup.xlPrimary);
yAxis.HasTitle = true;
yAxis.AxisTitle.Text = "Value";

int startPos = 4;
int endPos = 0;
int previousCount = 0;
for (int i = 0; i < Count; i++)
{
    startPos = startPos + previousCount;
    endPos = startPos + CountList[i].Count - 1;

    Excel.Series oSeries = oSeriesCollection.NewSeries();
    oSeries.Values = WS.Range["E" + startPos, "E" + endPos];
    //oSeries.XValues = WS.Range["F" + startPos, "F" + endPos];   //doesn't really do anything
    oSeries.Name = "id " + CountList[i].Number.ToString();
    previousCount = CountList[i].Count;
}

如果有任何区别,则日期是数据库中的日期时间,但在将其存储在列表中时会转换为字符串。

如何按需要设置x轴? 可能吗?

我使用EPPlus做过非常相似的事情。 它在asp.net MVC 5中,因此可能需要更改保存文档以满足您的需要。 在我的情况下,阅读年龄是您要在Y轴上显示的值,并且它们在X轴上有日期。 希望这至少会给您一些基础。 请注意其中的注释,否则该图表将无法正常工作。

        var results = GetResultsSomehow();

        ExcelPackage excel = new ExcelPackage();
        var workSheet = excel.Workbook.Worksheets.Add("Reading Ages");

        workSheet.TabColor = System.Drawing.Color.Black;

        var scatterChart = (ExcelScatterChart)workSheet.Drawings.AddChart("Reading Ages", eChartType.XYScatterSmooth);
        scatterChart.SetPosition(3, 1, 4, 1);
        scatterChart.SetSize(800, 500);
        scatterChart.XAxis.Format = "dd/mm/yyyy";
        // must display hidden data and empty as gaps, otherwise the date axis will explode 
        scatterChart.ShowHiddenData = true;
        scatterChart.DisplayBlanksAs = eDisplayBlanksAs.Gap;

        int rowIndex = 4;
        int stopIndex = 4;
        foreach (var student in results.Select(a=> a.Student).Distinct())
        {
            int start = rowIndex;
            int stop = start + stopIndex;

            workSheet.Cells[rowIndex, 1].Value = student.Surname;
            foreach(var row in results.Where(a=> a.Student == student))
            {
                workSheet.Cells[rowIndex, 2].Value = row.Age;
                workSheet.Cells[rowIndex, 3].Value = row.Date;

                rowIndex++;
                stopIndex++;
            }

            stop = rowIndex;
            var series = scatterChart.Series.Add(workSheet.Cells[start, 2, stop - 1, 2], workSheet.Cells[start, 3, stop - 1, 3]);
            series.Header = student.Surname;           
        }

        string excelName = identifier + " reading ages";
        using (var memoryStream = new MemoryStream())
        {
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment; filename=" + excelName + ".xlsx");
            excel.SaveAs(memoryStream);
            memoryStream.WriteTo(Response.OutputStream);
            Response.Flush();
            Response.End();
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM