人员分组.docx
《人员分组.docx》由会员分享,可在线阅读,更多相关《人员分组.docx(17页珍藏版)》请在冰豆网上搜索。
![人员分组.docx](https://file1.bdocx.com/fileroot1/2023-6/23/3b2f1840-7340-413b-9577-5c968c21a7ea/3b2f1840-7340-413b-9577-5c968c21a7ea1.gif)
人员分组
信息与电气工程学院
软件程序设计CDIO三级项目
设计说明书
(2013/2014学年第一学期)
题目:
人员分组生成工具
专业班级:
XXXXXXXXXXXXXXXX
学生姓名:
XXXXXXX
学号:
XXXXXXX
指导教师:
吴开兴、马小进、崔冬
设计周数:
2周
设计成绩:
2014年1月10日
1、项目设计目的
1.1通过本次设计能够较熟练的掌握用C#语言建立窗体,能够独立地调试程序,改正bug。
1.2掌握一个完整的软件设计过程,从设计到软件的发布。
1.3巩固课本所学的知识,掌握C#语言的语法特点,综合运用所学知识来实现特定功能,提高分析和解决问题的能力。
2、项目设计正文
2.1技术要求:
2.1.1支持Excel文件的读写。
2.1.2支持打印功能。
2.1.3能按照一定的规则进行人员分组。
2.2设计内容
要求完成一个人员分组生成工具,可支持从excel文件读入学生信息,然后按照需要的方式对人员进行分组,最后对分组结果以excel表格形式导出。
本程序可实现对人员进行按分组数、按每组人数、按学号顺序和按姓名(首字母的顺序)进行分组。
2.3方案制定
经过查阅资料了解有三种从excel读数据的经典方法:
采用OleDB读取EXCEL文件、应用com组件导入和将EXCEL文件转化成CSV的文件然后用文件流读取。
经分析,选择了第一种方法:
采用OleDB读取EXCEL文件。
首先将excel数据导入到数据集DataSet中,然后再从DataSet导出到EXCEL文件,并且在导出文件的过程中对数据进行分组处理。
2.4OLEDB介绍
OLEDB(ObjectLinkingandEmbedding,Database,(又称为OLEDB或OLE-DB),一个基于COM的数据存储对象,能提供对所有类型的数据的操作,甚至能在离线的情况下存取数据(比方说,你使用的是你的便携机,你可以毫不费力地看到最后一次数据同步时的数据映像)。
OLEDB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。
使用OLEDB的应用程序会用到如下的请求序列:
初始化OLE、连接到数据源、发出命令、处理结果、释放数据源对象并停止初始化OLE。
OLEB的存在为用户提供了一种统一的方法来访问所有不同种类的数据源。
OLEDB可以在不同的数据源中进行转换。
利用OLEDB,客户端的开发人员在进行数据访问时只需把精力集中在很少的一些细节上,而不必弄懂大量不同数据库的访问协议。
OLEDB是一套通过COM接口访问数据的ActiveX接口。
这个OLEDB接口相当通用,足以提供一种访问数据的统一手段,而不管存储数据所使用的方法如何。
同时,OLEDB还允许开发人员继续利用基础数据库技术的优点,而不必为了利用这些优点而把数据移出来。
使用ATL、使用OLEDB数据使用程序。
由于直接使用OLEDB的对象和接口设计数据库应用程序需要书写大量的代码。
为了简化程序设计,VisualC++提供了ATL模板用于设计OLEDB数据应用程序和数据提供程序。
利用ATL模板可以很容易地将OLEDB与MFC结合起来,使数据库的参数查询等复杂的编程得到简化。
MFC提供的数据库类使OLEDB的编程更具有面向对象的特性。
ViualC++所提供用于OLEDB的ATL模板可分为数据提供程序的模板和数据使用程序的模板。
2.5总体设计
本软件主要的功能模块如下:
图2-1软件主要功能模块
从数据导入功能开始,当单击“添加”键时,弹出路径选择对话框,从相应路径找到要操作的表来导入。
导入之后,立刻弹出一个窗体来预览所导入的原始数。
然后选择分组方式(默认为按分组数分组),接着在对应文本框里输入想要的分组数或每组人数。
最后执行数据导出功能。
单击“导出分组”按键,启动计算机的microsoftoffice2007以表格形式来显示导出结果,手动对结果进行保存。
对于按分组数、按学号和按姓名分组默认要求用户输入分组数,若选择按每组人数进行分组,则要求用户输入每组人数。
2.6系统流程图
N
Y
Y
N
图2-2程序流程图
3、系统各功能实现部分
3.1数据导入方法
将excel中数据导入到DataSet中,并按照分组方式对数据进行预处理。
实现代码如下:
//将excel中数据导入到DataSet中
publicDataSetExcelToDS(stringPath)
{
stringstrConn="Provider=Microsoft.Ace.OLEDB.12.0;"+"DataSource="+Path+";"+"ExtendedProperties=Excel8.0;";
OleDbConnectionconn=newOleDbConnection(strConn);
conn.Open();
stringstrExcel="";
OleDbDataAdaptermyCommand=null;
DataSetds=null;
strExcel="select*from[sheet1$]";
switch(comboBox1.Text)//按条件将数据导入
{
case"按学号":
{
strExcel="select*from[sheet1$]orderby学号";
}
break;
case"组数":
case"按每组人数":
{
strExcel="select*from[sheet1$]";
}
break;
case"按姓名":
{
strExcel="select*from[sheet1$]orderby姓名";
}
break;
}
myCommand=newOleDbDataAdapter(strExcel,strConn);
ds=newDataSet();
myCommand.Fill(ds);
returnds;
}
3.2数据导出并实现分组方法
//数据集数据导出到excel
publicboolDataSetToExcel(DataSetdataSet,boolisShowExcle)
{
System.Data.DataTabledataTable=dataSet.Tables[0];
System.Data.DataTablenewdt=dataTable.Clone();
foreach(DataRowrowindataTable.Rows)
{
DataRowdr=newdt.NewRow();
dr.ItemArray=row.ItemArray;
System.Threading.Thread.Sleep(50);
Randomrandom=newRandom();
newdt.Rows.InsertAt(dr,random.Next(newdt.Rows.Count));//产生随机数并填充DataTable
}
introwNumber=newdt.Rows.Count;
intcolumnNumber=newdt.Columns.Count;
if(rowNumber==0)
{
MessageBox.Show("没有任何数据可以导入到Excel文件!
");
returnfalse;
}
//建立Excel对象
Microsoft.Office.Interop.Excel.Applicationexcel=newMicrosoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
excel.Cells[1,1]="分组";//添加表头
excel.Cells[1,2]="学号";
excel.Cells[1,3]="姓名";
excel.Cells[1,4]="性别";
excel.Cells[1,5]="班级";
stringx;
x=comboBox1.Text;
inte=Int32.Parse(txtGroup.Text);
intf=newdt.Rows.Count/e;
inth=0;
inti=newdt.Rows.Count%e;
intk=1;
if(e>newdt.Rows.Count)
{
MessageBox.Show("分组数或人数大于总人数","出错了",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
else
{
//填充数据
for(intc=0;c{
for(intj=1;j{
excel.Cells[c+2,j+1]=newdt.Rows[c].ItemArray[j];
}
}
switch(x)//按分组条件实现相应分组
{
case"按组数":
{
for(intl=2;l<=i*(f+1);l+=f+1)
{
k+=f+1;
h++;
excel.Cells[l,1]="第"+h+"组";
}
for(intg=k+1;g<=newdt.Rows.Count;g+=f)
{
h++;
excel.Cells[g,1]="第"+h+"组";
}
}
break;
case"按每组人数":
{
for(intg=k+1;g<=newdt.Rows.Count;g+=e)
{
h++;
excel.Cells[g,1]="第"+h+"组";
}
break;
}
case"按姓名":
case"按学号":
{
for(intc=0;c{
for(intj=1;j{
excel.Cells[c+2,j+1]=dataTable.Rows[c].ItemArray[j];
}
}
for(intl=2;l<=i*(f+1);l+=f+1)
{
k+=f+1;
h++;
excel.Cells[l,1]="第"+h+"组";
}
for(intg=k+1;g<=dataTable.Rows.Count;g+=f)
{
h++;
excel.Cells[g,1]="第"+h+"组";
}
}
break;
}
RangeoCells=excel.get_Range("A1",Missing.Value);//修改学号列的列宽
((Range)oCells.Cells[1,2]).EntireColumn.ColumnWidth=10;
excel.Visible=isShowExcle;//是否打开该Excel文件
}
returntrue;
}
3.3“添加”按钮的button1_Click事件
privatevoidbutton1_Click(objectsender,EventArgse)
{
OpenFileDialogopf=newOpenFileDialog();//弹出选择路径对话框
if(opf.ShowDialog()==DialogResult.OK)
{
filepath=opf.FileName;
DataSetds=ExcelToDS(filepath);
MessageShowms=newMessageShow();
ms.WantToDisplayData=ds.Tables[0].DefaultView;
ms.Show();
}
else{
;//空语句
}
3.4“导出分组”按钮的button1_Click事件
privatevoidbutton2_Click(objectsender,EventArgse)
{
if(txtGroup.Text!
="")
{
DataSetds=ExcelToDS(filepath);
DataSetToExcel(ds,true);//导出数据
}
else{
MessageBox.Show("请输入分组数或人数","出错了",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
3.5点击关于作者的“访问”按钮
privatevoidbutton1_Click(objectsender,EventArgse)
{
System.Diagnostics.Process.Start("http:
//www.zhanglei@");
this.Hide();
}
3.6单击关闭按钮设计
privatevoidfrmmain_FormClosing(objectsender,FormClosingEventArgse)
{
DialogResultrst=MessageBox.Show(this,"您真的要退出系统吗?
","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question);//单击关闭按钮弹出提示
switch(rst)
{
caseDialogResult.Yes:
System.Windows.Forms.Application.ExitThread();
System.Windows.Forms.Application.Exit();
break;
caseDialogResult.No:
e.Cancel=true;
break;
}
4、程序执行结果
点击调试之后启动主窗体:
点击添加按钮选择excel文件之后的数据预览窗口:
点击“使用须知”后的使用说明窗口:
点击关于作者后弹出的作者信息:
分组或分组人数没有输入时的错误提示信息:
当输入的分组数大于总人数时:
当单机关闭按钮时:
5、项目设计总结
经过了两周的设计,终于成功完成了自己的软件,并且实现了所要求的功能。
通过这次项目的设计,使我对C#语言的掌握程度更加深刻了。
以前学习的知识都是在理论层面,这是一次很有必要的实践。
也许在理论上觉得自己掌握的还行,但是在实践上,会遇到自己遇想不到的问题,需要自己动手去解决,需要自己查阅各种资料。
这次设计更加巩固了我们的基础知识,为后续的学习奠定了基础。
刚刚接到这个项目的时候,没有一点头绪,想该如何去做,苦苦查了几天的资料,终于有一些了解,然后尝试着去做,一开始就遇到了问题,写了一些代码之后,点击调试之后报错了。
然后根据错误提示修改自己的代码,改了几遍才改正确。
导入表格的时候也出了错误,
调试的时候没有任何错误,但是点击“添加”之后就报错了。
后来发现语句之中对表格的操作出现了错误,导致无法找到excel中的数据。
过了两天左右,实现了文件的导入,又自己查阅资料,学习如何实现数据导出。
经过自己的不断努力终于实现了基本的功能。
后来经过自己的不断钻研,又成功实现了对成员按照姓名、按照学号、按照每组人数进行分组。
又发现自己的代码有些部分做的比较繁琐,又花了一天时间进行了代码优化,还进行了窗体美化。
还进行了安装版和绿色版的发布。
从刚开始的无从入手,到最后完美实现各种功能,是一个很好的锻炼自己的过程。
当程序报错的时候,我们要有能够根据错误提示定位错误并自行改正错误的能力。
还要戒骄戒躁,不能觉得代码很枯燥,对待代码要有耐心,相信自己一定能够改正bug。
其次,作为一个编程人员,需要十分严谨,时刻注意自己的代码,因为一个小小的错误,比如一个标点符号的错误,都可能导致程序不能执行。
还要注意自己代码的简化程度,执行效率等等,因为学习C#不太久,这方面我做得还不算好。
在以后的学习过程中,应该吸取别人代码之中的优秀的地方,把它转化为自己的东西。
理论与实际相结合也是非常重要的,只有理论知识是远远不够的,在实践中可能会遇到各种各样的问题,不多经历就无法感受到这一点。
要在实践中提高自己的动手能力和解决问题的能力,从而学以致用。
总之,以后需要学习的还很多,这只是一个开始,在以后的学习中,应该多多地去练习编程,多多地去调试程序,再接再厉,学好C#语言。
6、参考文献
[1]罗福强,白忠建编著.VisualC#.NET程序设计教程.人民邮电出版社,2009年3月
[2]陈钟,刘强,张高等编.C#编程语言设计与开发.清华大学出版社,2003年9月1日
[3]马俊编著.C#网络应用高级编程.人民邮电出版社,2006年5月
[4]唐政,房大伟等编著.C#项目开发全程实录.北京:
清华大学出版社,2008年6月
项目设计
评语
项目设计
成绩
指导教师
(签字)
年月日