1. 程式人生 > >Java讀取和解析Excel資料:基於Apache POI(二)

Java讀取和解析Excel資料:基於Apache POI(二)

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