教学数据管理系统
大二刚学java做的课程作业
题目
教师教学过程中会取得各种数据,这些数据有可能是不同类型的文件或格式。教学活动数据文件为Excel文件或txt格式数据文件,内容如:学生学号、姓名、班号、作业分数。
实现如下功能:
1、导入不同的数据文件,对数据处理后生成一个统一的Excel格式成绩文件。该文件中包含学号、姓名、考勤、作业、验收成绩、报告成绩、总成绩。
2、尝试分析并展示单项成绩。比如,显示每个学生的验收成绩,表示其动手能力。可使用Swing绘图或ECharts。
3、数据分析。以图形化的方式显示每个学生最终成绩与其学习活动的关联。
概要设计
首先要定义一个student的类,包含的属性有学号,姓名,还有各类成绩。类student中包含参数的构造方法,方法包括构造方法,get方法,set方法,toString方法,重写toString方法输出所有成员变量值。
在main中使用ArrayList存储学生数据,首先在main函数中声明并实例化ArrayList集合,通过从文件中读数据的函数将数据写入集合中,再将集合中的数据写入另一个excel文本文件中。数据分析通过输入的学生姓名,遍历Arraylist集合找到这个学生,生成数据分析图。
模块设计
-
导入excel类型的文件
这个函数返回的是一个list集合。
使用workbook进行文件的读取,首先获取excel对象,获取第一个选项卡对象,遍历选项卡,,创建一个Student类的对象,将第二行以后的数据放入集合中,最后返回导入的数据集合。 -
导入txt类型的文件
这个函数的返回值是一个list集合。
从txt文本文件中读取数据需要用到FileReader类,还要有一个BufferedReader的缓冲器类,创建文件的输入输出流并放入缓冲流中,有readline()函数,对换行符进行鉴别,一行一行的读取输入输出流中的内容,控制循环读取数据到集合中,最后返回一个list集合。 -
导出excel文件
使用workbook进行文件的创建,首先创建一个excel的文件对象,然后设置第一行的内容,写入label中再添加到选项卡中,遍历集合并添加数据到行。每一行对应一个对象。 -
生成圆饼图
绘图功能我使用的是JFreeChart绘制饼图,首先创建数据集对象,将成绩写入dataset中,成绩是String类型的,所以还要将String类型的数据转换为int类型的数据,然后创建一个JfreeChart,图标的标题为学生的名字,dataset为上面生成的数据。然后通过JFreeChart对象拿到PiePlot对象,并进行一些相应的设置,最后返回chart。 -
生成柱状图
这个和生成圆饼图的大致流程一样,不同的只是函数的调用和设置的不同。
最后还有一个输出图表的函数,上面两个函数只是创建图表,还需要一个输出图表到Swing窗口的函数,通过传入的chart参数输出这个图表。
代码设计
Student.java
class Student{
public String name;
public String id;
public String kaoqin;
public String zuoye;
public String yanshou;
public String baogao;
public String zongcj;
public Student() {
}
public Student(String name,String id,String kaoqin,String zuoye,String yanshou,String baogao,String zongcj)
{
this.name=name;
this.id=id;
this.kaoqin=kaoqin;
this.zuoye=zuoye;
this.yanshou=yanshou;
this.baogao=baogao;
this.zongcj=zongcj;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getID() {
return id;
}
public void setID(String id) {
this.id = id;
}
public String getKaoQin() {
return kaoqin;
}
public void setKaoQin(String kaoqin) {
this.kaoqin = kaoqin;
}
public String getZuoYe() {
return zuoye;
}
public void setZuoYe(String zuoye) {
this.zuoye = zuoye;
}
public String getYanShou() {
return yanshou;
}
public void setYanShou(String yanshou) {
this.yanshou = yanshou;
}
public String getBaoGao() {
return baogao;
}
public void setBaoGao(String baogao) {
this.baogao = baogao;
}
public String getZongCJ() {
return zongcj;
}
public void setZongCJ(String zongcj) {
this.zongcj = zongcj;
}
public String toString() {
return "Student [name=" + name
+ ", id=" + id
+ ", kaoqin=" + kaoqin
+ ", zuoye=" + zuoye
+ ", yanshou=" + yanshou
+ ", baogao=" + baogao
+ ", zongcj=" + zongcj + "]";
}
}
ExcelUtil.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.awt.Font;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import jxl.*;
import jxl.write.*;
public class ExcelUtil{
public static List<Student> txtImport(List<Student> list,String path){
try {
File file=new File(path);
BufferedReader in = new BufferedReader(new FileReader(file)); //读文件
String line;
while ((line = in.readLine()) != null)
{
// 分割字符串,分割后的元素存储到数组中
String[] strArray = line.split(" ");
Student stu = new Student();
stu.setName(strArray[0]);
stu.setID(strArray[1]);
stu.setKaoQin(strArray[2]);
stu.setZuoYe(strArray[3]);
stu.setYanShou(strArray[4]);
stu.setBaoGao(strArray[5]);
stu.setZongCJ(strArray[6]);
list.add(stu);
}
in.close();
}catch(Exception e) {
e.printStackTrace();
}
return list;
}
public static List<Student> excelImport(List<Student> list,String path) {
Workbook book = null;
try {
// 获取Excel对象
book = book.getWorkbook(new File(path));
// 获取Excel第一个选项卡对象
Sheet sheet = book.getSheet(0);
// 遍历选项卡,第一行是表头,所以索引数-1
for (int i = 0; i < sheet.getRows() - 1; i++) {
Student student = new Student();
// 获取第一列第二行单元格对象
Cell cell = sheet.getCell(0, i + 1);
student.setName(cell.getContents());
student.setID(sheet.getCell(1, i + 1).getContents());
student.setKaoQin(sheet.getCell(2, i + 1).getContents());
student.setZuoYe(sheet.getCell(3, i + 1).getContents());
student.setYanShou(sheet.getCell(4, i + 1).getContents());
student.setBaoGao(sheet.getCell(5, i + 1).getContents());
student.setZongCJ(sheet.getCell(6, i + 1).getContents());
list.add(student);
}
// 返回导入的数据集合
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭
book.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
public static void excelExport(List<Student> list, String path) {
WritableWorkbook book = null;
try {
// 创建一个Excel文件对象
book = Workbook.createWorkbook(new File(path));
// 创建Excel第一个选项卡对象
WritableSheet sheet = book.createSheet("第一页", 0);
// 设置表头,第一行内容
// Label参数说明:第一个是列,第二个是行,第三个是要写入的数据值,索引值都是从0开始
Label label1 = new Label(0, 0, "姓名");// 对应为第1列第1行的数据
Label label2 = new Label(1, 0, "学号");// 对应为第2列第1行的数据
Label label3 = new Label(2, 0, "考勤");// 对应为第3列第1行的数据
Label label4 = new Label(3, 0, "作业");// 对应为第4列第1行的数据
Label label5 = new Label(4, 0, "验收");
Label label6 = new Label(5, 0, "报告");
Label label7 = new Label(6, 0, "总成绩");
// 添加单元格到选项卡中
sheet.addCell(label1);
sheet.addCell(label2);
sheet.addCell(label3);
sheet.addCell(label4);
sheet.addCell(label5);
sheet.addCell(label6);
sheet.addCell(label7);
// 遍历集合并添加数据到行,每行对应一个对象
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
// 表头占据第一行,所以下面行数是索引值+1
// 跟上面添加表头一样添加单元格数据,这里为了方便直接使用链式编程
sheet.addCell(new Label(0, i + 1, student.getName()));
sheet.addCell(new Label(1, i + 1, student.getID()));
sheet.addCell(new Label(2, i + 1, student.getKaoQin()));
sheet.addCell(new Label(3, i + 1, student.getZuoYe()));
sheet.addCell(new Label(4, i + 1, student.getYanShou())) ;
sheet.addCell(new Label(5, i + 1, student.getBaoGao()));
sheet.addCell(new Label(6, i + 1, student.getZongCJ()));
}
// 写入数据到目标文件
book.write();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭
book.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//圆饼图
public static JFreeChart PieChart(Student student) {
ChartPanel frame1;
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("考勤",Integer.parseInt(student.getKaoQin()));
dataset.setValue("作业",Integer.parseInt(student.getZuoYe()));
dataset.setValue("验收",Integer.parseInt(student.getYanShou()));
dataset.setValue("报告",Integer.parseInt(student.getBaoGao()));
JFreeChart chart = ChartFactory.createPieChart3D(student.getName(),dataset,true,false,false);
//设置百分比
PiePlot pieplot = (PiePlot) chart.getPlot();
DecimalFormat df = new DecimalFormat("0.00%");//获得一个DecimalFormat对象,主要是设置小数问题
NumberFormat nf = NumberFormat.getNumberInstance();//获得一个NumberFormat对象
StandardPieSectionLabelGenerator sp1 = new StandardPieSectionLabelGenerator("{0} {2}", nf, df);//获得StandardPieSectionLabelGenerator对象
pieplot.setLabelGenerator(sp1);//设置饼图显示百分比
//没有数据的时候显示的内容
pieplot.setNoDataMessage("无数据显示");
pieplot.setCircular(false);
pieplot.setLabelGap(0.02D);
pieplot.setIgnoreNullValues(true);//设置不显示空值
pieplot.setIgnoreZeroValues(true);//设置不显示负值
frame1=new ChartPanel (chart,true);
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象
piePlot.setLabelFont(new Font("宋体",Font.BOLD,10));//解决乱码
chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,10));
return chart;
}
//柱状图
public static JFreeChart BarChart(Student student) {
ChartPanel frame1;
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(Integer.parseInt(student.getKaoQin()),"考勤","考勤");
dataset.addValue(Integer.parseInt(student.getZuoYe()),"作业","作业");
dataset.addValue(Integer.parseInt(student.getYanShou()),"验收","验收");
dataset.addValue(Integer.parseInt(student.getBaoGao()),"报告","报告");
dataset.addValue(Integer.parseInt(student.getZongCJ()),"总成绩","总成绩");
JFreeChart chart = ChartFactory.createBarChart3D(
student.getName(), // 图表标题
"单项", // 目录轴的显示标签
"成绩", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
//从这里开始
CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表
domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题
ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
//到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题
frame1=new ChartPanel(chart,true);
return chart;
}
public static void drawToFrame(JFreeChart chart){
//输出图表到Swing Frame
ChartFrame frame = new ChartFrame("学生成绩分析", chart);
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]) {
Scanner sc=new Scanner(System.in); //使用Scanner类定义对象
System.out.println("请选择文件类型:1.txt 2.excel");
int m=sc.nextInt();
List<Student> list=new ArrayList<>();
if(m==1) {
String path = "D:\\xs.txt";
System.out.println("开始导入文件...");
list = txtImport(list,path);
}
if(m==2) {
String path = "D:\\xs.xls";
System.out.println("开始导入文件...");
list = excelImport(list,path);
}
System.out.println("开始导出文件...");
excelExport(list,"D:\\student.xls");
for (Student student : list) {
System.out.println(student);
}
System.out.println("请输入学生姓名");
Scanner input=new Scanner(System.in);
String str1=input.nextLine();
for(int i=0;i<list.size();i++)
{
Student stu=list.get(i);
if(str1.contentEquals(stu.getName())) {
JFreeChart chart1=PieChart(stu);
drawToFrame(chart1);
JFreeChart chart2=BarChart(stu);
drawToFrame(chart2);
}
}
}
}
运行结果
选择导入的文件类型,选择1是导入txt文件,选择2导入excel类型的文件。
导入文件之后就将读到的数据导入另一个excel文件中,之后打印出读到的数据;
输入学生姓名,给出数据分析的圆饼图和柱状图