超级XY曲线控件使用
- 格式:pdf
- 大小:527.26 KB
- 文档页数:13
c# ms chart 控件使用方法第一个简单的chart:创建曲线图chart1.Series.Clear();Series series = new Series("Spline");series.ChartType = SeriesChartType.Spline;series.BorderWidth = 3;series.ShadowOffset = 2;// Populate new series with dataseries.Points.AddY(67);series.Points.AddY(57);series.Points.AddY(83);series.Points.AddY(23);series.Points.AddY(70);series.Points.AddY(60);series.Points.AddY(90);series.Points.AddY(20);// Add series into the chart's series collectionchart1.Series.Add(series);同时显示2条曲线// Populate series with random dataRandom random = new Random();for (int pointIndex = 0; pointIndex < 10;pointIndex++){Chart1.Series["Series1"].Points.AddY(random.Next(45, 95)); Chart1.Series["Series2"].Points.AddY(random.Next(5, 75)); }// Set series chart typeChart1.Series["Series1"].ChartType = SeriesChartType.Line; Chart1.Series["Series2"].ChartType = SeriesChartType.Spline;// Set point labelsChart1.Series["Series1"].IsValueShownAsLabel = true;Chart1.Series["Series2"].IsValueShownAsLabel = true;// Enable X axis marginChart1.ChartAreas["ChartArea1"].AxisX.IsMarginVisible = true;// Enable 3D, and show data point marker linesChart1.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = true; Chart1.Series["Series1"]["ShowMarkerLines"] = "True";Chart1.Series["Series2"]["ShowMarkerLines"] = "True";显示column类型图,柱状图// Create new data series and set it's visual attributesChart1.Series.Clear();Series series = new Series("FlowRead");series.ChartType = SeriesChartType.Column;series.BorderWidth = 3;series.ShadowOffset = 2;// Populate new series with dataseries.Points.AddY(67);series.Points.AddY(57);series.Points.AddY(83);series.Points.AddY(23);series.Points.AddY(70);series.Points.AddY(60);series.Points.AddY(90);series.Points.AddY(20);// Add series into the chart's series collectionChart1.Series.Add(series);很多点,效率还可以// Fill series datadouble yValue = 50.0;Random random = new Random();for (int pointIndex = 0; pointIndex < 20000;pointIndex++){yValue = yValue + (random.NextDouble() * 10.0 - 5.0);Chart1.Series["Series1"].Points.AddY(yValue);}// Set fast line chart typeChart1.Series["Series1"].ChartType = SeriesChartType.FastLine;日期,xy类型// Create a new random number generatorRandom rnd = new Random();// Data points X value is using current date DateTime date = DateTime.Now.Date;// Add points to the stock chart seriesfor (int index = 0; index < 10; index++){Chart1.Series["Series1"].Points.AddXY( date, // X value is a daternd.Next(40,50)); //Close Y value// Add 1 day to our X valuedate = date.AddDays(1);int-int的xy数据绘图// Create a new random number generatorRandom rnd = new Random();// Add points to the stock chart seriesfor (int index = 0; index < 10; index++){Chart1.Series["Series1"].Points.AddXY(rnd.Next(10,90), // X value is a date rnd.Next(40,50)); //Close Y value数据库数据,datetime-int类型Chart1.Series.Clear();OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False");OleDbCommand cmd = conn.CreateCommand();conn.Open();mandText = "select 时间,序号from pub_log_read order by 序号asc";//DataSet ds = new DataSet();//OleDbDataAdapter da = new OleDbDataAdapter();//da.SelectCommand = cmd;//da.Fill(ds, "tbscore");OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);Chart1.DataBindTable(dr, "时间");dr.Close();数据库数据2,string-int类型Chart1.Series.Clear();OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False");OleDbCommand cmd = conn.CreateCommand();conn.Open();mandText = "select 账号,count(账号) as 次数from pub_log_read group by 账号order by 账号asc";//DataSet ds = new DataSet();//OleDbDataAdapter da = new OleDbDataAdapter();//da.SelectCommand = cmd;//da.Fill(ds, "tbscore");OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);Chart1.DataBindTable(dr, "账号");dr.Close();数据库绑定3-string-int型Chart1.Series.Clear();Chart1.Series.Add("Series1");OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False");OleDbCommand cmd = conn.CreateCommand();mandText = "select 账号,count(账号) as 次数from pub_log_read group by 账号order by 账号asc";conn.Open();DataSet ds = new DataSet();OleDbDataAdapter da = new OleDbDataAdapter();da.SelectCommand = cmd;da.Fill(ds, "tbscore");Chart1.DataSource = ds;Chart1.Series["Series1"].XValueMember = "账号";Chart1.Series["Series1"].YValueMembers = "次数";// Data bind to the selected data sourceChart1.DataBind();conn.Close();数据库4,只绑定yChart1.Series.Clear();Chart1.Series.Add("序号");OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False");OleDbCommand cmd = conn.CreateCommand();conn.Open();mandText = "select 序号from pub_log_read order by 序号asc";//DataSet ds = new DataSet();//OleDbDataAdapter da = new OleDbDataAdapter();//da.SelectCommand = cmd;//da.Fill(ds, "tbscore");OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);Chart1.Series[0].Points.DataBindY(dr);dr.Close();数据库5,绑定xyChart1.Series.Clear();Chart1.Series.Add("序号");OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False");OleDbCommand cmd = conn.CreateCommand();conn.Open();mandText = "select 账号,count(账号) as 次数from pub_log_read group by 账号order by 账号desc";//DataSet ds = new DataSet();//OleDbDataAdapter da = new OleDbDataAdapter();//da.SelectCommand = cmd;//da.Fill(ds, "tbscore");OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);Chart1.Series[0].Points.DataBindXY(dr,"账号",dr,"次数");dr.Close();数据库6,支持显示参数Chart1.Series.Clear();Chart1.Series.Add("S1");OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False");OleDbCommand cmd = conn.CreateCommand();conn.Open();mandText = "SELECT * FROM REPSALES WHERE Year=2004";//DataSet ds = new DataSet();//OleDbDataAdapter da = new OleDbDataAdapter();//da.SelectCommand = cmd;//da.Fill(ds, "tbscore");OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);Chart1.Series[0].Points.DataBind(dr, "name", "sales", "Tooltip=Year,Label=Commissions{C2}");dr.Close();数据库7,支持多lineChart1.Series.Clear();Chart1.Series.Add("S1");OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False");OleDbCommand cmd = conn.CreateCommand();conn.Open();mandText = "SELECT * FROM REPSALES";//DataSet ds = new DataSet();//OleDbDataAdapter da = new OleDbDataAdapter();//da.SelectCommand = cmd;//da.Fill(ds, "tbscore");OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);Chart1.DataBindCrossTable(dr, "Name", "Year", "Sales", "Label=Commissions{C}");dr.Close();数据库8,按照行添加数据// Resolve the address to the Access databasestringfileNameString = this.MapPath(".");fileNameString += "..\\..\\..\\data\\chartdata.mdb";//Initialize a connectionstringstringmyConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DataSource=" + fileNameString;// Definethe databasequerystringmySelectQuery="SELECT * FROM SALESCOUNTS;";// Createa database connection object using the connectionstringOleDbConnection myConnection = newOleDbConnection(myConnectionString);// Create adatabase command on the connection usingqueryOleDbCommandmyCommand = new OleDbCommand(mySelectQuery, myConnection);// Open theconnectionmyCommand.Connection.Open();//Initializes a new instance of the OleDbDataAdapter classOleDbDataAdapter myDataAdapter = new OleDbDataAdapter();myDataAdapter.SelectCommand = myCommand;//Initializes a new instance of the DataSet classDataSetmyDataSet = new DataSet();// Addsrows in the DataSetmyDataAdapter.Fill(myDataSet,"Query");foreach(DataRow row in myDataSet.Tables["Query"].Rows){// For each Row add a new seriesstring seriesName = row["SalesRep"].ToString();Chart1.Series.Add(seriesName);Chart1.Series[seriesName].ChartType = SeriesChartType.Line;Chart1.Series[seriesName].BorderWidth = 2;for(int colIndex = 1; colIndex <myDataSet.Tables["Query"].Columns.Count; colIndex++) {// For each column (column 1 and onward) add the value as apointstring columnName =myDataSet.Tables["Query"].Columns[colIndex].ColumnName; int YVal = (int) row[columnName];Chart1.Series[seriesName].Points.AddXY(columnName, YVal);}}DataGrid.DataSource = myDataSet;DataGrid.DataBind();// Closesthe connection to the data source. This is the preferred// method ofclosing any open connection.myCommand.Connection.Close();使用xml数据// resolve the address to the XML documentstringfileNameString = this.MapPath(".");stringfileNameSchema = this.MapPath(".");fileNameString += "..\\..\\..\\data\\data.xml";fileNameSchema += "..\\..\\..\\data\\data.xsd";//Initializes a new instance of the DataSet classDataSetcustDS = new DataSet();// Read XMLschema into the DataSet.custDS.ReadXmlSchema( fileNameSchema );// ReadXML schema and data into the DataSet.custDS.ReadXml( fileNameString );//Initializes a new instance of the DataView classDataViewfirstView = new DataView(custDS.Tables[0]);// Sincethe DataView implements and IEnumerable, pass the reader directlyinto// theDataBindTable method with the name of the column used for the Xvalue.Chart1.DataBindTable(firstView, "Name");使用excel数据// resolve the address to the Excel filestringfileNameString = this.MapPath(".");fileNameString += "..\\..\\..\\data\\ExcelData.xls";// Createconnection object by using the preceding connection string.string sConn= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +fileNameString + ";Extended Properties="Excel8.0;HDR=YES"";OleDbConnection myConnection = new OleDbConnection( sConn );myConnection.Open();// Thecode to follow uses a SQL SELECT command to display the data fromthe worksheet.// Createnew OleDbCommand to return data from worksheet.OleDbCommandmyCommand = new OleDbCommand( "Select * From[data1$A1:E25]",myConnection );// createa databasereaderOleDbDataReader myReader=myCommand.ExecuteReader(CommandBehavior.CloseConnection);//Populate the chart with data in the fileChart1.DataBindTable(myReader, "HOUR");// closethe reader and the connectionmyReader.Close();myConnection.Close();使用csv数据// Filename of the CSV filestring file= "DataFile.csv";// Getthe path of the CSV filestring path= this.MapPath(".");path +="..\\..\\..\\data\";// Createa select statement and a connection string.stringmySelectQuery = "Select * from " + file;stringConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+path+ ";Extended Properties="Text;HDR=No;FMT=Delimited"";OleDbConnection myConnection = new OleDbConnection(ConStr);// Createa database command on the connection using queryOleDbCommandmyCommand = new OleDbCommand(mySelectQuery, myConnection);// Openthe connection and create the readermyCommand.Connection.Open();OleDbDataReader myReader=myCommand.ExecuteReader(CommandBehavior.CloseConnection);// Column1 is a time value, column 2 is a double// Databindthe reader to the chart using the DataBindXY methodChart1.Series[0].Points.DataBindXY(myReader, "1", myReader,"2");// Closeconnection and data readermyReader.Close();myConnection.Close();数组绘图// Initialize an array of doublesdouble[] yval = { 2, 6, 4, 5, 3 };// Initialize an array of stringsstring[] xval = { "Peter", "Andrew", "Julie", "Mary", "Dave" };// Bind the double array to the Y axis points of the Default dataseriesChart1.Series["Series1"].Points.DataBindXY(xval, yval);数据库9,dataview// Resolve the address to the Access databasestringfileNameString = this.MapPath(".");fileNameString += "..\\..\\..\\data\\chartdata.mdb";//Initialize a connectionstringstringmyConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DataSource=" + fileNameString;// Definethe databasequerystringmySelectQuery="SELECT * FROM REPS;";// Createa database connection object using the connectionstringOleDbConnection myConnection = newOleDbConnection(myConnectionString);// Create adatabase command on the connection usingqueryOleDbCommandmyCommand = new OleDbCommand(mySelectQuery, myConnection);// Open theconnectionmyCommand.Connection.Open();//Initializes a new instance of the OleDbDataAdapter classOleDbDataAdapter custDA = new OleDbDataAdapter();custDA.SelectCommand = myCommand;//Initializes a new instance of the DataSet classDataSetcustDS = new DataSet();// Addsrows in the DataSetcustDA.Fill(custDS, "Customers");//Initializes a new instance of the DataView classDataViewfirstView = new DataView(custDS.Tables[0]);// Sincethe DataView implements IEnumerable, pass the dataview directlyinto// the DataBind method with thename of the Columns selected in thequeryChart1.Series["Default"].Points.DataBindXY(firstView,"Name",firstView, "Sales");// Closesthe connection to the data source. This is the preferred// method of closing any openconnection.myCommand.Connection.Close();指定坐标轴的数据显示范围// Create a new random number generatorRandom rnd = new Random();// Add points to the stock chart seriesfor (int index = 0; index < 10; index++){Chart1.Series["Series1"].Points.AddXY(rnd.Next(10,90), // X value is a daternd.Next(40,50)); //Close Y value}Chart1.ChartAreas[0].AxisY.Minimum = 40;Chart1.ChartAreas[0].AxisY.Maximum = 50;数据排序// Use point index for drawing the chartChart1.Series["Series1"].IsXValueIndexed = true;// Sortseries points by second Y valueChart1.DataManipulator.Sort(PointSortOrder.Ascending, "Y2","Series1");查找数据最大值和最小值// Find point with maximum Y value and change colorDataPointmaxValuePoint =Chart1.Series["Series1"].Points.FindMaxValue(); maxValuePoint.Color = Color.FromArgb(255, 128, 128);// Findpoint with minimum Y value and change colorDataPointminValuePoint =Chart1.Series["Series1"].Points.FindMinValue(); minValuePoint.Color = Color.FromArgb(128, 128, 255);pie显示交互private void Page_Load(object sender, System.EventArgs e){// Addseries to the chartSeriesseries = Chart1.Series.Add("My series");// Setseries and legend tooltipsseries.ToolTip = "#VALX: #VAL{C} million";series.LegendToolTip = "#PERCENT";series.PostBackValue = "#INDEX";series.LegendPostBackValue = "#INDEX";// Populateseries datadouble[] yValues = {65.62, 75.54, 60.45, 34.73, 85.42, 32.12, 55.18, 67.15,56.24, 23.65};string[] xValues = {"France", "Canada", "Germany", "USA", "Italy", "Russia","China", "Japan", "Sweden", "Spain" };series.Points.DataBindXY(xValues, yValues);// Setseries visual attributesseries.Type= SeriesChartType.Pie;series.ShadowOffset = 2;series.BorderColor = Color.DarkGray;series.CustomAttributes = "LabelStyle=Outside";}protected void Chart1_Click(object sender, ImageMapEventArgse){intpointIndex = int.Parse(e.PostBackValue);Seriesseries = Chart1.Series["My series"];if(pointIndex >= 0 &&pointIndex < series.Points.Count){series.Points[pointIndex].CustomProperties +="Exploded=true";}}chart点击事件/// <summary>/// Page Load event handler./// </summary>protected void Page_Load(object sender, System.EventArgs e){this.Chart1.Click += new ImageMapEventHandler(Chart1_Click);// directusing of PostBackValueforeach(Series series in this.Chart1.Series){series.PostBackValue = "series:" + + ",#INDEX";}// transferof click coordinates. getCoordinates is a javascriptfunction.stringpostbackScript =ClientScript.GetPostBackEventReference(this.Chart1,"chart:@");this.Chart1.Attributes["onclick"] = postbackScript.Replace("@'", "'+ getCoordinates(event)"); }/// <summary>/// Handles the Click event of the Chart1 control./// </summary>/// <param name="sender">The sourceof the event.</param>/// <paramname="e">The<seecref="System.Web.UI.WebControls.ImageMapEventArgs"/>instance containing the eventdata.</param>protected void Chart1_Click(object sender, ImageMapEventArgse){this.Chart1.Titles["ClickedElement"].Text = "Nothing";string[]input = e.PostBackValue.Split(':');if(input.Length == 2){string[] seriesData = input[1].Split(',');if (input[0].Equals("series")){this.Chart1.Titles["ClickedElement"].Text = "Last Clicked Element:" + seriesData[0] + " - Data Point #" + seriesData[1];}else if (input[0].Equals("chart")){// hit test of X and Y click pointHitTestResult hitTestResult=this.Chart1.HitTest(Int32.Parse(seriesData[0]),Int32.Parse(seriesData[1]));if (hitTestResult != null){this.Chart1.Titles["ClickedElement"].Text = "Last Clicked Element:" + hitTestResult.ChartElementType.ToString();}}}}。
High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件介绍对于我之前的一个项目,我需要在图表控件上显示连续的数据流。
我决定开发自己的控件,因为我找不到任何可以提供所需灵活性的自由软件控件。
其中一个主要的限制是,控件必须绘制大量的数据,并能够迅速显示它(在Pocket PC上)。
控件能够通过仅绘制新的数据点而不是完整的数据序列来做到这一点并且图表还能够显示静态数据。
这种控件是我长时间工作的结果,而且费尽周折地为了提供足够的灵活性来供需要它的人使用。
对于使用者反馈我表示由衷的感谢:一个邮件,留言板中的一一句话或只是对本文评级。
当我不知道是否还有人使用它时,我就没有必要维护这个控件了。
免责声明这个控件是我花费很长时间的开发的结果,因此我对代码的使用放置一些小条件:该代码可以以编译的形式用于任何非商业和商业目的。
代码可以被重新开发,只要它提供作者名字和完整的免责声明。
更改源代码需要得到作者的同意。
此代码不提供任何安全保证。
我不会对使用此代码造成的损失负责。
使用它需要自己承担风险。
This code may be used for any non-commercialand commercial purposes in a compiled form.The code may be redistributed as long as it remainsunmodified and providing that the author nameand the disclaimer remain intact. The sourcescan be modified with the author consent only.This code is provided without any guarantees.I cannot be held responsible for the damage orthe loss of time it causes. Use it at your own risks.鉴于开发这个控件所付出的努力,下面的要求并不过分:如果你在在商业应用程序中使用这个控件,那么请给我发邮件让我知道。
基于ActiveX控件的LabVIEW动态控制Excel多工作表数据显示陈金兰;张家精;陈松【摘要】针对Excel无法在一个图表中同时显示多个工作表的数据,且不能动态控制数据显示问题,介绍LabVIEW利用ActiveX控件在同一个图表中同时动态控制显示Excel多个工作表数据的方法,并给出详细过程和结果.便于对不同工作表数据的对比和分析,并增加数据显示的灵活性和方便性.【期刊名称】《淮北师范大学学报(自然科学版)》【年(卷),期】2013(034)004【总页数】5页(P72-76)【关键词】ActiveX;LabVIEW;Excel;动态控制显示【作者】陈金兰;张家精;陈松【作者单位】安徽建筑大学机械与电气工程学院,安徽合肥230601;安徽建筑大学数理系,安徽合肥230601;安徽建筑大学机械与电气工程学院,安徽合肥230601【正文语种】中文【中图分类】TP319在许多测控项目和科学研究中,经常用传感器收集数据,存储在Excel文件中,并利用这些数据进行对比、分析、控制和科学研究,特别是用图表直观地显示、对比数据.虽然Excel中的图表可以同时显示所嵌入的单个工作表中的多列或多行数据,以进行直观显示、对比和分析研究.往往许多类似的,且需要对比显示的数据是存放在不同的工作表中,Excel却无法在同一个图表中动态控制显示这些数据,并且不能灵活控制显示或不显示某一个工作表中的数据.LabVIEW是一种方便灵活的虚拟仪器开发平台,它采用基于流程图的图形化编程方式,可高效地进行数据管理、科学计算等方面应用程序的开发[1].LabVIEW提供了强大的外部程序接口,包括DLL、ADO、ActiveX和LabSQL等[2],其中通过ActiveX,可方便地实现对数据的访问等.本文针对Excel在一个图表中不能同时灵活控制显示多个工作表的数据问题,介绍LabVIEW采用ActiveX控件技术实现对Excel的数据访问,用LabVIEW的一个图表显示Excel多个工作表的数据,并根据需要灵活控制显示或不显示某个工作表中的数据,以便对比、分析和研究各工作表之间的数据关系.1.1 LabVIEW和Excel通信方法虚拟仪器测试系统中,重要的是对实时数据进行显示、查询、统计、生成报表分析等.利用LabVIEW和Excel通信最主要的有以下4种方法:方法1:利用LabVIEW的DDE功能可以很好地实现LabVIEW与Excel的数据通信.DDE(dynamic data exchange)即动态数据交换,是为在同一台计算机或不同计算机上运行的程序提供动态数据交换[1].它基于Windows消息机制,各应用程序间通过传递消息进行对话交换信息.但是DDE消息传递采用client/ server模式,要求编程者对client/server比较了解,配置复杂,且在Excel的格式上要求比较严格,对现有Excel表格访问时经常无法读取.方法2:利用NI公司的附加工具包LabVIEW SQL-Tool kit进行数据库访问,但这个工具包较昂贵,对于很多LabVIEW用户来讲,这个价格是不可能承受的[3].方法3:利用Lab SQL工具包实现LabVIEW访问Excel数据.Lab SQL是一个免费的、多数据库的、跨平台的LabVIEW数据库访问工具包,支持Windows操作系统中的任何基于ODBC的数据库,通过ADO(Microsoft Active Data Object)控件和Lab SQL语言实现数据库的访问,将复杂的底层ADO以及Lab SQL语言操作封装成一系列的LabSQL VIs模块,便于软件模块化的设计[3].该方法虽然封装了数据对象ADO,对于访问SQL Server、Oracle、Access等数据库应用程序易于理解,操作简单,但是对于访问Excel数据显得累赘,还要下载工具包,安装到相应目录,且还要配置ODBC数据源等复杂的配置程序.方法4:在LabVIEW中利用ActiveX控件读写Excel数据.ActiveX是Microsoft提出的一组使用COM(Component Object Model,部件对象模型)使得软件部件在网络环境中进行交互的技术集.它与具体的编程语言无关[4].LabVIEW自带处理Excel等应用程序的ActiveX控件,包括:Open Application(打开应用)、Open Workbooks(打开工作薄)和Open Worksheets(打开工作表)等控件,并使用属性节点和调用节点实现数据的读取和转换,就像直接操作Excel 表格一样灵活方便,本文后续内容介绍该方法实现和Ex⁃cel通信的详细步骤.1.2 利用ActiveX访问Excel数据以上分析得出,LabVIEW和Excel通信采用ActiveX控件比较方便易行,下面详细阐述用ActiveX控件实现LabVIEW与Excel多个工作表的通信步骤. LabVIEW中利用ActiveX打开Excel,分为打开应用程序(Open Application)、打开工作薄(Open Work⁃books)、打开工作表(Open Worksheets)和读取数据4个主要步骤,以下详细描述实现方法.(1)打开应用程序.如图1所示,在前面板中创建一个“自动化引用句柄”控件,右击该控件,单击“选择ActiveX类”项选择“Excel._Application”,此时“自动化引用句柄”的标签自动更新为“Exc el._Applica⁃tion”.(2)创建“打开自动化”控件.打开程序框图,如图2所示,右击“Excel._Application”控件,选择“Ac⁃tiveX选板”项,打开级联菜单,再拖放“打开自动化”控件,将“Excel._Application”连线至“打开自动化”的左侧自动化引用句柄端.该步骤相当于在电脑中打开Excel应用程序.(3)创建“属性节点”.右击“打开自动化”控件,在“ActiveX选板”中拖放“属性节点”,将“打开自动化”右侧自动化引用句柄端连线至“属性节点”的引用端;再右击“属性节点”的属性,在下拉列表中选择“Workbooks”,即创建了“Workbooks”,如图3所示.(4)创建“调用节点”.右击“Workbooks”控件,在“ActiveX选板”中拖放“调用节点”,将“Workbooks”连线至“调用节点”的引用端,此时“调用节点”自动更新为“Workbooks”,再右击“Workbooks”调用节点的“方法”,在下拉列表中选择“Open”.此时在“Open”的“Filename”输入端连接所需打开Excel文件的路径,这里的文件路径控件需要在前面板中创建一个“文件路径输入控件”.该步骤相当于在已打开的Excel应用程序中打开一个Excel文件,即工作簿.(5)创建“Workbook”属性节点存放打开的workbook.放下“属性节点”,其引用端连接至workbook调用节点的“Open”,属性节点显示为“workbook”,然后单击“属性节点”的属性,在下拉列表中选择“Work⁃sheets”.(6)同步骤4,放下“调用节点”,其引用端连接“Worksheets”,此时“调用节点”显示为“sheets”,再单击“调用节点”的方法,在下拉列表中选择“Item”,在“Item”的“Index”输入端数值以选择读取工作薄中的第几个sheet,如图4所示.该步骤相当于在打开的工作簿中选择一个工作表.(7)Excel中存储的数据可能有多种,如数值型、字符型、货币型等,故Labview读取数据时需要将未知的数据转换成其可识别的数据类型,“变体至数据转换”控件实现该转换.在“ActiveX选板”中选择“变体至数据转换”控件,将其变体端连接至“Item”;再在前面板中放下“自动化引用句柄”,在“选择ActiveX类”下选择“Excel._Worksheet”,将其连线至“变体至数据转换”的类型端.(8)放下“属性节点”,其引用端连接“变体至数据转换”的数据端,然后单击“属性节点”的属性,在下拉列表中选择“UsedRange”.再放下“调用节点”,其引用端连接“UsedRange”,用单击“调用节点”的方法,在下拉列表中选择“Value(获取)”,如图5所示.该步骤相当于在选中的工作表中选择一个区域范围的数据,并将其读出.(9)放下“变体至数据转换”,其变体端连接至“Value”,只要在“变体至数据转换”的类型端连接一个二维的字符型数组常量,就可以在数据端获取表格中的数据.以上步骤的程序,如图6所示.程序的最后需要用Close Application、Close Workbooks和 Close Worksheets来关闭调用.在此不再详细赘述.鉴于以上方法,可以把要放在一起对比分析的不同工作表中的数据读入LabVIEW 中,通过开关控制不同工作表中的数据在XY图表中显示,以便于对比和分析.这里给出一个实例,该实例是在一个XY图表界面上显示Excel 3个工作表中的数据曲线图.如图7所示,Excel表格数据是用传感器测试3个不同房间的温度和湿度得来,保存在同一个Excel文件中的不同工作表中,每个工作表中数据信息均有“序号”、“时间”、“温度”、“湿度”等.如图8a和图8b所示,用开关控制在LabVIEW的XY图表里动态控制显示其中两个和三个表格里的温度变化曲线.其中图8a和图8b的界面图分3个部分,从上到下分别是选择工作表文件路径部分、控制部分和显示部分.文件选择路径部分是在程序运行前选择打开Excel文件,然后用“起始行”和“终止行”这两个控件手动输入要显示的Excel工作表中数据的起始行和终止行,以界定显示范围.控制部分由3个开关分别控制要显示的3个工作表中的温度,这里“1号室开关”控制显示图7所示Excel工作表1号室的温度,“2号室开关”控制显示工作表2号室的温度,“3号室开关”控制显示工作表3号室的温度,把3个开关同时打开,即可在前面板图表里同时显示这3个Excel表格里的温度变化,即图8a显示的界面,以同样的方法可以同时动态显示两个或三个以上房间里的温度变化曲线,图8b显示的是“1号室”和“2号室”温度变化的曲线.显示部分分别用不同颜色的曲线显示不同房间的温度变化,其X坐标是从工作表中的时间列读取的值,温度变化曲线显示不同时间点温度变化的值.其程序分为3个部分:第一部分对打开Excel文件的路径进行配置,并打开Excel workbook和Application,如图9所示.第二部分从打开的Excel应用程序中(配置路径的Excel文件在应用程序中已经打开)读取“1号室”、“2号室”和“3号室”的工作表(sheet),并从中读取控制范围内的时间(应为不同工作表取值时间相同,这里只取一个表中的时间共用)和温度,并将其放在对应的数组里,转置(Excel中是列,LabVIEW的XY图表要求显示数组中的数据为行),抽取行(Excel中取出的是二维数组,LabVIEW的XY图表要求输入的是一维数组),再把时间和温度数组绑定在一起,通过开头控件,再组合数组送给XY图表显示.如图10.第三部分是接收错误输出以及关闭worksheet、workbook和Application等,如图11所示.这里用前面板里的“起始行”和“终止行”这两个输入控件手动输入要显示的Excel工作表中数据的起始行和终止行,确定曲线显示范围.还通过开关控制要显示工作表的数据,这样增加了程序显示多个不同工作表中数据的灵活性和方便性.同样的方法可以显示3条以上多工作表中的数据曲线.本文通过实例描述了用ActiveX对象实现在LabVIEW一个图表同时动态控制显示Excel多个工作表的数据曲线方法,可以灵活控制要显示的不同工作表中的数据曲线的多少和选择相应的曲线,还可以通过输入控件,控制工作表中数据的范围,利用ActiveX技术提供的方法和属性,简单易行.【相关文献】[1]陈金平,王生泽,吴文英.LabVIEW与Excel的通信方法[J].自动化仪表,2006,27(4):65-67.[2]董英斌,韩冰.LabVIEW中利用ActiveX技术访问Excel的接口研究[J].微计算机信息,2006,22(4):165-166.[3]尹技虎,王峰.基于LabSQL的LabVIEW数据库访问技术[J].仪表技术,2011(4):55-56.[4]胡绍海,高亚峰,肖坦.基于LabVIEW的Excel报表生成技术研究[J].测控技术,2007,26(10):64-66.。
一个画曲线的函数Const XMargin = 20 'XMargin --- X轴预留像素Const YMargin = 20 'YMargin --- Y轴预留像素Private Type POINTAPIx As Longy As LongEnd TypePrivate Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As LongPrivate Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As LongPrivate Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long'一个画曲线的函数'XData --- 存放X轴数据'YData --- 存放Y轴数据'PicObj --- 画图形的控件'ShowDot --- 是否显示接点'ShowBorder --- 是否显示边框Private Function DrawLine(XData() As Double, YData() As Double, PicObj As PictureBox, Optional ShowDot As Boolean = True, Optional ShowBorder As Boolean = True) As BooleanOn Error GoTo ErrFlagDim TotalData As Long '所画曲线的总点数Dim i As Long, j As LongDim XMax As Double, XMin As Double, XScale As DoubleDim YMax As Double, YMin As Double, YScale As DoubleDim dblTemp As DoubleDim XY() As POINTAPIDrawLine = FalsePicObj.ClsPicObj.AutoRedraw = TruePicObj.ScaleMode = 3 '模式设为像素'如果画图控件的长、宽不够,则自动调整If PicObj.ScaleWidth < XMargin * 2 Then PicObj.ScaleWidth = XMargin * 2 + 50If PicObj.ScaleHeight < YMargin * 2 Then PicObj.ScaleHeight = YMargin * 2 + 50'如果X与Y的数据个数不一致则结束If UBound(XData) <> UBound(YData) ThenMsgBox "X与Y的数据个数不一致", vbOKOnly + vbInformationExit FunctionEnd If'取得总数据个数,如果小于等于1则结束TotalData = UBound(XData) - LBound(XData)If TotalData <= 1 ThenMsgBox "数据个数小于1, 不可以画曲线", vbOKOnly + vbInformationExit FunctionEnd If'取得XData的最小值,最大值,并设置X轴的缩放比例XMax = -100000000XMin = 100000000For i = LBound(XData) To UBound(XData)If XMax < XData(i) Then XMax = XData(i)If XMin > XData(i) Then XMin = XData(i)NextIf XMax - XMin < 0.0000001 ThenMsgBox "X数据相同, 不可以画曲线", vbOKOnly + vbInformationExit FunctionElseXScale = (PicObj.ScaleWidth - XMargin * 2) / (XMax - XMin)'取得YData的最小值,最大值,并设置X轴的缩放比例YMax = -100000000YMin = 100000000For i = LBound(YData) To UBound(YData)If YMax < YData(i) Then YMax = YData(i)If YMin > YData(i) Then YMin = YData(i)NextIf YMax - YMin < 0.0000001 ThenMsgBox "Y数据相同, 不可以画曲线", vbOKOnly + vbInformation Exit FunctionElseYScale = (PicObj.ScaleHeight - YMargin * 2) / (YMax - YMin)End If'根据XScale, YScale 确定绘图的数据ReDim XY(TotalData)j = 0For i = LBound(YData) To UBound(YData)XY(j).x = XMargin + (XData(i) - XMin) * XScaleXY(j).y = PicObj.ScaleHeight - YMargin - (YData(i) - YMin) * YScale j = j + 1Next'画曲线Polyline PicObj.hdc, XY(0), TotalData + 1PicObj.DrawWidth = 4'显示接点If ShowDot ThenFor i = 0 To TotalDataPicObj.PSet (XY(i).x, XY(i).y)NextPicObj.DrawWidth = 1If ShowBorder ThenRectangle PicObj.hdc, XMargin, YMargin, PicObj.ScaleWidth - XMargin, PicObj.ScaleHeight - YMarginEnd IfDrawLine = TrueExit FunctionErrFlag:MsgBox Err.Descrīption, vbOKOnly + vbCriticalDrawLine = FalseEnd Function。
第四章图形显示4.1概述图形显示对于虚拟仪器面板设计是一个重要的内容。
LabVIEW为此提供了丰富的功能。
在前面几章我们已经接触了这个问题,现在较系统地介绍一下。
我们不从图形的实现方法上去讨论问题,那是计算机图形学的课题。
但我们需要从用户的可能的需求角度探求一下,如果你需要做虚拟仪器方面的开发,那么可能遇到些什么图形问题。
LabVIEW在这方面所做的工作是非常值得借鉴的。
在LabVIEW的图形显示功能中Graph和Chart是两个基本的概念。
一般说来Chart是将数据源(例如采集得到的数据)在某一坐标系中,实时、逐点地显示出来,它可以反映被测物理量的变化趋势,例如显示一个实时变化的波形或曲线,传统的模拟示波器、波形记录仪就是这样。
而Graph则是对已采集数据进行事后处理的结果。
它先将被采集数据存放在一个数组之中,然后根据需要组织成所需的图形显示出来。
它的缺点是没有实时显示,但是它的表现形式要丰富得多。
例如采集了一个波形后,经处理可以显示出其频谱图。
现在,数字示波器也可以具备类似Graph的显示功能。
Chart GraphWaveform(波形)* *XY *Intensity(强度图)* *Digital(数字图)*3D Surface(三维曲面)*3D Parametric(三维参变量)*3D Curve(三维曲线)*而Graph 方式表现形式要远为丰富,但这是以牺牲实时为代价的。
在LabVIEW 6i版本中还包含有极坐标等其他图形(Plot),本章不讨论。
4.2Graph控件各种图形都提供了相应的控件,以Graph为例介绍。
图4-1所示为它的控件。
所有这些控件都包含在图形快速菜单的Visible Items选项下。
曲线图例可用来设置曲线的各种属性,包括线型(实线、虚线、点划线等)、线粗细、颜色以及数据点的形状等。
图形模板可用来对曲线进行操作,包括移动、对感兴趣的区域放大和缩小等。
光标图例可用来设置光标、移动光标,帮助你用光标直接从曲线上读取感兴趣的数据。
超级XY曲线控件的使用配置参考文档北京亚控科技发展有限公司技术部目录一、功能概述 (3)一、功能概述 (3)二、工程实例 (3)三、操作步骤: (3)1、定义设备: (3)2、定义变量: (3)3.制作画面: (4)3.1) 创建画面: (4)3.2) 控件方法介绍: (4)3.3) 控件属性设置: (7)3.4) 功能实现说明: (9)4.进入运行系统: (11)四、注意事项 (13)图表图一插入超级XY曲线 (4)图二超级XY曲线 (5)图三超级XY曲线控件属性 (7)图四坐标选项设置 (8)图五坐标选项设置 (8)图六曲线选项设置 (9)图七超级XY曲线控件 (9)图八调用控件方法 (10)图九画面命令语言-显示时 (11)图十画面命令语言-存在时 (12)图十一超级XY曲线控件运行画面 (12)一、功能概述常规需求:很多工业现场会用到XY曲线,也就是X轴非时间轴的情况。
组态王中的实现方法:1、利用组态王内置控件中的X-Y轴曲线,通过调用此控件的函数来实现。
2、利用组态王通用控件中的超级XY曲线,通过调用此控件的属性、方法来实现。
超级XY曲线相对于X-Y轴曲线功能更加强大,使用更方便。
其主要优势在于提供了更加灵活方便的控件方法来实现更多的功能,Y轴支持多个坐标,最多可以支持16条曲线,曲线可以保存、调用等,所有的功能都提供了相应的控件方法,可以根据需要灵活的在各种命令语言脚本程序中进行调用。
二、工程实例我们举一个例子来说明超级XY曲线控件的使用。
在此例程中我们定义三个变量,分别为“压力”、“温度”、“密度”,通过XY曲线来观察压力、温度对于密度的影响。
下面就以此为例来演示完成这一要求的具体步骤。
三、操作步骤:1、定义设备:根据工程中实际使用得设备进行定义,本例程使用亚控的仿真PLC设备,使用“PLC-亚控-仿真PLC-串口”驱动,定义设备名称为”PLC” 。
2、定义变量:在组态王中定义三个变量:压力(IO实数类型)、温度(IO实数类型)、密度(IO实数类型)。
压力变量:最小值0,最大值100,最小原始值0,最大原始值100,连接设备PLC,寄存器INCREA100,数据类型short,读写属性为只读,采集频率1000。
温度变量:最小值0,最大值50,最小原始值0,最大原始值100,连接设备PLC,寄存器DECREA100,数据类型short,读写属性为只读,采集频率1000。
密度变量:最小值0,最大值1,最小原始值0,最大原始值100,连接设备PLC,寄存器INCREA100,数据类型short,读写属性为只读,采集频率1000。
3.制作画面:3.1) 创建画面:新建画面,画面名称“超级XY曲线”。
点击工具箱的“插入通用控件”,选择“超级XY 曲线”,如图一所示:点击“确定”后,鼠标变成十字形。
然后在画面上画一个矩形框,超级X-Y轴曲线控件就放到画面上了,如图二所示。
双击画面的超级XY曲线控件,为控件命名为:XY曲线。
保存画面。
图一插入超级XY曲线3.2) 控件方法介绍:1.void AddNewPoint( double x,double y,short nIndex);给指定曲线添加一个数据点,可以在程序开始时定义要显示的曲线- 设置数据点的x轴坐标值参数: xy - 设置数据点的y轴坐标值nIndex -给出X-Y轴曲线控件中的曲线索引号,取值范围0-7 返回值:无2.void Clear( short nIndex );清除一条曲线数据。
图二超级XY曲线– 同1参数: nIndex返回值:无3.void ClearAll();清除所有曲线数据。
参数:无返回值:无4.double GetValueAt( double x, short nIndex);返回对应于X轴点值的Y值点插值。
参数:x – X轴坐标值nIndex - 同1返回值:相应于x值的Y轴的值。
5.long GetDataCount( short nIndex );返回某一曲线点的数目。
– 同1参数: nIndex返回值:返回曲线索引号为nIndex的数据点数目。
6.double GetValueX( long nDataIndex, short nCurveIndex );返回曲线中设定点的X轴值。
参数: nDataIndex – 数据点的序号nCurveIndex – 同1返回值:返回序号为nDataIndex的数据点的X轴的值7.double GetValueY( long nDataIndex, short nCurveIndex );返回曲线中设定点的Y轴值。
参数: nDataIndex – 数据点的序号nCurveIndex – 同1返回值:返回序号为nDataIndex的数据点的Y轴的值8.void ZoomIn();绘图区放大一倍。
参数:无返回值:无9.void ZoomOut();绘图区缩小一倍。
参数:无返回值:无10.void ZoomResume();恢复原大小。
参数:无返回值:无11.void SetXAxesRange( double XMax, double XMin );设置X轴的最大最小值。
参数:Xmax – X轴的最大值Xmin – X轴的最小值返回值:无12.void SetYAxesRange( double YMax, double YMin );设置Y轴的最大最小值。
Y轴的最大值–参数: YmaxYmin – Y轴的最小值返回值:无13.void SetXGrids( short nGrids );设置X轴的分度数。
– 分度数参数: nGrids返回值:无14.void SetYGrids( short nGrids );设置Y轴的分度数。
– 分度数参数: nGrids返回值:无15.int SaveToFile( LPCSTR szFileName )保存数据到文件。
– 文件名参数: szFileName返回值:返回错误代码。
如果成功则返回0。
否则:-1 -表示无法打开文件-2 -表示文件名无效-3 -表示写入异常16.int LoadFromFile( LPCSTR szFileName )从文件中加载数据。
参数:szFileName – 文件名返回值:返回错误代码。
如果成功则返回0。
否则-1 -表示文件无法打入-2 -表示文件名无效-3 -表示文件格式不正确-4 -表示读入错误17.BOOL SetChartProperty( LPCSTR szName, LPCSTR szProperty );设置XY控件的属性。
参数: szName– 属性名szProperty – 属性值。
3.3) 控件属性设置:利用超级XY曲线控件的方法实现描点的功能,我们首先对XY曲线控件进行设置,选择画面中的XY曲线,点击右键弹出快捷菜单,选择“控件属性”,弹出XY曲线控件的属性设置,如图三所示:选择“坐标”选项卡,对X轴、Y轴的坐标进行设置,首先设置X轴坐标为最大值1,最小值0,小数位数为2,设置X轴标题为“密度”。
然后设置Y轴坐标,先设置Y Axis 0,设置Y轴标题为“压力”,最大值为100,最小值为0,然后点击“更新Y轴信息”,完成Y Axis 0的设置。
如图四所示:再设置Y Axis 1,选中Y Axis 1,设置Y轴标题为“温度”,设置“显示Y轴”,设置最大值为50,最小值为0,修改“在曲线画图区水平位置”设置项的“在画图区边界的第1条纵轴”,然后点击“更新Y轴信息”,完成Y Axis 1的设置。
如图五所示:图三超级XY曲线控件属性设置控件属性的“曲线”选项卡:设置“曲线0”对应的Y轴为“Y Axis 0”,设置“曲线1”对应的Y周为“Y Axis 1”。
如图六所示:点击“确定”完成超级XY曲线控件属性的设置。
如图七所示:其他相关设置请参考组态王使用手册。
图四坐标选项设置图五坐标选项设置图六曲线选项设置图七超级XY曲线控件3.4) 功能实现说明:设置完超级XY曲线控件属性后,我们通过调用控件的方法来实现描点的功能,主要用到的控件方法为:void AddNewPoint( double x,double y,short nIndex);给指定曲线添加一个数据点,可以在程序开始时定义要显示的曲线- 设置数据点的x轴坐标值参数: xy - 设置数据点的y轴坐标值nIndex -给出X-Y轴曲线控件中的曲线索引号,取值范围0-7 返回值:无void ClearAll();清除所有曲线数据。
参数:无返回值:无点击鼠标右键,弹出快捷菜单,选择“画面属性”,弹出画面属性窗口,点击“命令语言”进入画面命令语言编辑窗口,点击“显示时”选项卡,点击编辑窗口下方的“控件”按钮,弹出“控件属性和方法”对话框,在“控件名称”处选择我们的XY曲线控件,名称为“XY曲线”,在“查看类型”处选择“控件方法”,在“属性或方法”项中选择“ClearAll”,如图八所示:点击“确定”。
完成画面命令语言的“显示时”命令语言的编辑,如图九所示。
实现当画面打开时清除所有的曲线数据。
图八调用控件方法图九画面命令语言-显示时切换到“存在时”选项卡,将“每3000毫秒”改为“每1000毫秒”,通过上述方式调用控件的方法“AddNewPoint”,如图十所示,命令语言如下:XY曲线.AddNewPoint(\\本站点\密度,\\本站点\压力,0);XY曲线.AddNewPoint(\\本站点\密度,\\本站点\温度,1);完成画面命令语言的编辑后,点击“确定”,返回画面编辑窗口。
在画面中添加文本:温度:,##,压力:,##,密度:,##,对## 双击进行动画连接,使用“模拟值输出”分别连接对应的变量:温度,压力,密度。
编辑完成后保存画面。
在工程浏览器的“系统设置”中的“设置运行系统”中进行“主画面配置”,将画面“超级XY曲线”画面配置为主画面。
4. 进入运行系统:画面开发完成点击工程浏览器的“View”按钮切换到运行系统。
系统运行后会将主画面打开,温度、压力与密度关系的XY曲线显示到画面中,如图十一所示:图十画面命令语言-存在时图十一超级XY曲线控件运行画面可以通过控件本身带的工具栏实现超级XY曲线的放大、缩小、平移、保存、调用、打印等等许多功能,工具栏的这些功能也可以通过调用超级XY曲线控件的方法通过命令语言来实现。
其他详细的使用请参考组态王使用手册或者组态王帮助文档。
四、注意事项1.多Y轴坐标的使用时注意需要在“曲线”选项卡中对每一条曲线对应的坐标轴进行设置,默认所有的曲线对应的都是坐标轴Y Axis 0。
2.此控件无法在WEB上进行发布。
3.本演示工程只是简单的超级XY曲线控件使用的例程,更深一步的学习使用请参考组态王使用手册、组态王帮助文档,或者参加组态王培训班。