How to create dot chart, line chart in excel using c#?

c#, excel

Solution

After days of searching I found the solution, hope it will be useful for someone.

            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;
            Excel._Application xlApp = new Excel.Application();

            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        //add data 
        xlWorkSheet.Cells[1, 1] = 13;
        xlWorkSheet.Cells[1, 2] = 27;
        xlWorkSheet.Cells[1, 3] = 22;
        xlWorkSheet.Cells[1, 4] = 22;

        xlWorkSheet.Cells[2, 1] = 42    ;
        xlWorkSheet.Cells[2, 2] = 35;
        xlWorkSheet.Cells[2, 3] = 22;
        xlWorkSheet.Cells[2, 4] = 22;

        xlWorkSheet.Cells[3, 1] = 1;
        xlWorkSheet.Cells[3, 2] = 10;
        xlWorkSheet.Cells[3, 3] = 4;
        xlWorkSheet.Cells[3, 4] = 4;


        Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
        Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250);
        Excel.Chart chartPage = myChart.Chart;
        myChart.Select();

        chartPage.ChartType = Excel.XlChartType.xlXYScatterLines;
        Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application();
        Excel.SeriesCollection seriesCollection = chartPage.SeriesCollection();

        Excel.Series series1 = seriesCollection.NewSeries();
        series1.XValues = xlWorkSheet.get_Range("A1", "B1"); ;
        series1.Values = xlWorkSheet.get_Range("C1", "D1");

        Excel.Series series2 = seriesCollection.NewSeries();
        series2.XValues = xlWorkSheet.get_Range("A2", "B2"); ;
        series2.Values = xlWorkSheet.get_Range("C2", "D2");

        Excel.Series series3 = seriesCollection.NewSeries();
        series3.XValues = xlWorkSheet.get_Range("A3", "B3"); ;
        series3.Values = xlWorkSheet.get_Range("C3", "D3"); 



        xlWorkBook.SaveAs(@"C:\ProgramData\RadiolocationQ\Text.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);


        Process.Start(@"C:\ProgramData\RadiolocationQ\Text.xls");

Problem

I'm use these namespaces: `Excel = Microsoft.Office.Interop.Excel;` and `Microsoft.Office.Tools.Excel;` I need to create a line chart with many short lines, which all will be parallel to the x axis. I already have written all needed points, which should be connected with line. y axis values for the several type of lines are the same, not they aren't numbers, they are a sort of name. Eventually this should looks this way: I tried to do this in my way, but faced some problems `seriesCollection` doesn`t work as should, he draws 3 lines, but I can see only last one, 2 previous line become same dot. Here is the code: ``` Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; Excel._Application xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); //add data xlWorkSheet.Cells[1, 1] = 13; xlWorkSheet.Cells[1, 2] = 27; xlWorkSheet.Cells[1, 3] = 22; xlWorkSheet.Cells[1, 4] = 22; xlWorkSheet.Cells[2, 1] = 42 ; xlWorkSheet.Cells[2, 2] = 35; xlWorkSheet.Cells[2, 3] = 22; xlWorkSheet.Cells[2, 4] = 22; xlWorkSheet.Cells[3, 1] = 1; xlWorkSheet.Cells[3, 2] = 10; xlWorkSheet.Cells[3, 3] = 4; xlWorkSheet.Cells[3, 4] = 4; Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing); Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250); Excel.Chart chartPage = myChart.Chart; myChart.Select(); chartPage.ChartType = Excel.XlChartType.xlXYScatterLines; Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application(); Excel.SeriesCollection seriesCollection = chartPage.SeriesCollection(); Excel.Series series1 = seriesCollection.NewSeries(); series1.XValues = xlWorkSheet.get_Range("A1", "B1"); ; series1.Values = xlWorkSheet.get_Range("C1", "D1"); Excel.Series series2 = seriesCollection.NewSeries(); series2.XValues = xlWorkSheet.get_Range("A2", "B2"); ; series2.Values = xlWorkSheet.get_Range("C2", "D2"); Excel.Series series3 = seriesCollection.NewSeries(); series3.XValues = xlWorkSheet.get_Range("A3", "B3"); ; series3.Values = xlWorkSheet.get_Range("C3", "D3"); ``` Don't know how to solve this problem. I think y-axis can't be a text, only numbers. Each line should be another series, I guess. P.S. Numbers can be represented in any required ways to simplify the work. UPD: This is how I created this dot chart, I have recorded macros ``` Sub Dot_chart() ' ' ' ' ActiveSheet.Shapes.AddChart2(240, xlXYScatterLines).Select ActiveWindow.SmallScroll Down:=6 ActiveSheet.Shapes("Chart 2").IncrementLeft 120.8823622047 ActiveSheet.Shapes("Chart 2").IncrementTop 132.3529133858 ActiveChart.SeriesCollection.NewSeries ActiveChart.FullSeriesCollection(1).Name = "=List1!$B$23" ActiveChart.FullSeriesCollection(1).XValues = "=List1!$D$22:$D$23" ActiveChart.FullSeriesCollection(1).Values = "=List1!$D$24:$D$25" ActiveChart.SeriesCollection.NewSeries ActiveChart.FullSeriesCollection(2).Name = "=List1!$B$23" ActiveChart.FullSeriesCollection(2).XValues = "=List1!$E$22:$E$23" ActiveChart.FullSeriesCollection(2).Values = "=List1!$E$24:$E$25" ActiveChart.SeriesCollection.NewSeries ActiveChart.FullSeriesCollection(3).Name = "=List1!$B$28" ActiveChart.FullSeriesCollection(3).XValues = "=List1!$D$27:$D$28" ActiveChart.FullSeriesCollection(3).Values = "=List1!$D$29:$D$30" End Sub ``` List1 sheet`s name.

Original source