写的一个考勤统计 有个逻辑的小问题 求大牛帮着看看

m11418166 2017-12-06 11:42:56

import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class daochudaoexcel {
public static void main(String[] args) throws BiffException, IOException, ParseException {
String fileName = "D://Io//jisuan.xls"; // Excel文件所在路径
File file = new File(fileName); // 创建文件对象
Workbook wb = Workbook.getWorkbook(file); // 从文件流中获取Excel工作区对象(WorkBook)
Sheet sheet = wb.getSheet(0); // 从工作区中取得页(Sheet)

int n =0;
int j =0;
int f = 0;

Date max = null;
String Stringmax = null;
String Stringmin = null;
String zgs = "总公司";

DateFormat df = new SimpleDateFormat("HH:mm:ss");
//规定早上最晚打卡时间
Date time = df.parse("10:00:00");


while(n<sheet.getRows()){
//如果是总公司
if(sheet.getCell(0,n).getContents().equals(zgs)){
//如果姓名相等
if(sheet.getCell(1,n).getContents().equals(sheet.getCell(1,n+1).getContents())){
//如果日期相等
if(sheet.getCell(2,n).getContents().equals(sheet.getCell(2,n+1).getContents())){
//如果第n个时间小于n+1,那么将max等于n+1
if(df.parse(sheet.getCell(3,n).getContents()).getTime()<df.parse(sheet.getCell(3,n+1).getContents()).getTime() ){
max=df.parse(sheet.getCell(3,n+1).getContents());
//将max转成String
Stringmax = sheet.getCell(3,n+1).getContents();
}
}else {
//如果日期不相等那么下个日期的第一个打卡时间 就是min
Date min= df.parse(sheet.getCell(3,n+1).getContents());
//将min转为String类型
Stringmin = sheet.getCell(3,n+1).getContents();
//如果最早打卡时间大于规定早上最晚打卡时间 那么则判定为迟到
if(min.getTime()>time.getTime()){
System.err.print("迟到");
//如果上班时间大于小于八个小时 则说明早退
}else if((max.getTime()-min.getTime())/3600000<8){
System.err.print("早退");
}
//输出员工上班下班时间 和上班多少小时
System.out.println(sheet.getCell(0,n).getContents()+"员工:" +sheet.getCell(1,n).getContents()+sheet.getCell(2,n+1).getContents() + " "+ "上班时间:" + Stringmin + " " + "下班时间" + Stringmax + "上班了" + " " +(max.getTime()-min.getTime())/3600000 + "个小时" );
}
}
}
n++;
}
}
}





需求是输出这个员工的上班时间、下班时间、工作时常、是否迟到或者早退
我的逻辑是遍历判断第一行公司是否相等、第二行姓名是否相等 直到第三行日期 是否相等 再用最大的时间替换掉max。
因为这个表的打卡时间是从小到大排列的,所以只要日期不相等了,那么下一个日期的第一个打卡时间就是最早的上班时间,
把这个值规定为min 然后再计算是否迟到 但是第一天的最早打卡时间 因为没有上一天 所以没法获取到 请问这个怎么解决啊

小弟新手 请大牛帮忙解答一下 谢谢
...全文
455 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
m11418166 2017-12-11
  • 打赏
  • 举报
回复
引用 8 楼 mymy1026 的回复:
这代码真没法看啊,类名大写,嵌套不要太深,缩进保持2或4个空格,无意义的注释太多了
谢谢了指点了,我新手,代码还不是很规范 都是按照自己的逻辑自己写的, 上一层有优化代码了 没那么多嵌套了 , 但是让我写还是直接写不出简单的代码,是因为写的还是太少了吗
  • 打赏
  • 举报
回复
这代码真没法看啊,类名大写,嵌套不要太深,缩进保持2或4个空格,无意义的注释太多了
AlbertLiangzt 2017-12-07
  • 打赏
  • 举报
回复
引用 6 楼 m11418166 的回复:
[quote=引用 5 楼 AlbertLiangzt 的回复:] [quote=引用 4 楼 m11418166 的回复:] [quote=引用 3 楼 AlbertLiangzt 的回复:] [quote=引用 2 楼 m11418166 的回复:] [quote=引用 1 楼 AlbertLiangzt 的回复:] 插入数据的时候可以判断是否为空,如果为空,就是第一天上班时间,不为空,就比较日期是否相等
这样是可以但是根据我这个 max是可以算出来的 就是10月27号的上班时间是对应的 但是下班时间确实26号的 因为第一个跳过了 但是26号的max没跳过这个怎么办啊 是不是我这个逻辑有问题 能帮我看看吗 多谢了 我是新手 水平不怎么高 [/quote] 没看到先在的代码,不好说,但是按照你之前的代码来说是没有问题的,只是加了一个判断,你可以debug一下你的n值,是不是增加了1[/quote] 我的意思是我这个代码 执行的输出都是在else中 然后if中的max一直在遍历 n一直在加1 所以第一次输出的时候 n是等于6的 因为max遍历了五遍 感觉这个逻辑有问题啊[/quote] 这样没法说啊,贴代码吧[/quote]
package com.haxk.fangfa;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class zijixiedefangfa {
	public static void main(String[] args) throws BiffException, IOException, ParseException {
		String fileName = "D://Io//kaoqin.xls"; // Excel文件所在路径  
	    File file = new File(fileName); // 创建文件对象  
	    Workbook wb = Workbook.getWorkbook(file); // 从文件流中获取Excel工作区对象(WorkBook)  
	    Sheet sheet = wb.getSheet(0); // 从工作区中取得页(Sheet)
	    
	    int n =0;
	    Date min = null;
	    
	    String firm = ""; //定义公司
	    String name = ""; //定义姓名
	    String day = ""; //定义日期
	    String time_start = ""; //定义最早时间
	    String time_end = "";  //定义最晚时间
	
	    List shuju = new ArrayList();   //定义总的传入集合
	    List bumen = new ArrayList();  //部门
	    List xingming = new ArrayList();   //姓名
	    List date = new ArrayList();   //日期
	    List earlyTime = new ArrayList();  //上班时间
	    List endTime = new ArrayList<Date>();    //下班时间
	    List workTime = new ArrayList();  //上班时间
	    List chidao  = new ArrayList();  //迟到
	    List zaotui  = new ArrayList();   //早退
	    
	    //最晚上班时间
	    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
	    Date biaozhun  = df.parse("10:00:00");

	while(n<sheet.getRows()){
	    //这一天的最早上班时间
    	firm = sheet.getCell(0,shuju.size()).getContents();
    	name = sheet.getCell(1,shuju.size()).getContents();
    	day = sheet.getCell(2,shuju.size()).getContents();
    	time_start = sheet.getCell(3,shuju.size()).getContents();
    				
    	bumen.add(sheet.getCell(0,shuju.size()).getContents());
    	xingming.add(sheet.getCell(1,shuju.size()).getContents());
    	date.add(sheet.getCell(2,shuju.size()).getContents());
    	earlyTime.add(sheet.getCell(3,shuju.size()).getContents());
    	//判断是否迟到		
    	if(df.parse(sheet.getCell(3,shuju.size()).getContents()).getTime()>biaozhun.getTime()){
    		chidao.add("迟到");
    	}else{
    		chidao.add("");
    				}
			
	while(n<sheet.getRows()){	
	    //如果前三条数据一样的话 说明是同一天
	    if(sheet.getCell(0,n).getContents().equals(firm) && sheet.getCell(1,n).getContents().equals(name) && sheet.getCell(2,n).getContents().equals(day) ){
	    	shuju.add(sheet.getCell(3,n).getContents());
	    }else{
	    	break;
	    }
	    n++;
	    }	
	    //当前三条数据不一样时 退出当前while循环 数组长度减1的下标就是下班时间
	    endTime.add(sheet.getCell(3,shuju.size()-1).getContents());
    	}
	    	
	    for (int i = 0; i < earlyTime.size(); i++) {
		try {
		workTime.add((df.parse((String) endTime.get(i)).getTime()-df.parse((String) earlyTime.get(i)).getTime())/3600000+"小时");
		//判断是否早退
		if((df.parse((String) endTime.get(i)).getTime()-df.parse((String) earlyTime.get(i)).getTime())/3600000>=8){
		zaotui.add("");
		}else{
		zaotui.add("早退");
		}
		} catch (ParseException e) {
		e.printStackTrace();
		}
		}
	    //关闭读取流
	    wb.close();
	    	
	    
	    try {
	    //打开写入流 
	    WritableWorkbook book = Workbook.createWorkbook(new File("D://Io//stu.xls"));  
	    // 生成名为“sheet1”的工作表,参数0表示这是第一页  
	    WritableSheet kaoqin = book.createSheet("kaoqin", 0);
	    			
	    //写入部门 
	    for (int i = 0; i < bumen.size(); i++) {
	    Label label = new Label(0, i,  (String) bumen.get(i));  
	    // 将定义好的单元格添加到工作表中  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入姓名
	    for (int i = 0; i < xingming.size(); i++) {
	    Label label = new Label(1, i,  (String) xingming.get(i));   
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入日期
	    for (int i = 0; i < date.size(); i++) {
	    Label label = new Label(2, i,  (String) date.get(i));    
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入上班时间
	    for (int i = 0; i < earlyTime.size(); i++) {
	    Label label = new Label(3, i,  (String) earlyTime.get(i));  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    	         
	    //写入下班时间
	    for (int i = 0; i < endTime.size(); i++) {
	    Label label = new Label(4, i,  (String) endTime.get(i));   
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入总共上班时间
	    for (int i = 0; i < workTime.size(); i++) {
	    Label label = new Label(5, i,   (String) workTime.get(i)) ;  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //加入迟到
	    	         
	    for (int i = 0; i < chidao.size(); i++) {
	    Label label = new Label(6, i,   (String) chidao.get(i)) ;  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入早退
	    for (int i = 0; i < zaotui.size(); i++) {
	    Label label = new Label(7, i,   (String) zaotui.get(i)) ;  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    book.write();    //执行写入操作
	    book.close();	  //关闭流
	    			
		}catch (Exception e) {
		System.out.println(e);  
	
	}
}
}
自己改了个逻辑 好了 还比以前简单多了[/quote]
m11418166 2017-12-07
  • 打赏
  • 举报
回复
引用 5 楼 AlbertLiangzt 的回复:
[quote=引用 4 楼 m11418166 的回复:] [quote=引用 3 楼 AlbertLiangzt 的回复:] [quote=引用 2 楼 m11418166 的回复:] [quote=引用 1 楼 AlbertLiangzt 的回复:] 插入数据的时候可以判断是否为空,如果为空,就是第一天上班时间,不为空,就比较日期是否相等
这样是可以但是根据我这个 max是可以算出来的 就是10月27号的上班时间是对应的 但是下班时间确实26号的 因为第一个跳过了 但是26号的max没跳过这个怎么办啊 是不是我这个逻辑有问题 能帮我看看吗 多谢了 我是新手 水平不怎么高 [/quote] 没看到先在的代码,不好说,但是按照你之前的代码来说是没有问题的,只是加了一个判断,你可以debug一下你的n值,是不是增加了1[/quote] 我的意思是我这个代码 执行的输出都是在else中 然后if中的max一直在遍历 n一直在加1 所以第一次输出的时候 n是等于6的 因为max遍历了五遍 感觉这个逻辑有问题啊[/quote] 这样没法说啊,贴代码吧[/quote]
package com.haxk.fangfa;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class zijixiedefangfa {
	public static void main(String[] args) throws BiffException, IOException, ParseException {
		String fileName = "D://Io//kaoqin.xls"; // Excel文件所在路径  
	    File file = new File(fileName); // 创建文件对象  
	    Workbook wb = Workbook.getWorkbook(file); // 从文件流中获取Excel工作区对象(WorkBook)  
	    Sheet sheet = wb.getSheet(0); // 从工作区中取得页(Sheet)
	    
	    int n =0;
	    Date min = null;
	    
	    String firm = ""; //定义公司
	    String name = ""; //定义姓名
	    String day = ""; //定义日期
	    String time_start = ""; //定义最早时间
	    String time_end = "";  //定义最晚时间
	
	    List shuju = new ArrayList();   //定义总的传入集合
	    List bumen = new ArrayList();  //部门
	    List xingming = new ArrayList();   //姓名
	    List date = new ArrayList();   //日期
	    List earlyTime = new ArrayList();  //上班时间
	    List endTime = new ArrayList<Date>();    //下班时间
	    List workTime = new ArrayList();  //上班时间
	    List chidao  = new ArrayList();  //迟到
	    List zaotui  = new ArrayList();   //早退
	    
	    //最晚上班时间
	    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
	    Date biaozhun  = df.parse("10:00:00");

	while(n<sheet.getRows()){
	    //这一天的最早上班时间
    	firm = sheet.getCell(0,shuju.size()).getContents();
    	name = sheet.getCell(1,shuju.size()).getContents();
    	day = sheet.getCell(2,shuju.size()).getContents();
    	time_start = sheet.getCell(3,shuju.size()).getContents();
    				
    	bumen.add(sheet.getCell(0,shuju.size()).getContents());
    	xingming.add(sheet.getCell(1,shuju.size()).getContents());
    	date.add(sheet.getCell(2,shuju.size()).getContents());
    	earlyTime.add(sheet.getCell(3,shuju.size()).getContents());
    	//判断是否迟到		
    	if(df.parse(sheet.getCell(3,shuju.size()).getContents()).getTime()>biaozhun.getTime()){
    		chidao.add("迟到");
    	}else{
    		chidao.add("");
    				}
			
	while(n<sheet.getRows()){	
	    //如果前三条数据一样的话 说明是同一天
	    if(sheet.getCell(0,n).getContents().equals(firm) && sheet.getCell(1,n).getContents().equals(name) && sheet.getCell(2,n).getContents().equals(day) ){
	    	shuju.add(sheet.getCell(3,n).getContents());
	    }else{
	    	break;
	    }
	    n++;
	    }	
	    //当前三条数据不一样时 退出当前while循环 数组长度减1的下标就是下班时间
	    endTime.add(sheet.getCell(3,shuju.size()-1).getContents());
    	}
	    	
	    for (int i = 0; i < earlyTime.size(); i++) {
		try {
		workTime.add((df.parse((String) endTime.get(i)).getTime()-df.parse((String) earlyTime.get(i)).getTime())/3600000+"小时");
		//判断是否早退
		if((df.parse((String) endTime.get(i)).getTime()-df.parse((String) earlyTime.get(i)).getTime())/3600000>=8){
		zaotui.add("");
		}else{
		zaotui.add("早退");
		}
		} catch (ParseException e) {
		e.printStackTrace();
		}
		}
	    //关闭读取流
	    wb.close();
	    	
	    
	    try {
	    //打开写入流 
	    WritableWorkbook book = Workbook.createWorkbook(new File("D://Io//stu.xls"));  
	    // 生成名为“sheet1”的工作表,参数0表示这是第一页  
	    WritableSheet kaoqin = book.createSheet("kaoqin", 0);
	    			
	    //写入部门 
	    for (int i = 0; i < bumen.size(); i++) {
	    Label label = new Label(0, i,  (String) bumen.get(i));  
	    // 将定义好的单元格添加到工作表中  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入姓名
	    for (int i = 0; i < xingming.size(); i++) {
	    Label label = new Label(1, i,  (String) xingming.get(i));   
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入日期
	    for (int i = 0; i < date.size(); i++) {
	    Label label = new Label(2, i,  (String) date.get(i));    
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入上班时间
	    for (int i = 0; i < earlyTime.size(); i++) {
	    Label label = new Label(3, i,  (String) earlyTime.get(i));  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    	         
	    //写入下班时间
	    for (int i = 0; i < endTime.size(); i++) {
	    Label label = new Label(4, i,  (String) endTime.get(i));   
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入总共上班时间
	    for (int i = 0; i < workTime.size(); i++) {
	    Label label = new Label(5, i,   (String) workTime.get(i)) ;  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //加入迟到
	    	         
	    for (int i = 0; i < chidao.size(); i++) {
	    Label label = new Label(6, i,   (String) chidao.get(i)) ;  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    //写入早退
	    for (int i = 0; i < zaotui.size(); i++) {
	    Label label = new Label(7, i,   (String) zaotui.get(i)) ;  
	    kaoqin.addCell(label); 
	    } 
	    	         
	    book.write();    //执行写入操作
	    book.close();	  //关闭流
	    			
		}catch (Exception e) {
		System.out.println(e);  
	
	}
}
}
自己改了个逻辑 好了 还比以前简单多了
m11418166 2017-12-06
  • 打赏
  • 举报
回复
引用 1 楼 AlbertLiangzt 的回复:
插入数据的时候可以判断是否为空,如果为空,就是第一天上班时间,不为空,就比较日期是否相等




这样是可以但是根据我这个 max是可以算出来的 就是10月27号的上班时间是对应的 但是下班时间确实26号的 因为第一个跳过了 但是26号的max没跳过这个怎么办啊
是不是我这个逻辑有问题 能帮我看看吗 多谢了 我是新手 水平不怎么高
AlbertLiangzt 2017-12-06
  • 打赏
  • 举报
回复
插入数据的时候可以判断是否为空,如果为空,就是第一天上班时间,不为空,就比较日期是否相等
AlbertLiangzt 2017-12-06
  • 打赏
  • 举报
回复
引用 4 楼 m11418166 的回复:
[quote=引用 3 楼 AlbertLiangzt 的回复:] [quote=引用 2 楼 m11418166 的回复:] [quote=引用 1 楼 AlbertLiangzt 的回复:] 插入数据的时候可以判断是否为空,如果为空,就是第一天上班时间,不为空,就比较日期是否相等
这样是可以但是根据我这个 max是可以算出来的 就是10月27号的上班时间是对应的 但是下班时间确实26号的 因为第一个跳过了 但是26号的max没跳过这个怎么办啊 是不是我这个逻辑有问题 能帮我看看吗 多谢了 我是新手 水平不怎么高 [/quote] 没看到先在的代码,不好说,但是按照你之前的代码来说是没有问题的,只是加了一个判断,你可以debug一下你的n值,是不是增加了1[/quote] 我的意思是我这个代码 执行的输出都是在else中 然后if中的max一直在遍历 n一直在加1 所以第一次输出的时候 n是等于6的 因为max遍历了五遍 感觉这个逻辑有问题啊[/quote] 这样没法说啊,贴代码吧
m11418166 2017-12-06
  • 打赏
  • 举报
回复
引用 3 楼 AlbertLiangzt 的回复:
[quote=引用 2 楼 m11418166 的回复:] [quote=引用 1 楼 AlbertLiangzt 的回复:] 插入数据的时候可以判断是否为空,如果为空,就是第一天上班时间,不为空,就比较日期是否相等
这样是可以但是根据我这个 max是可以算出来的 就是10月27号的上班时间是对应的 但是下班时间确实26号的 因为第一个跳过了 但是26号的max没跳过这个怎么办啊 是不是我这个逻辑有问题 能帮我看看吗 多谢了 我是新手 水平不怎么高 [/quote] 没看到先在的代码,不好说,但是按照你之前的代码来说是没有问题的,只是加了一个判断,你可以debug一下你的n值,是不是增加了1[/quote] 我的意思是我这个代码 执行的输出都是在else中 然后if中的max一直在遍历 n一直在加1 所以第一次输出的时候 n是等于6的 因为max遍历了五遍 感觉这个逻辑有问题啊
AlbertLiangzt 2017-12-06
  • 打赏
  • 举报
回复
引用 2 楼 m11418166 的回复:
[quote=引用 1 楼 AlbertLiangzt 的回复:] 插入数据的时候可以判断是否为空,如果为空,就是第一天上班时间,不为空,就比较日期是否相等
这样是可以但是根据我这个 max是可以算出来的 就是10月27号的上班时间是对应的 但是下班时间确实26号的 因为第一个跳过了 但是26号的max没跳过这个怎么办啊 是不是我这个逻辑有问题 能帮我看看吗 多谢了 我是新手 水平不怎么高 [/quote] 没看到先在的代码,不好说,但是按照你之前的代码来说是没有问题的,只是加了一个判断,你可以debug一下你的n值,是不是增加了1

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧