1

我正在尝试从数据表生成折线图,但输出不正常。我想那里存在与轴相关的问题。因此,如果有人纠正我的代码,那将是很大的帮助。

private void button1_Click(object sender, EventArgs e)
        {
            System.Data.DataTable dt = GetGraphData();

            Excel.Application xla = new Excel.Application();
            xla.Visible = true;
            Excel.Workbook wb = xla.Workbooks.Add(Excel.XlSheetType.xlWorksheet);
            Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
            //********************** Now create the chart. *****************************
            Excel.ChartObjects chartObjs = (Excel.ChartObjects)ws.ChartObjects(Type.Missing);
            Excel.ChartObject chartObj = chartObjs.Add(250, 60, 300, 300);
            Excel.Chart xlChart = chartObj.Chart;

            int nRows = 2;
            int nColumns = dt.Rows.Count;
            string upperLeftCell = "B2";
            int endRowNumber = System.Int32.Parse(upperLeftCell.Substring(1))
                + nRows - 1;
            char endColumnLetter = System.Convert.ToChar(
                Convert.ToInt32(upperLeftCell[0]) + nColumns - 1);
            string upperRightCell = System.String.Format("{0}{1}",
                endColumnLetter, System.Int32.Parse(upperLeftCell.Substring(1)));
            string lowerRightCell = System.String.Format("{0}{1}",
                endColumnLetter, endRowNumber);

            Excel.Range rg = ws.get_Range(upperLeftCell, lowerRightCell);
            for (int i = 1; i <= dt.Rows.Count; i++)
            {
                rg[1, i] = dt.Rows[i - 1][0].ToString();          //For Adding Header Text
                rg[2, i] = int.Parse(dt.Rows[i - 1][1].ToString());  //For Adding Datarow Value
            }


            Excel.Range chartRange = ws.get_Range(upperLeftCell, lowerRightCell);
            xlChart.SetSourceData(chartRange, Type.Missing);
            xlChart.ChartType = Excel.XlChartType.xlLine;

            // *******************Customize axes: ***********************
            Excel.Axis xAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlCategory,
                 Excel.XlAxisGroup.xlPrimary);
            //xAxis.HasTitle = true;
            // xAxis.AxisTitle.Text = "X Axis";

            //Excel.Axis yAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlSeriesAxis,
            //     Excel.XlAxisGroup.xlPrimary);
            //3d chart
            //yAxis.HasTitle = true;
            //yAxis.AxisTitle.Text = "Y Axis";

            Excel.Axis zAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlValue,
                 Excel.XlAxisGroup.xlPrimary);
            //zAxis.HasTitle = true;
            //zAxis.AxisTitle.Text = "Z Axis";

            // *********************Add title: *******************************
            xlChart.HasTitle = true;
            xlChart.ChartTitle.Text = "Project Status Graph";

            // *****************Set legend:***************************
            xlChart.HasLegend = true;

            //FileStream file = new FileStream(@"d:\pop.xls", FileMode.Create);
            //file.Close();

            wb.SaveCopyAs(@"d:\pop.xls");

            // ****************For Quiting The Excel Aplication ***********************
            if (xla != null)
            {
                xla.DisplayAlerts = false;
                wb.Close();
                wb = null;
                xla.Quit();
                xla = null;
            }
        }

        private System.Data.DataTable GetGraphData()
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            dt.Columns.AddRange(new DataColumn[2] { new DataColumn("ProjectStatus"), new DataColumn("per") });

            DataRow dr1 = dt.NewRow();
            dr1[0] = "Compleet";
            dr1[1] = 20;
            dt.Rows.Add(dr1);

            DataRow dr2 = dt.NewRow();
            dr2[0] = "Pending";
            dr2[1] = 20;
            dt.Rows.Add(dr2);

            DataRow dr3 = dt.NewRow();
            dr3[0] = "UnCompleet";
            dr3[1] = 20;
            dt.Rows.Add(dr3);

            return dt;

        }

我想这些下面的线不好。

    Excel.Axis xAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlCategory,
         Excel.XlAxisGroup.xlPrimary);
    //xAxis.HasTitle = true;
    // xAxis.AxisTitle.Text = "X Axis";

    //Excel.Axis yAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlSeriesAxis,
    //     Excel.XlAxisGroup.xlPrimary);
    //3d chart
    //yAxis.HasTitle = true;
    //yAxis.AxisTitle.Text = "Y Axis";

    Excel.Axis zAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlValue,
         Excel.XlAxisGroup.xlPrimary);
    //zAxis.HasTitle = true;
    //zAxis.AxisTitle.Text = "Z Axis";

这样我解决了

这只是一个示例代码而不是现实生活中的实现

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel;
using System.IO;

namespace WindowsForms_chartexcel
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            Excel.Application xlApp ;
            Excel.Workbook xlWorkBook ;
            Excel.Worksheet xlWorkSheet ;
            object misValue = System.Reflection.Missing.Value;

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

            //add data 
            xlWorkSheet.Cells[1, 1] = "";
            xlWorkSheet.Cells[1, 2] = "Student1";
            xlWorkSheet.Cells[1, 3] = "Student2";
            xlWorkSheet.Cells[1, 4] = "Student3";

            xlWorkSheet.Cells[2, 1] = "Term1";
            xlWorkSheet.Cells[2, 2] = "80";
            xlWorkSheet.Cells[2, 3] = "65";
            xlWorkSheet.Cells[2, 4] = "45";

            xlWorkSheet.Cells[3, 1] = "Term2";
            xlWorkSheet.Cells[3, 2] = "78";
            xlWorkSheet.Cells[3, 3] = "72";
            xlWorkSheet.Cells[3, 4] = "60";

            xlWorkSheet.Cells[4, 1] = "Term3";
            xlWorkSheet.Cells[4, 2] = "82";
            xlWorkSheet.Cells[4, 3] = "80";
            xlWorkSheet.Cells[4, 4] = "65";

            xlWorkSheet.Cells[5, 1] = "Term4";
            xlWorkSheet.Cells[5, 2] = "75";
            xlWorkSheet.Cells[5, 3] = "82";
            xlWorkSheet.Cells[5, 4] = "68";

            Excel.Range chartRange ; 

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

            chartRange = xlWorkSheet.get_Range("A1", "d5");
            chartPage.SetSourceData(chartRange, misValue);
            //chartPage.ChartType = Excel.XlChartType.xlColumnClustered;
            chartPage.ChartType = Excel.XlChartType.xlLine;
            if (File.Exists(@"d:\test.xls"))
            {
                File.Delete(@"d:\test.xls");
            }

            xlWorkBook.SaveAs(@"d:\test.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);

            MessageBox.Show("Excel file created , you can find the file d:\test.xls");

        }

        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
    }
}
4

0 回答 0