Java讀取和解析Excel資料:基於Apache POI(二)
阿新 • • 發佈:2019-01-03
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