Java读取和解析Excel数据:基于Apache POI(二)
假设附录1文章中的test.xls是对员工的考勤记录表。需要根据这张excel表统计员工的加班时间,那么需要重点关注第五列的下班时候的打卡记录时间。我写一个Java程序,根据附录1中那样的excel表中的下班打卡时间统计员工在工作日的加班次数和小时数:
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class ReadExcel {
// 工作日加班的天数。
private static int workTimeDateCount = 0;
// 工作日加班的分钟数。
private static long workTimeMinutesCount = 0;
public static void main(String[] args) throws Exception {
File xlsFile = new File("test.xls");
// 工作表
Workbook workbook = WorkbookFactory.create(xlsFile);
// 表个数。
int numberOfSheets = workbook.getNumberOfSheets();
// 遍历表。
for (int i = 0; i < numberOfSheets; i++) {
Sheet sheet = workbook.getSheetAt(i);
// 行数。
int rowNumbers = sheet.getLastRowNum() + 1;
// Excel第一行。
Row temp = sheet.getRow(0);
if (temp == null) {
continue;
}
// 读数据。
for (int row = 1; row < rowNumbers; row++) {
Row r = sheet.getRow(row);
String dateString0 = r.getCell(1).toString().trim() + "";
String dateString1 = r.getCell(4).toString().trim() + "";
String dateString2 = r.getCell(5).toString().trim() + "";
cal(dateString0, dateString1, dateString2);
}
}
System.out.println("工作日加班天数:" + workTimeDateCount);
System.out.println("工作日加班分钟数:" + workTimeMinutesCount);
System.out.println("工作日加班小时数:" + workTimeMinutesCount / 60);
}
// 开始计算加班时间。
private static void cal(String dateString0, String dateString1, String dateString2) throws Exception {
boolean b2 = dateString2.equals("");
// 如果上下午均没有打卡记录,则不予任何统计。
// 只有下午有打卡记录,才认定为加班。
if (!b2) {
long t = workOverTimeMins(dateString2);
if (t > 0) {
workTimeDateCount++;
workTimeMinutesCount = workTimeMinutesCount + t;
}
}
}
// 工作日,下班时候的打卡时间和17:30做比较,超过17:30的打卡时间为加班分钟数。
private static long workOverTimeMins(String dateString2) throws Exception {
Calendar cal = stringToCalendar(dateString2, "yyyy-mm-dd HH:mm");
Calendar c = Calendar.getInstance();
c.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 17, 30);
long m = cal.getTimeInMillis() - c.getTimeInMillis();
long mins = m / (1000 * 60);
return mins;
}
// 日期字符串转换为日历。
private static Calendar stringToCalendar(String s, String format) throws Exception {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Date date = simpleDateFormat.parse(s);
Calendar cal = Calendar.getInstance(Locale.CHINA);
cal.setTime(date);
return cal;
}
}
加班天数相当于加班次数。
输出:
工作日加班天数:196
工作日加班分钟数:32533
工作日加班小时数:542
附录:
1.《Java读取Excel数据:基于Apache POI(一)》链接:https://blog.csdn.net/zhangphil/article/details/85302347