Java读取和解析Excel数据:基于Apache POI(二)

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/85317882

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

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/85317882
今日推荐