上篇文章中大概的实现了第一个需求,虽然没有正式的效果出来,但总归思路是这样的,具体实现代码后面会提供。
今天我们主要实现需求分析的第二点和第三点:导入数据模块及修改数据
在网上我们可以找到ASP.NET 导入Excel表现在代码,只要拿过来用就可以了,在做导入功能之前,我们有必要了解导入的数据的结果是什么样的,因为我们导入的数据最后是存入数据库的,所以我们需要构建表的结果以对应导入的数据。
下面是数据的截图
下面就表中的一些字段进行说明:
Boltid是设备的标识
Boltname:是设备的类型
Asmid:也是一个标示
Boltnum:设备数量
A_stand:角度标准值
A_max:角度最大值
A_min:角度最小值
T_stand:扭矩标准值
T_max:扭矩最大值
T_min:扭矩最小值
Qrkstatic:某个静态数据
Techpara:设备参数
VIN:设备号
Dataid:设备标识
Torque:扭矩
Angle:角度
Ok:是否可用
Gettingtime:生产时间
Logintime:登录时间
Workerid:员工号
于是我们就可以设计表的结构了,
对应的表结构如下:
- CREATE TABLE [dbo].[BoltData](
- [id] [int] IDENTITY(1,1) NOT NULL,
- [vin] [varchar](100) NULL,
- [dataid] [float] NULL,
- [torque] [float] NULL,
- [angle] [float] NULL,
- [ok] [float] NULL,
- [gettingtime] [datetime] NULL,
- [logintime] [datetime] NULL,
- [workerid] [varchar](16) NULL,
- CONSTRAINT [PK_BoltData] PRIMARY KEY CLUSTERED
- (
- [id] ASC
- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- ) ON [PRIMARY]
- CREATE TABLE [dbo].[BoltInfo](
- [id] [int] IDENTITY(1,1) NOT NULL,
- [boltid] [varchar](50) NULL,
- [boltname] [varchar](50) NULL,
- [asmid] [float] NULL,
- [boltnum] [int] NULL,
- [a_stand] [int] NULL,
- [a_max] [int] NULL,
- [a_min] [int] NULL,
- [t_stand] [int] NULL,
- [t_max] [int] NULL,
- [t_min] [int] NULL,
- [qrkstation] [varchar](50) NULL,
- [techpara] [varchar](50) NULL,
- CONSTRAINT [PK_BoltInfo] PRIMARY KEY CLUSTERED
- (
- [id] ASC
- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- ) ON [PRIMARY]
下面来看一下具体的导入程序及实现方法,详细的就不说了,就看主要的代码了。
- if (File_Name.Length != 0 && File_Size > 0)
- {
- string File_ExName = File_Name.Substring(File_Name.LastIndexOf(".") + 1);//扩展名
- if (File_ExName != "xls")
- {
- return;
- }
- else
- {
- //上传EXCEL文件到ExcelFile目录
- DateTime now = DateTime.Now;
- string NewName = now.ToShortDateString() + now.Hour.ToString() + now.Minute.ToString() + now.Second.ToString() + "." + File_ExName;
- string filePath = "ExcelFile/" + NewName;
- this.flpImportPath.PostedFile.SaveAs(Server.MapPath(@filePath));
- //获取EXCEL文件,执行导入
- string excelConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath(filePath) + ";Extended Properties=Excel 8.0";
- string excelCmdstr = string.Format("select * from [BoltData$]");
- string Error = "";
- try
- {
- OleDbConnection oleDbConnection = new OleDbConnection(excelConnect);
- oleDbConnection.Open();
- OleDbCommand excelCmd = new OleDbCommand(excelCmdstr, oleDbConnection);
- OleDbDataAdapter excelDa = new OleDbDataAdapter(excelCmd);
- DataTable edt = new DataTable();
- excelDa.Fill(edt);
- int i = 0;
- //追加导入
- BLL.BoltData b = new BLL.BoltData();
- foreach (DataRow dr in edt.Rows)
- {
- Model.BoltData model = new Model.BoltData();
- try
- {
- model.vin = dr[0].ToString();
- model.dataid = Convert.ToInt32(dr[1]);
- model.torque = dr[2].ToString();
- model.angle = dr[3].ToString();
- model.ok = Convert.ToInt16(dr[4]);
- model.gettingtime = Convert.ToDateTime(dr[5]);
- model.logintie = Convert.ToDateTime(dr[6]);
- model.workerid = dr[7].ToString();
- b.Add(model);
- }
- catch (Exception e1)
- {
- Response.Write("失败:" + model.vin + "_" + model.dataid + "");
- }
- }
- this.labIsUpload.Text = "操作完成!";
- //删除临时的EXCEL文件
- oleDbConnection.Close();
- }
- catch (Exception ex)
- {
- Response.Write("<BR>");
- Response.Write(ex.Message);
- }
- //导入结束
- }
- }
- else
- {
- return;
- }
在看具体的需求之前,我们先来看看MSChart的一些知识准备。
一、 MSChart
1.什么是MSChart:MSChart控件与一个数据网格(DataGrid对象)关联。该数据网格存放了要显示的数据。数据网格也可以包含用于图表中标识系列或类别的标签。图表应用程序设
计者在数据网格中插入数据或从报表或矩阵中输入数据。
2.安装MSChart:须装了Microsoft .NET Framework 3.5 SP1以后才能装MSChart
装好后,会发现一个目录,打开vs2008或vs2010,打开某个web页面的设计页面,在工具栏中添加选项卡命名为图标工作,或者在现有的选项卡中右击选择“添加项”,导航到C:\Program Files\Microsoft Chart Controls\Assemblies,选择System.Web.DataVisualization.dll,将图标工具添加到选项卡中,方便以后拖拽使用。
1. MSChart 图表类型
4.一些属性
ChartAreas:增加多个绘图区域,每个绘图区域包含独立的图表组、数据源,用于多个图表类型在一个绘图区不兼容时。
AlignmentOrientation:图表区对齐方向,定义两个绘图区域间的对齐方式。
AlignmentStyle:图表区对齐类型,定义图表间用以对其的元素。
AlignWithChartArea:参照对齐的绘图区名称。
InnerPlotPosition:图表在绘图区内的位置属性。
Auto:是否自动对齐。
Height:图表在绘图区内的高度(百分比,取值在0-100)
Width:图表在绘图区内的宽度(百分比,取值在0-100)
X,Y:图表在绘图区内左上角坐标
Position:绘图区位置属性,同InnerPlotPosition。
Name:绘图区名称。
Axis:坐标轴集合
Title:坐标轴标题
TitleAlignment:坐标轴标题对齐方式
Interval:轴刻度间隔大小
IntervalOffset:轴刻度偏移量大小
MinorGrid:次要辅助线
MinorTickMark:次要刻度线
MajorGrid:主要辅助线
MajorTickMark:主要刻度线
DataSourceID:MSChart的数据源。
Legends:图例说明。
Palette:图表外观定义。
Series:最重要的属性,图表集合,就是最终看到的饼图、柱状图、线图、点图等构成的合;可以将多种相互兼容的类型放在一个绘图区域内,形成复合图。
IsValueShownAsLabel:是否显示数据点标签,如果为true,在图表中显示每一个数据值
Label:数据点标签文本
LabelFormat:数据点标签文本格式
LabelAngle:标签字体角度
Name:图表名称
Points:数据点集合
XValueType:横坐标轴类型
YValueType:纵坐标轴类型
XValueMember:横坐标绑定的数据源(如果数据源为Table,则填写横坐标要显示的字段名称)
YValueMembers:纵坐标绑定的数据源(如果数据源为Table,则填写纵坐标要显示的字段名称,纵坐标可以有两个)
ChartArea:图表所属的绘图区域名称
ChartType:图表类型(柱形、饼形、线形、点形等)
Legend:图表使用的图例名称
Titles:标题集合。
width:MSChart的宽度。
height:MSChart的高度。
二、 MSChart实际演练
具体的实例可以参考附件的具体Demo,这个Demo还是比较完整的。
好了,现在来看具体的需求。如下图是具体的算法,
这个是关键的sql语句,如有不明白的地方可以留言或者发邮件给我
string cmdText = "select CONVERT(varchar(12), a.gettingtime, 111) as 'myTime'," +
"a.dataid,(4*(b.t_max-b.t_min)-ABS(2*AVG(a.torque)-(b.t_max+b.t_min)))/(24*STDEV(a.torque)) as 'cpk' " +
"from boltdata a,BoltInfo b where a.dataid = b.boltid and a.dataid='" + dataid + "' and a.ok='1' and a.gettingtime BETWEEN '" + time1.Text + "' AND '" + time2.Text + "' " +
"group by CONVERT(varchar(12), a.gettingtime, 111), a.dataid,b.t_max,b.t_min,b.t_stand";
PS:由于时间原因,文章写的比较匆忙,望见谅。
附件:
、、
(另附链接)