无法在c#中创建excel xy散点图,特别是指定X轴值

时间:2016-11-13 22:25:36

标签: c# excel scatter-plot

我99%完成创建文件以执行外部程序,然后获取数据并运行计算并将其放入Excel电子表格。

最后一部分是从程序中创建XY散点图。我在评论行开始图表//添加图表,但是在它之前包含了作为参考的东西

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using Microsoft.Office.Interop;
using Excel = Microsoft.Office.Interop.Excel;

private void excel_Click(object sender, EventArgs e) //Generate Excel File when user clicks button
    {
        string fileTest = "C:\\Cinder\\" + titleTextBox.Text +"\\table.xlsx";
        if (File.Exists(fileTest))
        {
            File.Delete(fileTest);
        }

        Excel.Application App;
        Excel.Worksheet Sheet;
        Excel.Workbook Book;

        App = new Excel.Application();
        Book = App.Workbooks.Add();
        Sheet = (Excel.Worksheet)Book.Worksheets.get_Item(1);
        Sheet.Cells[1,1] = "This table represents the data from " + titleTextBox.Text + "and shows the mrem/hr for times after an operation"; // row 1, column 1

        if (datatable.Checked)
        {
            Sheet.Cells[2, 1] = "Minutes after run"; //row 2, column 1
            Sheet.Cells[3, 1] = "20";
            Sheet.Cells[4, 1] = "30";
            Sheet.Cells[5, 1] = "40";
            Sheet.Cells[6, 1] = "50";
            Sheet.Cells[7, 1] = "60";
            Sheet.Cells[8, 1] = "120";
            Sheet.Cells[9, 1] = "180";
            Sheet.Cells[10, 1] = "240";
            Sheet.Cells[11, 1] = "360";
        }
        if (datatablelong.Checked)
        {
            Sheet.Cells[2, 1] = "Days after run"; //row 2, column 1
            Sheet.Cells[3, 1] = "1";
            Sheet.Cells[4, 1] = "2";
            Sheet.Cells[5, 1] = "3";
            Sheet.Cells[6, 1] = "4";
            Sheet.Cells[7, 1] = "5";
            Sheet.Cells[8, 1] = "6";
            Sheet.Cells[9, 1] = "7";
            Sheet.Cells[10, 1] = "8";
            Sheet.Cells[11, 1] = "9";
        }

        string[] lines = System.IO.File.ReadAllLines("c:\\cinder\\" + titleTextBox.Text + "\\tables_by_grp");

        for (int i = 2; i < 11; i++)
        { 
            foreach (string line in lines)
            {
                if (line.StartsWith("  TOTAL GAMMAS/(CC-S)"))
                {
                    string[] substrings = line.Split(new char[] { '|' });
                    textBox1.Text = substrings[i];
                    Sheet.Cells[i+13, 1] = textBox1.Text;

                }

                if (line.StartsWith("   GROUP MID POINTS:"))
                {
                    string[] substrings = line.Split(new char[] { '|' });
                    textBox2.Text = substrings[i];
                    Sheet.Cells[i + 13, 3] = textBox2.Text;
                    break;
                }
            }

            double mRem;
            double gammas = double.Parse(textBox1.Text);
            double gammaE = double.Parse(textBox2.Text);
            double E = Math.Log(System.Convert.ToDouble(gammaE));

            if (gammaE <= 0.03)
            {
                mRem = 1000.0 * gammas / (4.0 * Math.PI * 30.0 * 30.0) * Math.Exp(-20.477 + -1.7454 * E);
                Sheet.Cells[i + 1, 2] = mRem;
            }

            if (gammaE  <= 0.5 & gammaE  > 0.03)
            {
                mRem = 1000.0 * gammas / (4.0 * Math.PI * 30.0 * 30.0) * Math.Exp(-13.626 + -0.57117 * E + -1.0954 * E * E + -.024897 * E * E * E);
                Sheet.Cells[i + 1, 2] = mRem;
            }

            if (gammaE < 5.0 & gammaE > 0.5)
            {
                mRem = 1000.0 * gammas / (4.0 * Math.PI * 30.0 * 30.0) * Math.Exp(-13.133 + 0.72008 * E + -0.033603 * E * E);
                Sheet.Cells[i + 1, 2] = mRem;
            }

            if (gammaE <= 15.0 & gammaE > 5.0)
            {
                mRem = 1000.0 * gammas / (4.0 * Math.PI * 30.0 * 30.0) * Math.Exp(-12.791 + 0.28309 * E + 0.10873 * E * E);
                Sheet.Cells[i + 1, 2] = mRem;
            }

        }


       // Sheet.Cells[  1   ,2] = ; not used so tile will show
        Sheet.Cells[    13  ,1] = "Total Gammas";
        Sheet.Cells[    13  ,3] = "Average Energy";
        Sheet.Cells[    2   ,2] = "mRem/hr @ 1 ft";


        Excel.Range chartRange;

    /*
        Excel.ChartObjects xlCharts = (Excel.ChartObjects)Sheet.ChartObjects(Type.Missing);
        Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(180, 30, 300, 250); //location chart pops up
        Excel.Chart chartPage = myChart.Chart;
      */

        // Add chart.
        var charts = Sheet.ChartObjects() as
    Microsoft.Office.Interop.Excel.ChartObjects;
        var chartObject = charts.Add(180, 30, 300, 300) as
            Microsoft.Office.Interop.Excel.ChartObject;
        var chart = chartObject.Chart;



        // Set chart range.
        chartRange = Sheet.get_Range("A2","B11");
        chart.SetSourceData(chartRange);


        // Set chart properties.
        chart.ChartType = Excel.XlChartType.xlXYScatterLines;
        chart.ChartWizard(Source: "A2:B11",
        Title: "graphTitle",
        CategoryTitle: "xAxis",
        ValueTitle: "yAxis");



        Book.SaveAs(fileTest);
        Book.Close();
        App.Quit();


        System.Diagnostics.Process.Start(@"C:\\Cinder\\" + titleTextBox.Text + "\\table.xlsx");

以下是我试图绘制的数据示例:

Minutes after run   mRem/hr @ 1 ft
20  61.69948
30  53.60822
40  51.91109
50  51.18693
60  50.77799
120 49.51441
180 48.61834
240 47.83341
360 46.38796

它正在绘制X轴上的值作为Y轴上的值,而不是根据我给出的数据制作X轴。

如何获得散点图以正确生成X轴值?当我在excel中选择数据范围并制作散点图时,它看起来很完美。

谢谢!

1 个答案:

答案 0 :(得分:0)

    //Add in excel Chart for results
        Excel.Range oRng = Sheet.get_Range("B2", "B11"); 
        Excel.Chart ct = Sheet.Shapes.AddChart().Chart;
        var missing = System.Type.Missing;
        ct.ChartWizard(oRng, Excel.XlChartType.xlXYScatterSmooth, missing, missing, missing, missing, missing, missing, "x axis", missing, missing);
        Excel.Series oSeries = (Excel.Series)ct.SeriesCollection(1);
        oSeries.XValues = Sheet.get_Range("A3", "A11");

        if (datatable.Checked)
        {
            ct.ChartWizard(Source: "A2:B11",
               Title: "mRem/hr from gamma radiation",
               CategoryTitle: "Minutes After Run",
               ValueTitle: "mRem/hr");
            ct.Refresh();
        }

        if (datatablelong.Checked)
        {
            ct.ChartWizard(Source: "A2:B11",
               Title: "mRem/hr from gamma radiation",
               CategoryTitle: "Days After Run",
               ValueTitle: "mRem/hr");
            ct.Refresh();
        }