在对大批量的数据进行分析比较时,最常用也是最直观明了的表现方法莫过于绘制趋势图表。一般情况下,我们利用
Excel制作各种类型的趋势图表,但它们都是基于静态数据的,即数据是事先整理好的而不 是动态生成的。如果在网上发布,只能将绘制好的图表以静态GIF图像发布,这无法从根本上满足不同用户对不同数据的需求。
ASP擅长服务器端的Web编程,操作后台数据库更是它的强项。但是用ASP制作实时数据库图表有点困难,因为ASP本身并不支持图表功能,只能借助第三方控件进行开发,如VB的MSChart控件。微软推出的.NET Framework较好地解决了这个问题。微软在.NET平台上集成了实时数据库图表制作组件—OWC(Microsoft Office Web Components)。通过在ASP.NET页面中调用OWC,我们可以轻松地绘制出各种类型的实时图表。OWC支持近50种图表类型,包括曲线图、折线图、柱状图、面积图、K线图等。与MSChart相比,OWC功能强大,操作简单。此外,由于OWC是基于服务端的,而MSChart只能应用在客户端,因此在服务器端的Web开发中,MSChart要比OWC逊色不少。
下面笔者将结合实例来具体阐述OWC在ASP.NET页面中的应用,这个实例是笔者开发的项目《化纤产品及其原料市场分析系统》中的一个子系统,笔者在该项目中用到OWC,充分享受到了OWC的强大功能给开发工作带来的方便。
三层结构
系统整体架构采用了B/S三层结构模式,将系统分为用户界面层(也称为表现层)、业务逻辑层(也称为功能层)和数据库服务层(也称为数据层),开发平台则采用了.NET Framework,有效地降低了系统对客户机的要求,避免了在客户机上分发应用程序与版本控制的困难。
● 用户界面层: 用户界面采用的是ASP.NET技术。ASP.NET技术的应用增强了系统的通用性,客户端只需安装IE或Netscape等任一款浏览器,无需加载任何组件。
● 业务逻辑层: 采用了.NET Framework调用OWC的技术,能够根据用户的要求快速取得数据库中的数据动态生成图表。系统能够支持复杂的检索条件,检索速度快,响应时间短。
● 数据库服务层:数据库服务层可采用任何一款关系型数据库。在本项目中,笔者使用的是SQL Server,它能与.NET Framework无缝集成。数据库存取技术则采用了ADO.NET。
下文我们将着重介绍业务逻辑层的实现方法。
图表元素简介
一张完整的图表由若干个元素组成,我们必须对它们有所了解,才能随心所欲、充分自如地对图表进行全方位的控制,也才能更好地理解本程序。笔者制作了一张简易的图表,在图中标注了程序涉及到的主要部位和元素的名称,借此帮助读者掌握OWC以及理解本文所引用的代码。
使用OWC组件
在这一节里所涉及的源代码摘自于《化纤产品及其原料市场分析系统》,该系统在Window 2000/XP简体中文专业版、.NET Framewrok 1 .0环境下通过。使用OWC组件的步骤如下:
1. 在当前目录中新建一个存放图表文件的子目录chart,同时把对该目录的“修改”权限赋予ASP.NET账户。具体步骤如下:用鼠标右键单击chart目录名,选择“属性”菜单项,在弹出的“Chart”属性对话框中单击“安全”选项卡,再单击“添加”按钮,找到ASP.NET账户,赋予“修改”权限,单击“确定”按钮结束。这样,ASP.NET就可以在chart目录中写入图表文件了。
2. 定义一个服务器端的Image图像控件,该图像的属性imageURL将在程序末尾被指向动态生成的图表文件,因此在这里无需为它赋值。
< asp:image id=“imgChart” Width=“500” Height=“300” Visible=“False” Runat=“server”>< /asp:image>
3. 添加OWC引用。
在使用OWC之前,首先必须将OWC的引用加入到“解决方案资源管理器”中。具体步骤如下:打开“解决方案资源管理器”面板,鼠标右键单击“引用”,选择“添加引用”菜单,在弹出的“添加引用”对话框中单击“COM”卡片,找到“Microsoft Office Web Components 9.0”,单击“选择”和“确定”按钮,OWC就被添加到了引用中。
4. 定义OWC空间,并在该空间中加入一个OWC图表owcChart。
Dim owcChartSpace As OWC.ChartSpace = New OWC.ChartSpace()
Dim owcChart As OWC.WCChart = owcChartSpace.Charts.Add
5. 用SQL检索条件进行数据库检索,并将检索结果以RecordSet数据集的方式赋给owcChart。
OWC只支持RecordSet数据集,不支持DataSet数据集,因此在检索时不能使用sqlCommand、sqlDataAdapter等对象,只能使用RecordSet对象进行检索。
’打开connection连接
ConnADO.Open(connectionString)
RecordsetADO.ActiveConnection = ConnADO
’设置游标为静态游标
RecordsetADO.CursorType = ADODB.CursorTypeEnum.adOpenStatic
RecordsetADO.CursorLocation = ADODB.CursorLocationEnum.adUseClient
’变量strSQL中存放了标准SQL检索条件
RecordsetADO.Open(strSQL)
然后将RecordSet数据集赋给OWC对象:
owcChartSpace.DataSource = RecordsetADO
在本例中,我们假定用SQL语句检索出的数据共有三个字段:产品、日期和价格。这三个字段的值分别与图表中的曲线、分类(X)轴和数值(Y)轴的数据一一对应。
6. 确定曲线类型,并确定区别不同曲线的字段名。
首先确定曲线类型为平滑曲线。
owcChart.Type = OWC.ChartChartTypeEnum.chChartTypeSmoothLine
OWC支持在同一张图表中显示两条以上的曲线。因此我们必须给出区别不同曲线的依据,这个依据就是“产品”字段的取值。具体地说,“产品”字段中有几个不同的取值,就会生成几条不同的曲线。
owcChart.SetData(OWC.ChartDimensionsEnum.chDimSeriesNames, 0, “产品”)
7. 确定分类(X)轴标签与数值(Y)轴标签所对应的字段。
首先需要定义owcSeries为OWC的曲线集合,然后遍历图表中的每一条曲线,将“日期”字段的值赋给分类(X)轴作为X轴刻度标签,将“价格”字段的值赋给数值(Y)轴作为Y轴刻度标签。如果我们能够确定图表中只有一条曲线,也可以省略遍历的过程,但这样无疑会降低程序的通用性。
Dim owcSeries As OWC.WCSeries
For Each owcSeries In owcChart.SeriesCollection
owcSeries.SetData(OWC.ChartDimensionsEnum.chDimCategories, 0, “日期”)
owcSeries.SetData(OWC.ChartDimensionsEnum.chDimValues, 0, “价格”)
Next
8. 对坐标轴的属性进行设置。
这部分代码通过对坐标轴标题的文字内容、颜色、大小、主要和次要刻度线及其标签、主要和次要网络线等方面的设置美化图表。读者如果对本段代码中的概念有些模糊,可以参考前一部分提供的那张图表。具体设置方法请参见以下代码。
’先定义axis为坐标轴集合
Dim axis As OWC.WCAxis
’遍历坐标轴集合
For Each axis In owcChart.Axes
’显示轴标题
axis.HasTitle = True
’先对分类(X)轴进行设置
If axis.Type=OWC.ChartAxisTypeEnum.
chCategoryAxis Then
axis.HasTickLabels = True
’显示X轴刻度标签
axis.Position = OWC.ChartAxisPositionEnum.chAxisPositionBottom
’标签的显示位置
axis.Title.Font.Color =”blue”
’X轴的标题文字颜色
axis.Title.Font.Size = “9”
’X轴的标题文字大小
axis.Title.Caption = “日期范围”
’X轴的标题文字内容
Else
’对数值(Y)轴进行设置
axis.MajorGridlines.Line.Color = “silver”
’Y轴主要网络线的颜色
axis.MajorTickMarks = OWC.ChartTickMarkEnum.chTickMarkNone
’不显示Y轴主要刻度标记
axis.HasTickLabels = True
’显示Y轴刻度标签
axis.Title.Font.Color = “blue”
’Y轴的标题文字颜色
axis.Title.Font.Size = “9”
’Y轴的标题文字大小
axis.Title.Caption=“价格(千元/吨)”
’Y轴的标题文字内容
End If
Next
9. 以GIF图像格式输出图表,并将图像文件名赋给Image控件。
’用随机数来生成随机文件名
Randomize()
Dim nFileNameSuffix As Integer
Dim sFileNameSuffix As String
nFileNameSuffix = 100000 * Rnd()
sFileNameSuffix = System.Convert.ToString(nFileNameSuffix)
’以GIF格式输出图表,大小为500*300,图表的文件名为:polyesterprice_随机数.gif,存放在chart子目录中
owcChartSpace.ExportPicture(MapPath(“chart/PolyesterPrice_”) + sFileNameSuffix + “.gif”, “gif”, 500, 300)
’将Image控件的URL指向该图表文件
imgChart.ImageUrl=“chart/PolyesterPrice_” + sFileNameSuffix + “.gif”
通过以上九个步骤,我们就完成了一个实时数据库图表的生成与显示。在此需要指出的是,以上的九个步骤只是生成一张图表必不可少的基本过程,通过设置OWC的其他属性可以更好、更精确地控制图表的生成与显示方式,如图例、线条的粗细与颜色、坐标轴刻度线及标签的显示频度、网络线等。这部分笔者不再介绍,请参见本文第四部分的源代码。
优化
上文中所有实时生成的图表文件都存放在chart文件夹中,由于采用了随机文件名的方式,因此这些文件不会互相覆盖。但是如此日积月累,越来越多的文件不仅占用了硬盘空 间,也妨碍了管理,降低了性能。我们能不能在程序中自动删除以前的图表文件呢?答案是肯定的。我们只要在代码文件的Page_Load()函数中放置如下一段代码,程序运行的时候,就会自动删除当日以前的文件。这样,chart文件夹中存放的就总是当日生成的图表文件,从而有效地避免了文件垃圾。
’先取得chart文件夹中的文件列表
Dim fileEntries() As String = System.IO.Directory.GetFiles(MapPath(“chart”))
Dim sFile As String
’遍历文件列表
For Each sFile In fileEntries
’将文件的生成日期与系统日期相比,如果是当日以前生成的文件,删除它
If DateTime.Compare(System.IO.File.GetCreationTime(sFile).AddDays(1), DateTime.Now) < 0 Then
System.IO.File.Delete(sFile)
End If
Next
虽然用OWC生成的图表功能齐全,界面美观,但它也存在着不少的缺陷。首先,OWC不支持DataSet数据集,这样我们就无法在生成图表的同时使用DataGrid显示数据表,除非我们用循环依次取出Recordset记录集中的全部数据手工生成表格,或用同样的检索条件对数据库进行二次检索,但这无疑要增加服务器的负担。其次,在同一张图表中绘制的曲线只能是同一种类型,或同为平滑曲线图,或同为柱状图,它不能在同一张图表中显示不同类型的曲线。最后,在某些细节方面,如分类(X)轴的设置方面,OWC无法提供更加详细、人性化的设置途径。如果读者要追求更强大的功能和更好的显示效果,笔者向您推荐两个专业的基于.NET的图表控件,这两个控件分别由Dundas和Softwarefx公司出品,都同时支持Web Form和Win Form开发,只是这两个控件都是付费的。读者如果有兴趣,可以到它们的网站去下载DEMO版本,以亲身体验一下专业图表控件带来的强大功能。
分享到:
相关推荐
在按照YOLOv10官网上的步骤进行时,运行app.py文件时,如果没有预训练模型的话会报错。解压压缩包里的内容到同级目录下(在requirements.txt文档下面),这样运行后就不会报错。
在IT领域,Linux系统是广泛应用于服务器和嵌入式设备的操作系统。对于系统开发者和管理员,深入理解Linux的Socket编程、IO模型以及进程间通信(IPC)是至关重要的。本资料包提供了三个主要部分的学习资源:`process_comm`涉及进程间通信,`linux_socket`涵盖Socket编程,而`io_mode`则讨论Linux的IO模型。接下来,我们将详细探讨这些关键知识点。 让我们来看看**Linux Socket编程**。Socket是网络通信的基本接口,它允许两个或多个进程通过网络进行数据交换。在Linux中,Socket编程通常涉及到以下步骤:创建Socket,绑定IP地址和端口号,监听连接请求,接受连接,发送和接收数据,最后关闭Socket。`linux_socket`目录可能包含了示例代码,演示如何创建TCP或UDP Socket,处理并发连接,以及实现基本的错误处理机制。理解Socket编程有助于开发网络服务,如Web服务器、FTP服务器等。 我们来讨论**Linux IO模型**。在Linux中,有五种主要的IO模型:阻塞IO、非阻塞IO、IO复用(
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
湖大计算机体系结构实验
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
Toad Data Modeler:Toad中数据字典的创建与管理.docx
前台: 用户读书笔记,心得查看,并且可以支持调用第三方组建,进行实时聊天 在线图书阅读,一本书里,有多个章节,阅读到某个章节,可以保存阅读进度,比如阅读第一章了,点击提交,可以存储阅读进度,在个人后台查看阅读进度 用户注册 后台: 管理员: 管理员用户管理 注册用户管理 书籍类别管理 书籍信息管理 阅读进度管理 分享阅读心得,笔记管理 系统管理 注册用户: 个人资料修改 分享阅读心得,笔记(下拉表,选择类别) 个人阅读进度查看
SolarWinds数据库性能分析器:高级功能:SQL分析与优化.docx
电子商务之价格优化算法:动态定价:价格战与市场动态.docx
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
基于VB的程序实例,可供参考学习使用
基于java的旅游推荐系统设计与实现答辩PPT.pptx
安装前的准备 1、安装Python:确保你的计算机上已经安装了Python。你可以在命令行中输入python --version或python3 --version来检查是否已安装以及安装的版本。 个人建议:在anaconda中自建不同python版本的环境,方法如下(其他版本照葫芦画瓢): 比如创建python3.8环境,anaconda命令终端输入:conda create -n py38 python==3.8 2、安装pip:pip是Python的包管理工具,用于安装和管理Python包。你可以通过输入pip --version或pip3 --version来检查pip是否已安装。 安装WHL安装包 1、打开命令行(或打开anaconda命令行终端): 在Windows上,你可以搜索“cmd”或“命令提示符”并打开它。 在macOS或Linux上,你可以打开“终端”。 2、cd到whl文件所在目录安装: 使用cd命令导航到你下载的whl文件所在的文件夹。 终端输入:pip install xxx.whl安装即可(xxx.whl指的是csdn下载解压出来的whl) 3、等待安装完成: 命令行会显示安装进度,并在安装完成后返回提示符。 以上是简单安装介绍,小白也能会,简单好用,从此再也不怕下载安装超时问题。 使用过程遇到问题可以私信,我可以帮你解决! 收起
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
基于VB的程序实例,可供参考学习使用
《基于Java Swing实现的飞机大战游戏》是一份旨在帮助学习者掌握Java编程和游戏开发的资源。该资源通过一个完整的飞机大战游戏实例,展示了如何使用Java语言结合Swing库进行桌面应用程序开发。本资源不仅包含详细的源码,还提供了相关文档、课程设计报告及视频教程,适合作为计算机科学与技术、软件工程等专业的课程设计或毕业设计项目。游戏功能包括玩家控制飞机移动、自动发射子弹、敌机随机出现与移动、碰撞检测以及游戏得分计算等。此外,还加入了背景音乐和音效,增强了游戏体验。通过多线程技术确保游戏流畅运行,同时采用面向对象编程思想构建了清晰的项目结构。总之,《基于Java Swing实现的飞机大战游戏》是一个理想的学习工具,它能够帮助初学者深入理解Java GUI编程和事件处理机制,同时也为有经验的开发者提供了实战演练的机会。
**正文** 在现代Web开发中,实时通信是一个重要的需求,SpringBoot框架提供了与WebSocket的集成,使得开发者可以方便地在应用程序中实现双向通信。本文将深入探讨如何在SpringBoot项目中整合WebSocket,以及相关的概念和技术。 WebSocket协议是HTML5引入的一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送数据,极大地提高了实时性。而SpringBoot作为Spring框架的轻量级版本,简化了配置和启动流程,使得开发WebSocket应用变得更加便捷。 我们需要在`pom.xml`中添加SpringBoot WebSocket的相关依赖。SpringBoot默认集成了Spring Websocket,我们只需要引入`spring-boot-starter-websocket`模块即可: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId