POI之考勤统计

需求分析

我们公司考勤使用指纹打卡,出入公司也需要指纹打卡开门,这样每个人每天打卡记录全在考勤系统里面,这个考勤系统竟然还不能自动识别员工每天的出勤情况,只是把每次打卡记录统计出来。然后月底时由人事、财务筛选做绩效考核和工资核算,先来看看五月份考勤系统统计出来的原始数据:

看到这个表,我也是醉了。公司几十人员工统计出来4828条记录,这样的系统要它何用。现在我用POI写个程序自动筛选出来并导出Excel文件。

设计思路

1.找到每个员工每天的第一条打开记录和最后一条打卡记录,去除中间重复数据。

2.统计到每天只有一次打卡的记录为考勤异常。

3.统计第一次打卡在早上九点半之后的记录为迟到。

4.统计上班不满8小时的记录为早退。

5.统计周六、周日加班日期.

6.统计正常出勤天数。

效果预览

代码实现

1.把考勤系统导出的考勤表放到D:\liuwuchang文件夹里。

2.新建OnePeople.java

package com.zhanyun.cc;

public class OnePeople {

String id;

String name;

String date;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getDate() {

return date;

}

public void setDate(String date) {

this.date = date;

}

@Override

public String toString() {

return "OnePeople [id=" + id + ", name=" + name + ", date=" + date + "]";

}

}

3.新建ManyPeople.java

package com.zhanyun.cc;

import java.util.ArrayList;

public class ManyPeople {

String id;String name;

ArrayListonePeopleList;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public ArrayListgetOnePeopleList() {

return onePeopleList;

}

public void setOnePeopleList(ArrayList onePeopleList) {

this.onePeopleList = onePeopleList;

}

@Override

public String toString() {

return "ManyPeople [id=" + id + ", name=" + name + ", onePeopleList=" + onePeopleList + "]";

}

}

4.新建Result.java

package com.zhanyun.cc;

public class Result {

String id;

String name;

String normalDay;

String lateDay;

String leaveEarly;

String weekDay;

String error;

public Result() {

// TODO Auto-generated constructor stub

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getNormalDay() {

return normalDay;

}

public void setNormalDay(String normalDay) {

this.normalDay = normalDay;

}

public String getLateDay() {

return lateDay;

}

public void setLateDay(String lateDay) {

this.lateDay = lateDay;

}

public String getLeaveEarly() {

return leaveEarly;

}

public void setLeaveEarly(String leaveEarly) {

this.leaveEarly = leaveEarly;

}

public String getWeekDay() {

return weekDay;

}

public void setWeekDay(String weekDay) {

this.weekDay = weekDay;

}

public String getError() {

return error;

}

public void setError(String error) {

this.error = error;

}

@Override

public String toString() {

return "Result [id=" + id + ", name=" + name + ", normalDay=" + normalDay + ", lateDay=" + lateDay

+ ", leaveEarly=" + leaveEarly + ", weekDay=" + weekDay + ", error=" + error + "]";

}

}

5.新建MainActivity.java

package com.zhanyun.cc;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class MainActivity {

String filePath = "D://liuwuchang/考勤表.xls";

InputStream stream;

HSSFWorkbook workbook;

HSSFSheet sheet;

ArrayList resultList;

public MainActivity() {

try {

stream = new FileInputStream(filePath);

workbook = new HSSFWorkbook(stream);// 读取现有的Excel

sheet = workbook.getSheet("Sheet1");// 得到指定名称的Sheet

resultList = new ArrayList<>();

} catch (Exception e) {

e.printStackTrace();

}

}

  /*

   * 读取所有人的考勤记录

   */

  public ArrayList getManyPeopleList() {

    ArrayList manyPeopleList = new ArrayList<>();

    ArrayList onePeopleList = null;

    ManyPeople manyPeople = null;

    String id = null;

    int firstRowNum = sheet.getFirstRowNum();

    int lastRowNum = sheet.getLastRowNum();

    for (int i = firstRowNum; i <= lastRowNum; i++) {

      HSSFRow row = sheet.getRow(i);

      if (id != row.getCell(0).getStringCellValue()) {

        id = row.getCell(0).getStringCellValue();

        onePeopleList = new ArrayList<>();

        manyPeople = new ManyPeople();

        manyPeople.setId(row.getCell(0).getStringCellValue());

        manyPeople.setName(row.getCell(1).getStringCellValue());

        manyPeople.setOnePeopleList(onePeopleList);

        manyPeopleList.add(manyPeople);

      }

      OnePeople onePeople = new OnePeople();

      onePeople.setId(row.getCell(0).getStringCellValue());

      onePeople.setName(row.getCell(1).getStringCellValue());

      onePeople.setDate(row.getCell(2).getStringCellValue());

      onePeopleList.add(onePeople);

    }

    return manyPeopleList;

  }

  /*

   * 读取所有人有效的考勤记录

   */

  public void getValidManyPeopleList(String id,String name,ArrayList list) {

    Result result = new Result();

    int normalDay=0;

    String lateDay="";

    String leaveEarly="";

    String weekDay="";

    String error="";

    ArrayList firstOnePeopleList = new ArrayList<>();

    ArrayList lastOnePeopleList = new ArrayList<>();

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm");

    Calendar calendar = Calendar.getInstance();

    int firstDay = 0;

    int lastDay = 0;

    for (int i = 0; i < list.size(); i++) {

      try {

        Date date = formatter.parse(list.get(i).getDate());

        calendar.setTime(date);

        if (firstDay != calendar.get(Calendar.DAY_OF_MONTH)) {

          firstDay = calendar.get(Calendar.DAY_OF_MONTH);

          firstOnePeopleList.add(date);

        }

        // System.out.println(calendar.get(Calendar.DAY_OF_MONTH));

      } catch (ParseException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }

    }

    for (int i = list.size() - 1; i >= 0; i--) {

      try {

        Date date = formatter.parse(list.get(i).getDate());

        calendar.setTime(date);

        if (lastDay != calendar.get(Calendar.DAY_OF_MONTH)) {

          lastDay = calendar.get(Calendar.DAY_OF_MONTH);

          lastOnePeopleList.add(date);

        }

      } catch (ParseException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }

    }

    ArrayList arrayList = new ArrayList<>();

    for (int i = lastOnePeopleList.size() - 1; i >= 0; i--) {

      arrayList.add(lastOnePeopleList.get(i));

    }

    lastOnePeopleList = arrayList;

    int len = firstOnePeopleList.size();

    for (int i = 0; i < len; i++) {

      calendar.setTime(firstOnePeopleList.get(i));

      int month=calendar.get(Calendar.MONTH)+1;

      int day=calendar.get(Calendar.DAY_OF_MONTH);

      String week = getWeekOfDate(firstOnePeopleList.get(i));

      long firstTime = firstOnePeopleList.get(i).getTime();

      long lastTime = lastOnePeopleList.get(i).getTime();

      int firstHours = firstOnePeopleList.get(i).getHours();

      int firstMinutes = firstOnePeopleList.get(i).getMinutes();

      int lastHours = lastOnePeopleList.get(i).getHours();

      int lastMinutes = lastOnePeopleList.get(i).getMinutes();

      if (firstTime != lastTime) {

        if (week != "星期日" && week != "星期六") {

          if (firstHours < 9 || (firstHours == 9 && firstMinutes <= 30)) {

            long diff = (lastTime - firstTime) / (1000 * 60);

            if (diff >= (9 * 60) && (lastHours > 17 || (lastHours == 17 && lastMinutes >= 30))) {

//              System.out.println("正常上班");

              normalDay++;

            } else {

//              System.out.println("早退");

              leaveEarly=leaveEarly+month+"月"+day+"日"+lastHours+":"+lastMinutes+"  ";

            }

          } else {

//            System.out.println("迟到");

            lateDay=lateDay+month+"月"+day+"日"+firstHours+":"+firstMinutes+"  ";

          }

        } else {

//          System.out.println("周末加班");

          weekDay=weekDay+month+"月"+day+"日  ";

        }

      } else {

        // System.out.println(calendar.get(Calendar.DAY_OF_MONTH));

//        System.out.println("考勤异常");

        error=error+month+"月"+day+"日  "+firstHours+":"+firstMinutes+"  ";

      }

    }


    result.setId(id);

    result.setName(name);

    result.setNormalDay(normalDay+"");

    result.setLateDay(lateDay);

    result.setLeaveEarly(leaveEarly);

    result.setWeekDay(weekDay);

    result.setError(error);

    resultList.add(result);

  }

  /**

   * * 获取指定日期是星期几 参数为null时表示获取当前日期是星期几

   *

   * @param date

   * @return

   */

  public String getWeekOfDate(Date date) {

    String[] weekOfDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };

    Calendar calendar = Calendar.getInstance();

    if (date != null) {

      calendar.setTime(date);

    }

    int w = calendar.get(Calendar.DAY_OF_WEEK) - 1;

    if (w < 0) {

      w = 0;

    }

    return weekOfDays[w];

  }

  public static void main(String[] args) {

    MainActivity mainActivity = new MainActivity();

    ArrayList manyPeopleList = mainActivity.getManyPeopleList();

    HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)

    HSSFSheet sheet = workbook.createSheet("Sheet1");// 创建工作表(Sheet)

     for (int i = 0; i < manyPeopleList.size(); i++) {

       mainActivity.getValidManyPeopleList(manyPeopleList.get(i).getId(),

            manyPeopleList.get(i).getName(),

            manyPeopleList.get(i).getOnePeopleList());

     }

    for (int i = 0; i < mainActivity.resultList.size(); i++) {

      HSSFRow row= sheet.createRow(i);

      HSSFCell cell_0 = row.createCell(0);

      HSSFCell cell_1 = row.createCell(1);

      HSSFCell cell_2 = row.createCell(2);

      HSSFCell cell_3 = row.createCell(3);

      HSSFCell cell_4 = row.createCell(4);

      HSSFCell cell_5 = row.createCell(5);

      HSSFCell cell_6 = row.createCell(6);

      cell_0.setCellValue(mainActivity.resultList.get(i).getId());

      cell_1.setCellValue(mainActivity.resultList.get(i).getName());

      cell_2.setCellValue(mainActivity.resultList.get(i).getNormalDay());

      cell_3.setCellValue(mainActivity.resultList.get(i).getLateDay());

      cell_4.setCellValue(mainActivity.resultList.get(i).getLeaveEarly());

      cell_5.setCellValue(mainActivity.resultList.get(i).getWeekDay());

      cell_6.setCellValue(mainActivity.resultList.get(i).getError());



      System.out.println(mainActivity.resultList.get(i).toString());

    }


    String filePath = "D:\\统计考勤表.xls";// 文件路径

    FileOutputStream out;

    try {

      out = new FileOutputStream(filePath);

      workbook.write(out);// 保存Excel文件

      out.close();// 关闭文件流

      System.out.println("OK!");

    } catch (Exception e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

    }

  }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,644评论 18 399
  • 先Activity的抽象类 BaseActivity [java]view plaincopy /** *Acti...
    Zaker2Magic阅读 980评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,672评论 18 139
  • 初入简书,对无戒老师的365训练营也有了一些了解。训练营坚持每日一更千字以上,并且还会有各种老师的精品课程和文评。...
    细雨斜风冷画桥阅读 517评论 26 11
  • 苹果公司规定6.1号之后,所有上线的应用需要支持IPv6,于是公司就让我来适配以前的一个老项目,这个项目最新版本是...
    小霍同学阅读 2,224评论 7 4