关于从C#代码生成Excel折线图的问题

我想从数据表中生成折线图,但输出不会很好。 我猜是有轴相关的问题在那里。 所以如果有人纠正我的代码会很有帮助。

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(); } } } }