首先说一下思路,一开始我们有一个表格,我们需要学会使用poi导入表格查看数据,我们还是使用分层思想,要分成起码的dao,service和controller三层:
然后我们的dao层同样是去获取数据,只不过之前是从数据库中获取数据返回,这里是从Excel中获取数据返回
这里在dao层写一个双层for循环,外面的循环是用来先循环行,然后第二个循环开始循环列,取第一列到最后一列的数据然后通过一个switch case去一个一个给User对象赋值最后返回
po层:
package com.ftz.demo.po;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* @author ${范涛之}
* @Description
* @create 2021-12-11 14:00
*/
@Getter
@Setter
public class User {
/**
* 用户信息
*/
String username;
String post;
/**
* 早中晚工作时间
*/
Date mortimebegin;
Date mortimeoff;
Date afttimebegin;
Date afttimeoff;
Date nigtimebegin;
Date nigtimeoff;
/**
* 早中晚有效工时
*/
double morrealtime;
double aftrealtime;
double nigrealtime;
double totalEffectiveWorkTime;
/**
* 薪资
*/
double wage;
/**
* 薪资排名
*/
String rank;
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("User{");
sb.append("username='").append(username).append('\'');
sb.append(", post='").append(post).append('\'');
sb.append(", mortimebegin=").append(mortimebegin);
sb.append(", mortimeoff=").append(mortimeoff);
sb.append(", afttimebegin=").append(afttimebegin);
sb.append(", afttimeoff=").append(afttimeoff);
sb.append(", nigtimebegin=").append(nigtimebegin);
sb.append(", nigtimeoff=").append(nigtimeoff);
sb.append(", morrealtime=").append(morrealtime);
sb.append(", aftrealtime=").append(aftrealtime);
sb.append(", nigrealtime=").append(nigrealtime);
sb.append(", totalEffectiveWorkTime=").append(totalEffectiveWorkTime);
sb.append(", wage=").append(wage);
sb.append(", rank='").append(rank).append('\'');
sb.append('}');
return sb.toString();
}
}
这里插入一个出现的bug,那就是在实体类中如果涉及到Data类型最好不要用Lombok插件,更不要导入Lombok插件的Data,否则会在后续报错:
dao层获取数据方法的代码:
/**
* 方法 1:
* readExcel 方法,其功能为接受一个传入的字符串(路径),并将其数据存储到 User 数组中,然后将这个数组返回。
*/
public List<User> readExcel(String path) throws Exception{
List<User> users = new ArrayList<User>();
// 获取工作普
XSSFWorkbook workbook = new XSSFWorkbook(path);
// 获取工作表
XSSFSheet sheet = workbook.getSheetAt(0);
// 获取总行
int rowNumber = sheet.getLastRowNum();
System.out.println("总行数是"+rowNumber);
// 获取单元格
for (int i = 2; i <rowNumber; i++) {
XSSFRow row = sheet.getRow(i);
int cellNum = row.getLastCellNum(); //获取总共列
// 获取单元格内容
User user = new User();
for (int j = 0; j <cellNum; j++) {
Cell cell = row.getCell(j);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
switch (j) {
//姓名
case 0:
String name = cell.getStringCellValue();
user.setUsername(name);
break;
//岗位
case 1:
String post = cell.getStringCellValue();
user.setPost(post);
break;
//上午
case 2:
String m1 = cell.getStringCellValue();
Date dateM1 = sdf.parse(m1);
user.setMortimebegin(dateM1);
break;
case 3:
String m2 = cell.getStringCellValue();
Date dateM2 = sdf.parse(m2);
user.setMortimeoff(dateM2);
break;
//下午
case 4:
String a1 = cell.getStringCellValue();
Date dateA1 = sdf.parse(a1);
user.setAfttimebegin(dateA1);
break;
case 5:
String a2 = cell.getStringCellValue();
Date dateA2 = sdf.parse(a2);
user.setAfttimeoff(dateA2);
break;
//晚上
case 6:
String n1 = cell.getStringCellValue();
Date dateN1 = sdf.parse(n1);
user.setNigtimebegin(dateN1);
break;
case 7:
String n2 = cell.getStringCellValue();
Date dateN2 = sdf.parse(n2);
user.setNigtimeoff(dateN2);
break;
default:
break;
}
}
users.add(user);
}
System.out.println(users);
return users;
}
立马在controller层写一个测试:遍历输出:
package com.ftz.demo.controller;
import com.ftz.demo.dao.UserDao;
import com.ftz.demo.po.User;
import java.util.List;
/**
* @author ${范涛之}
* @Description
* @create 2021-12-11 23:14
*/
public class UserController {
public static void main(String[] args) throws Exception {
UserDao userDao = new UserDao();
// 使用增强for循环
List<User> users = userDao.readExcel("D:\\C桌面\\test\\test.xlsx");
for(User attribute : users) {
System.out.println(attribute);
}
}
}
// 使用迭代器
Iterator iterator = users.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
运行结果:
然后就去写第二个dao层的方法:算出每一个成员的有效工作时间:
首先我们要通过 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
将字符转转换为时间:
/**
* 上午的有效时间
*/
//上午上班的几个时间点
long t0830 = sdf.parse("8:30").getTime();
long t0900 = sdf.parse("9:00").getTime();
long t0905 = sdf.parse("9:05").getTime();
long t0910 = sdf.parse("9:10").getTime();
long t0930 = sdf.parse("9:30").getTime();
//上午下班的几个时间点
long t1130 = sdf.parse("11:30").getTime();
long t1150 = sdf.parse("11:50").getTime();
long t1155 = sdf.parse("11:55").getTime();
long t1200 = sdf.parse("12:00").getTime();
long t1230 = sdf.parse("12:30").getTime();
//下午上班的几个时间点
long t1300 = sdf.parse("13:00").getTime();
long t1330 = sdf.parse("13:30").getTime();
long t1335 = sdf.parse("13:35").getTime();
long t1340 = sdf.parse("13:40").getTime();
long t1400 = sdf.parse("14:00").getTime();
//下午下班的几个时间点
long t1800 = sdf.parse("18:00").getTime();
long t1820 = sdf.parse("18:20").getTime();
long t1825 = sdf.parse("18:25").getTime();
long t1830 = sdf.parse("18:30").getTime();
long t1900 = sdf.parse("19:00").getTime();
//晚上加班的几个时间点
long t2000 = sdf.parse("20:00").getTime();
long t2200 = sdf.parse("22:00").getTime();
下面开始写判断语句:
/**
* 方法2:判断用户有效工作时长
* @param users
* @throws ParseException
*/
public void realWorkTime(List<User> users) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
/**
* 上午的有效时间
*/
//上午上班的几个时间点
long t0830 = sdf.parse("8:30").getTime();
long t0900 = sdf.parse("9:00").getTime();
long t0905 = sdf.parse("9:05").getTime();
long t0910 = sdf.parse("9:10").getTime();
long t0930 = sdf.parse("9:30").getTime();
//上午下班的几个时间点
long t1130 = sdf.parse("11:30").getTime();
long t1150 = sdf.parse("11:50").getTime();
long t1155 = sdf.parse("11:55").getTime();
long t1200 = sdf.parse("12:00").getTime();
long t1230 = sdf.parse("12:30").getTime();
//下午上班的几个时间点
long t1300 = sdf.parse("13:00").getTime();
long t1330 = sdf.parse("13:30").getTime();
long t1335 = sdf.parse("13:35").getTime();
long t1340 = sdf.parse("13:40").getTime();
long t1400 = sdf.parse("14:00").getTime();
//下午下班的几个时间点
long t1800 = sdf.parse("18:00").getTime();
long t1820 = sdf.parse("18:20").getTime();
long t1825 = sdf.parse("18:25").getTime();
long t1830 = sdf.parse("18:30").getTime();
long t1900 = sdf.parse("19:00").getTime();
//晚上加班的几个时间点
long t2000 = sdf.parse("20:00").getTime();
long t2200 = sdf.parse("22:00").getTime();
for (User user :users){
long morefftime = 0; //早上额外工作的时间
long atfefftime = 0; //下午额外工作的时间
long nigefftime = 0; //晚上额外工作的时间
long mtime1 = user.getMortimebegin().getTime(); //员工早上到达公司的时间
long mtime2 = user.getMortimeoff().getTime(); //员工早上离开公司的时间
long atime1 = user.getAfttimebegin().getTime(); //员工下午到达公司的时间
long atime2 = user.getAfttimeoff().getTime(); //员工下午离开公司的时间
long ntime1 = user.getNigtimebegin().getTime(); //员工晚上到达公司的时间
long ntime2 = user.getNigtimeoff().getTime(); //员工晚上离开公司的时间
/**
* 上午打卡时间
*/
if (t0830 - mtime1>=0){ // 员工在8:30之前来到公司
morefftime = 30*60*1000;
}else if (t0900-mtime1>=0 || t0830-mtime1<=0){ //员工在8:30-9:00之间来到公司
morefftime = mtime1*60*1000;
}else if (t0905-mtime1>=0 || t0900-mtime1<=0){ //员工在9:00-9:05来到公司
morefftime = 0;
}else if (t0910-mtime1>=0 || t0905-mtime1<=0){ //员工在9:05-9:10来到公司
morefftime = -60*60*1000;
}else if (t0930-mtime1>=0 || t0910-mtime1<=0){ //员工在9:10-9:30来到公司
morefftime = -60*60*1000*2;
}else if (t0930-mtime1<=0){ //员工在9:30以后来到公司
morefftime = -60*60*1000*4;
}else if (mtime2-t1130<0){ //员工在11:30之前离开公司
morefftime = -60*60*1000*4;
}else if (t1130-mtime2<0 || t1150-mtime2>0){ //员工在11:30-11:50离开公司
morefftime = -60*60*1000*4;
}else if (t1150-mtime2<0 || t1155-mtime2>0){ //员工在11:50-11:55离开公司
morefftime = -60*60*1000;
}else if (t1155-mtime2<0 || t1200-mtime2>0){ //员工在11:55-12:00离开公司
morefftime = 0;
}else if (t1200-mtime2<0 || t1230-mtime2>0){ //员工在12:00-12:30离开公司
morefftime = (mtime2-t1200)*60*1000;
}else if (t1230-mtime2<0){ //员工在12:30以后离开公司
morefftime = 30*60*1000;
}
/**
* 下午打卡时间
*/
else if (t1300 - atime1>=0){ // 员工在13:00之前来到公司
morefftime = 30*60*1000;
}else if (t1300-atime1>=0 || t1330-atime1<=0){ //员工在13:00-13:30之间来到公司
morefftime = mtime1*60*1000;
}else if (t1330-atime1>=0 || t1335-atime1<=0){ //员工在13:30-13:35来到公司
morefftime = 0;
}else if (t1335-atime1>=0 || t1340-atime1<=0){ //员工在13:35-13:40来到公司
morefftime = -60*60*1000;
}else if (t1340-atime1>=0 || t1400-atime1<=0){ //员工在13:40-14:00来到公司
morefftime = -60*60*1000*2;
}else if (t1400-atime1<=0){ //员工在14:00以后来到公司
morefftime = -60*60*1000*4;
}else if (atime2-t1800<0){ //员工在18:00之前离开公司
morefftime = -60*60*1000*4;
}else if (t1800-atime2<0 || t1820-atime2>0){ //员工在18:00-18:20离开公司
morefftime = -60*60*1000*4;
}else if (t1820-atime2<0 || t1825-atime2>0){ //员工在18:20-18:25离开公司
morefftime = -60*60*1000;
}else if (t1825-atime2<0 || t1830-atime2>0){ //员工在18:25-18:30离开公司
morefftime = 0;
}else if (t1830-atime2<0 || t1900-atime2>0){ //员工在18:30-19:00离开公司
morefftime = (atime2-t1200)*60*1000;
}else if (t1900-atime2<0){ //员工在19:00以后离开公司
morefftime = 30*60*1000;
}
}
}
未完…
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81023.html