大二java课程作业——教学数据管理系统

教学数据管理系统
大二刚学java做的课程作业

题目

教师教学过程中会取得各种数据,这些数据有可能是不同类型的文件或格式。教学活动数据文件为Excel文件或txt格式数据文件,内容如:学生学号、姓名、班号、作业分数。
实现如下功能:
1、导入不同的数据文件,对数据处理后生成一个统一的Excel格式成绩文件。该文件中包含学号、姓名、考勤、作业、验收成绩、报告成绩、总成绩。
2、尝试分析并展示单项成绩。比如,显示每个学生的验收成绩,表示其动手能力。可使用Swing绘图或ECharts。
3、数据分析。以图形化的方式显示每个学生最终成绩与其学习活动的关联。

概要设计

首先要定义一个student的类,包含的属性有学号,姓名,还有各类成绩。类student中包含参数的构造方法,方法包括构造方法,get方法,set方法,toString方法,重写toString方法输出所有成员变量值。
在main中使用ArrayList存储学生数据,首先在main函数中声明并实例化ArrayList集合,通过从文件中读数据的函数将数据写入集合中,再将集合中的数据写入另一个excel文本文件中。数据分析通过输入的学生姓名,遍历Arraylist集合找到这个学生,生成数据分析图。在这里插入图片描述

模块设计

  1. 导入excel类型的文件
    这个函数返回的是一个list集合。
    使用workbook进行文件的读取,首先获取excel对象,获取第一个选项卡对象,遍历选项卡,,创建一个Student类的对象,将第二行以后的数据放入集合中,最后返回导入的数据集合。

  2. 导入txt类型的文件
    这个函数的返回值是一个list集合。
    从txt文本文件中读取数据需要用到FileReader类,还要有一个BufferedReader的缓冲器类,创建文件的输入输出流并放入缓冲流中,有readline()函数,对换行符进行鉴别,一行一行的读取输入输出流中的内容,控制循环读取数据到集合中,最后返回一个list集合。

  3. 导出excel文件
    使用workbook进行文件的创建,首先创建一个excel的文件对象,然后设置第一行的内容,写入label中再添加到选项卡中,遍历集合并添加数据到行。每一行对应一个对象。

  4. 生成圆饼图
    绘图功能我使用的是JFreeChart绘制饼图,首先创建数据集对象,将成绩写入dataset中,成绩是String类型的,所以还要将String类型的数据转换为int类型的数据,然后创建一个JfreeChart,图标的标题为学生的名字,dataset为上面生成的数据。然后通过JFreeChart对象拿到PiePlot对象,并进行一些相应的设置,最后返回chart。

  5. 生成柱状图
    这个和生成圆饼图的大致流程一样,不同的只是函数的调用和设置的不同。
    最后还有一个输出图表的函数,上面两个函数只是创建图表,还需要一个输出图表到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文件中,之后打印出读到的数据;
输入学生姓名,给出数据分析的圆饼图和柱状图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了2 篇原创文章 · 获赞 0 · 访问量 13

猜你喜欢

转载自blog.csdn.net/yxx_99923/article/details/105183178