using System; using System.Collections.Generic; using System.Web; using System.Data; using System.Data.Common; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using System.IO; using NPOI.SS.Util; using Wellan.Common; using Wellan.Data; using System.Linq; using Microsoft.Win32; /// /// 加班費印領清冊 的摘要描述 /// public class 加班費印領清冊 : ExcelReportBase { public 加班費印領清冊() { 報表名稱 = "加班費明細表"; } private int r = 2; private DataRow[] data; private int 加班費加總 = 0; private int bodyBeginRow, dataBeginRow; public override MemoryStream 產生報表() { // 只要領加班費的紀錄 data = 資料來源.Tables[0].Select( string.Format("RPTYP = '{0}' OR RPTYP = '{1}' OR RPTYP = '{2}' OR RPTYP = '{3}'", RPAR_TYPE.T12_非休息日請領加班費, RPAR_TYPE.T14_休息日請領加班費, RPAR_TYPE.T16_國定假日請領加班費, RPAR_TYPE.T18_例假日請領加班費) , "RPRDT"); foreach (DataRow r in data) { 加班費加總 += WDAC.GetInt32Value(r["RPAC1"]) + WDAC.GetInt32Value(r["RPAC2"]) + WDAC.GetInt32Value(r["RPAC3"]) + WDAC.GetInt32Value(r["RPAC4"]) + WDAC.GetInt32Value(r["RPAC5"]); } 產生抬頭(); 產生表身(); 產生結尾(); 設定欄寬及列印範圍(); MemoryStream ms = new MemoryStream(); workbook.Write(ms); return ms; } private void 產生抬頭() { excel.MergeCell(r, 0, r, 13); excel.SetCellValue(r, 0, 公司名稱, headerStyle); excel.SetRowHeight(r, 30); r++; excel.MergeCell(r, 0, r, 13); excel.SetCellValue(r, 0, 專案名稱, headerStyle); excel.SetRowHeight(r, 30); r++; excel.MergeCell(r, 0, r, 13); excel.SetCellValue(r, 0, 報表名稱, headerStyle); excel.SetRowHeight(r, 30); r++; excel.MergeCell(r, 0, r, 13); excel.SetCellValue(r, 0, "金額(此欄填寫數字)", bodyStyleCenter); excel.SetRowHeight(r, 20); r++; excel.MergeCell(r, 0, r, 3); excel.SetCellValue(r, 0, "萬", bodyStyleCenter); excel.SetRangeOuterBorder(r, 0, r, 3, BorderStyle.Thin); excel.MergeCell(r, 4, r, 6); excel.SetCellValue(r, 4, "仟", bodyStyleCenter); excel.SetRangeOuterBorder(r, 4, r, 6, BorderStyle.Thin); excel.MergeCell(r, 7, r, 7); excel.SetCellValue(r, 7, "佰", bodyStyleCenter); excel.SetRangeOuterBorder(r, 7, r, 7, BorderStyle.Thin); excel.MergeCell(r, 8, r, 10); excel.SetCellValue(r, 8, "拾", bodyStyleCenter); excel.SetRangeOuterBorder(r, 8, r, 10, BorderStyle.Thin); excel.MergeCell(r, 11, r, 13); excel.SetCellValue(r, 11, "元", bodyStyleCenter); excel.SetRangeOuterBorder(r, 11, r, 13, BorderStyle.Thin); excel.SetRowHeight(r, 30); r++; string s加班費加總 = String.Format("{0:00000}", 加班費加總) + "00000"; excel.MergeCell(r, 0, r, 3); excel.SetCellValue(r, 0, s加班費加總[0].ToString(), bodyStyleCenter); excel.SetRangeOuterBorder(r, 0, r, 3, BorderStyle.Thin); excel.MergeCell(r, 4, r, 6); excel.SetCellValue(r, 4, s加班費加總[1].ToString(), bodyStyleCenter); excel.SetRangeOuterBorder(r, 4, r, 6, BorderStyle.Thin); excel.MergeCell(r, 7, r, 7); excel.SetCellValue(r, 7, s加班費加總[2].ToString(), bodyStyleCenter); excel.SetRangeOuterBorder(r, 7, r, 7, BorderStyle.Thin); excel.MergeCell(r, 8, r, 10); excel.SetCellValue(r, 8, s加班費加總[3].ToString(), bodyStyleCenter); excel.SetRangeOuterBorder(r, 8, r, 10, BorderStyle.Thin); excel.MergeCell(r, 11, r, 13); excel.SetCellValue(r, 11, s加班費加總[4].ToString(), bodyStyleCenter); excel.SetRangeOuterBorder(r, 11, r, 13, BorderStyle.Thin); excel.SetRangeOuterBorder(r - 2, 0, r, 13, BorderStyle.Thick); excel.SetRowHeight(r, 25); r++; excel.SetCellValue(r, 11, String.Format("{0:yyyy}年度", 報表時間, WGuard1.TaiwanCulture), bodyStyleRightNoBorder); excel.SetCellValue(r, 12, String.Format("{0:MM}", 報表時間), bodyStyleCenterNoBorder); excel.SetCellValue(r, 13, "月", bodyStyleLeftNoBorder); excel.SetRowHeight(r, 25); r++; bodyBeginRow = r; excel.MergeCell(r, 0, r, 1); excel.SetCellValue(r, 0, "姓名", bodyStyleCenter); excel.SetRangeOuterBorder(r, 0, r, 1, BorderStyle.Thin); excel.MergeCell(r, 2, r, 5); excel.SetCellValue(r, 2, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), bodyStyleCenter); excel.SetRangeOuterBorder(r, 2, r, 5, BorderStyle.Thin); excel.SetCellValue(r, 6, "單位", bodyStyleCenter); excel.MergeCell(r, 7, r, 10); excel.SetCellValue(r, 7, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["站別"]), bodyStyleCenter); excel.SetRangeOuterBorder(r, 7, r, 10, BorderStyle.Thin); excel.SetCellValue(r, 11, "職稱", bodyStyleCenter); excel.MergeCell(r, 12, r, 13); excel.SetCellValue(r, 12, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), bodyStyleCenter); excel.SetRangeOuterBorder(r, 12, r, 13, BorderStyle.Thin); excel.SetRowHeight(r, 35); r++; excel.MergeCell(r, 0, r, 6); excel.SetCellValue(r, 0, "加班日及起迄時間", bodyStyleCenter); excel.SetRangeOuterBorder(r, 0, r, 6, BorderStyle.Thin); excel.MergeCell(r, 7, r + 1, 8); excel.SetCellValue(r, 7, "加班時數", bodyStyleCenter); excel.SetRangeOuterBorder(r, 7, r + 1, 8, BorderStyle.Thin); excel.MergeCell(r, 9, r + 1, 10); excel.SetCellValue(r, 9, "加班費\n金額", bodyStyleCenter); excel.SetRangeOuterBorder(r, 9, r + 1, 10, BorderStyle.Thin); //excel.MergeCell(r, 11, r + 1, 11); //excel.SetCellValue(r, 11, "蓋章", bodyStyleCenter); //excel.SetRangeOuterBorder(r, 11, r + 1, 11, BorderStyle.Thin); excel.MergeCell(r, 11, r + 1, 13); excel.SetCellValue(r, 11, "備註", bodyStyleCenter); excel.SetRangeOuterBorder(r, 11, r + 1, 13, BorderStyle.Thin); excel.SetCellValue(r + 1, 0, "月", bodyStyleCenter); excel.SetCellValue(r + 1, 1, "日", bodyStyleCenter); excel.MergeCell(r + 1, 2, r + 1, 3); excel.SetCellValue(r + 1, 2, "起", bodyStyleCenter); excel.SetRangeOuterBorder(r + 1, 2, r + 1, 3, BorderStyle.Thin); excel.MergeCell(r + 1, 4, r + 1, 5); excel.SetCellValue(r + 1, 4, "至", bodyStyleCenter); excel.SetRangeOuterBorder(r + 1, 4, r + 1, 5, BorderStyle.Thin); excel.SetCellValue(r + 1, 6, "迄", bodyStyleCenter); // 畫雙線 excel.SetRangeOuterBorder(r - 1, 0, r - 1, 13, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Double, BorderStyle.Thin); excel.SetRowHeight(r, 25); excel.SetRowHeight(r + 1, 25); r += 2; dataBeginRow = r; } private void 產生表身() { List oneDayItems = new List(); TimeCalc timeCalc = new TimeCalc(); foreach (DataRow row in data) { timeCalc.Init(WDAC.GetStringValue(row["RPNUM"]), WDAC.GetDateTimeValue(row["RPRDT"])); int rptc1, rptc2, rptc3, rptc4, rptc5, rpac1, rpac2, rpac3, rpac4, rpac5; string rptyp; rptc1 = WDAC.GetInt32Value(row["RPTC1"]); rptc2 = WDAC.GetInt32Value(row["RPTC2"]); rptc3 = WDAC.GetInt32Value(row["RPTC3"]); rptc4 = WDAC.GetInt32Value(row["RPTC4"]); rptc5 = WDAC.GetInt32Value(row["RPTC5"]); rpac1 = WDAC.GetInt32Value(row["RPAC1"]); rpac2 = WDAC.GetInt32Value(row["RPAC2"]); rpac3 = WDAC.GetInt32Value(row["RPAC3"]); rpac4 = WDAC.GetInt32Value(row["RPAC4"]); rpac5 = WDAC.GetInt32Value(row["RPAC5"]); rptyp = WDAC.GetStringValue(row["RPTYP"]); oneDayItems.Clear(); string beginTime = WDAC.GetStringValue(row["RPRTM"]); switch (rptyp) { case RPAR_TYPE.T12_非休息日請領加班費: case RPAR_TYPE.T14_休息日請領加班費: case RPAR_TYPE.T18_例假日請領加班費: var skiprest = rptyp != RPAR_TYPE.T12_非休息日請領加班費; if (rptc1 > 0) { var endtime = TimeAddMinutes(beginTime, rptc1, timeCalc.午休開始, timeCalc.午休結束, skiprest); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "一又三分之一", Hours = (double)rptc1 / 60D, Amount = rpac1 }); beginTime = endtime; } if (rptc2 > 0) { var endtime = TimeAddMinutes(beginTime, rptc2, timeCalc.午休開始, timeCalc.午休結束, skiprest); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "一又三分之二", Hours = (double)rptc2 / 60D, Amount = rpac2 }); beginTime = endtime; } if (rptc3 > 0) { var endtime = TimeAddMinutes(beginTime, rptc3, timeCalc.午休開始, timeCalc.午休結束, skiprest); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "國定假日", Hours = (double)rptc3 / 60D, Amount = rpac3 }); beginTime = endtime; } if (rptc4 > 0) { var endtime = TimeAddMinutes(beginTime, rptc4, timeCalc.午休開始, timeCalc.午休結束, skiprest); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "休息日再延長", Hours = (double)rptc4 / 60D, Amount = rpac4 }); beginTime = endtime; } if (rptc5 > 0) { var endtime = TimeAddMinutes(beginTime, rptc5, timeCalc.午休開始, timeCalc.午休結束, skiprest); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "例假日再延長", Hours = (double)rptc5 / 60D, Amount = rpac5 }); beginTime = endtime; } break; case RPAR_TYPE.T16_國定假日請領加班費: if (rptc3 > 0) { var endtime = TimeAddMinutes(beginTime, rptc3, timeCalc.午休開始, timeCalc.午休結束, false); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "國定假日", Hours = (double)rptc3 / 60D, Amount = rpac3 }); beginTime = endtime; } if (rptc1 > 0) { var endtime = TimeAddMinutes(beginTime, rptc1, timeCalc.午休開始, timeCalc.午休結束, false); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "國定假日延長(9-10)", Hours = (double)rptc1 / 60D, Amount = rpac1 }); beginTime = endtime; } if (rptc2 > 0) { var endtime = TimeAddMinutes(beginTime, rptc2, timeCalc.午休開始, timeCalc.午休結束, false); oneDayItems.Add(new OverTimeItem() { BeginTime = beginTime, EndTime = endtime, TimeName = "國定假日延長(11-12)", Hours = (double)rptc2 / 60D, Amount = rpac2 }); beginTime = endtime; } break; } for (int i = 0; i < oneDayItems.Count; i++) { OverTimeItem item = oneDayItems[i]; excel.SetCellValue(r + i, 0, String.Format("{0:MM}", row["RPRDT"]), bodyStyleCenter); excel.SetCellValue(r + i, 1, String.Format("{0:dd}", row["RPRDT"]), bodyStyleCenter); excel.MergeCell(r + i, 11, r + i, 13); excel.SetCellValue(r + i, 11, String.Format("{0}", row["RPDOC"]), bodyStyleCenter); excel.SetRangeOuterBorder(r + i, 11, r + i, 13, BorderStyle.Thin); excel.MergeCell(r + i, 2, r + i, 3); excel.SetCellValue(r + i, 2, item.BeginTime, bodyStyleCenter); excel.SetRangeOuterBorder(r + i, 2, r + i, 3, BorderStyle.Thin); excel.MergeCell(r + i, 4, r + i, 5); excel.SetCellValue(r + i, 4, "~", bodyStyleCenter); excel.SetRangeOuterBorder(r + i, 4, r + i, 5, BorderStyle.Thin); excel.SetCellValue(r + i, 6, item.EndTime, bodyStyleCenter); excel.SetCellValue(r + i, 7, item.TimeName, bodyStyleCenter); excel.SetCellValue(r + i, 8, item.Hours, bodyStyleCenter); excel.MergeCell(r + i, 9, r + i, 10); excel.SetCellValue(r + i, 9, item.Amount, bodyStyleCenter); excel.SetRangeOuterBorder(r + i, 9, r + i, 10, BorderStyle.Thin); excel.SetRowHeight(r + i, 35); } r += oneDayItems.Count; } // 蓋章 //excel.MergeCell(dataBeginRow, 11, r - 1, 11); //excel.SetCellValue(dataBeginRow, 11, "", bodyStyleCenter); //excel.SetRangeOuterBorder(dataBeginRow, 11, r - 1, 11, BorderStyle.Thin); // 合計 excel.SetCellValue(r, 6, "合計", bodyStyleCenter); excel.SetCellFormula(r, 7, String.Format("SUM({0}:{1})", excel.RCtoA1(dataBeginRow, 8), excel.RCtoA1(r - 1, 8)), bodyStyleCenter); excel.SetCellValue(r, 8, "小時", bodyStyleCenter); excel.SetCellFormula(r, 9, String.Format("SUM({0}:{1})", excel.RCtoA1(dataBeginRow, 9), excel.RCtoA1(r - 1, 9)), bodyStyleCenter); excel.SetCellValue(r, 10, "元", bodyStyleCenter); excel.SetRangeOuterBorder(r, 7, r, 7, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.None); excel.SetRangeOuterBorder(r, 8, r, 8, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.Thin); excel.SetRangeOuterBorder(r, 9, r, 9, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.None); excel.SetRangeOuterBorder(r, 10, r, 10, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.Thin); excel.SetRowHeight(r, 25); r++; } private void 產生結尾() { excel.MergeCell(r, 0, r, 3); excel.SetCellValue(r, 0, "茲收到加班費新台幣", bodyStyleCenter); excel.MergeCell(r, 4, r, 9); excel.SetCellValue(r, 4, WGuard1.WNTSA(加班費加總, "", true), bodyStyleRight); excel.MergeCell(r, 10, r, 13); excel.SetCellValue(r, 10, "此 據 (金額請大寫)", bodyStyleCenter); excel.SetRowHeight(r, 30); excel.SetRangeOuterBorder(r, 0, r, 3, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.None); excel.SetRangeOuterBorder(r, 4, r, 9, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.None); excel.SetRangeOuterBorder(r, 10, r, 13, BorderStyle.Thin, BorderStyle.None, BorderStyle.Thin, BorderStyle.Thin); r++; excel.MergeCell(r, 0, r, 5); excel.SetCellValue(r, 0, "申請人", bodyStyleCenter); excel.SetRangeOuterBorder(r, 0, r, 5, BorderStyle.Thin); excel.MergeCell(r, 6, r, 9); excel.SetCellValue(r, 6, "計劃督導", bodyStyleCenter); excel.SetRangeOuterBorder(r, 6, r, 9, BorderStyle.Thin); excel.MergeCell(r, 10, r, 13); excel.SetCellValue(r, 10, "計劃主持人", bodyStyleCenter); excel.SetRangeOuterBorder(r, 10, r, 13, BorderStyle.Thin); excel.SetRowHeight(r, 30); r++; excel.MergeCell(r, 0, r, 5); excel.SetCellValue(r, 0, "", bodyStyleCenter); excel.SetRangeOuterBorder(r, 0, r, 5, BorderStyle.Thin); excel.MergeCell(r, 6, r, 9); excel.SetCellValue(r, 6, "", bodyStyleCenter); excel.SetRangeOuterBorder(r, 6, r, 9, BorderStyle.Thin); excel.MergeCell(r, 10, r, 13); excel.SetCellValue(r, 10, "", bodyStyleCenter); excel.SetRangeOuterBorder(r, 10, r, 13, BorderStyle.Thin); excel.SetRowHeight(r, 50); excel.SetRangeOuterBorder(bodyBeginRow, 0, r, 13, BorderStyle.Thick); } private void 設定欄寬及列印範圍() { excel.SetColumnWidth(0, 6); excel.SetColumnWidth(1, 6); excel.SetColumnWidth(2, 2); excel.SetColumnWidth(3, 7); excel.SetColumnWidth(4, 3); excel.SetColumnWidth(5, 5); excel.SetColumnWidth(6, 11); excel.SetColumnWidth(7, 18); excel.SetColumnWidth(8, 7); excel.SetColumnWidth(9, 8); excel.SetColumnWidth(10, 3); excel.SetColumnWidth(11, 11); excel.SetColumnWidth(12, 7); excel.SetColumnWidth(13, 8); } private string TimeAddMinutes(string time, int addMinutes, string restBegin, string restEnd, bool skipRest) { int restBeginHour = 0; int restBeginMin = 0; int restEndHour = 0; int restEndMin = 0; int restBeginTime = 0; int restEndTime = 0; if (!string.IsNullOrEmpty(restBegin)) { string[] tp1 = restBegin.Split(':'); if (int.TryParse(tp1[0], out restBeginHour) && int.TryParse(tp1[1], out restBeginMin)) restBeginTime = restBeginHour * 60 + restBeginMin; } if (!string.IsNullOrEmpty(restEnd)) { string[] tp1 = restEnd.Split(':'); if (int.TryParse(tp1[0], out restEndHour) && int.TryParse(tp1[1], out restEndMin)) restEndTime = restEndHour * 60 + restEndMin; } string[] timepart = time.Split(':'); int hour, min; if (int.TryParse(timepart[0], out hour) && int.TryParse(timepart[1], out min)) { int beginTime = hour * 60 + min; int extraAddMinutes = 0; if (beginTime <= restBeginTime && beginTime + addMinutes >= restBeginTime) { int tempEndTime = beginTime + addMinutes; // 跨越中午休息時間,要摳掉 if (tempEndTime >= restEndTime && skipRest) extraAddMinutes = restEndTime - restBeginTime; // 跨進,但未跨越,不要摳掉 if (tempEndTime < restEndTime) // extraAddMinutes = (int)Math.Truncate((restEndTime - tempEndTime).TotalMinutes); extraAddMinutes = 0; } var result = beginTime + addMinutes + extraAddMinutes; return string.Format("{0:00}:{1:00}", (int)Math.Truncate((double)result / (double)60), result % 60); } else { return ""; } } } class OverTimeItem { public string BeginTime { get; set; } public string EndTime { get; set; } public string TimeName { get; set; } public double Hours { get; set; } public double Amount { get; set; } }