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.Data; using System.Linq; /// /// 請假申請單 /// public class 請假申請單 : ExcelReportBase { public 請假申請單() { 報表名稱 = "請假申請單"; } public override MemoryStream 產生報表() { BodyRowHeight = 35; TimeCalc timeCalc = new TimeCalc(); #region 報表抬頭 excel.MergeCell(0, 0, 0, 9); excel.SetCellValue(0, 0, String.Format("{0}\r\n承辦{1}\r\n『{2}』\r\n{3}", 公司名稱, 客戶名稱, 專案名稱, 報表名稱), headerStyle); excel.SetCellValue(1, 0, "月份:", titleStyleRightNoBorder); excel.MergeCell(1, 1, 1, 2); excel.SetCellValue(1, 1, 報表時間.ToString("MM月"), titleStyleLeftNoBorder); excel.SetCellValue(1, 3, "單位:", titleStyleRightNoBorder); excel.SetCellValue(1, 4, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["站別"]), titleStyleLeftNoBorder); excel.SetCellValue(1, 5, "職稱:", titleStyleRightNoBorder); excel.SetCellValue(1, 6, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["職稱"]), titleStyleLeftNoBorder); excel.SetCellValue(1, 7, "姓名:", titleStyleRightNoBorder); excel.SetCellValue(1, 8, WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["BPNME"]), titleStyleLeftNoBorder); excel.SetRowHeight(0, HeaderRowHeight * 4); excel.SetRowHeight(1, BodyRowHeight); excel.MergeCell(2, 0, 2, 2); excel.SetRangeOuterBorder(2, 0, 2, 2, BorderStyle.Thin); excel.SetCellValue(2, 0, "請假日期", titleStyleCenter); excel.SetCellValue(2, 3, "開始時間", titleStyleCenter); excel.SetCellValue(2, 4, "結束時間", titleStyleCenter); excel.SetCellValue(2, 5, "請假類別", titleStyleCenter); excel.SetCellValue(2, 6, "請假時數", titleStyleCenter); excel.SetCellValue(2, 7, "代理人", titleStyleCenter); excel.SetCellValue(2, 8, "請假事由", titleStyleCenter); excel.SetCellValue(2, 9, "備註", titleStyleCenter); excel.SetRowHeight(2, BodyRowHeight); #endregion #region 報表資料 DateTime 月初 = 報表時間; DateTime 月底 = 報表時間.AddMonths(1).AddDays(-1); var summarys = new List() { new Summary() { Title = "補休" , RparTyps = new List() { RPAR_TYPE.T00_補休 } }, new Summary() { Title = "特休" , RparTyps = new List() { RPAR_TYPE.T01_特休 } } , new Summary() { Title = "事假" , RparTyps = new List() { RPAR_TYPE.T02_事假 } }, new Summary() { Title = "病假" , RparTyps = new List() { RPAR_TYPE.T03_病假 } }, new Summary() { Title = "喪假" , RparTyps = new List() { RPAR_TYPE.T04_喪假 } }, new Summary() { Title = "產假" , RparTyps = new List() { RPAR_TYPE.T05_產假 } }, new Summary() { Title = "婚假" , RparTyps = new List() { RPAR_TYPE.T06_婚假 } }, new Summary() { Title = "陪產假" , RparTyps = new List() { RPAR_TYPE.T07_陪產假 } }, new Summary() { Title = "公假(出)" , RparTyps = new List() { RPAR_TYPE.T08_公假 } }, new Summary() { Title = "公傷假" , RparTyps = new List() { RPAR_TYPE.T09_公傷假 } }, new Summary() { Title = "生理假" , RparTyps = new List() { RPAR_TYPE.T0A_生理假 } }, new Summary() { Title = "家庭照顧假" , RparTyps = new List() { RPAR_TYPE.T0B_家庭照顧假 } }, new Summary() { Title = "育嬰假" , RparTyps = new List() { RPAR_TYPE.T0C_育嬰假 } }, new Summary() { Title = "原民祭儀假" , RparTyps = new List() { RPAR_TYPE.T0D_原民祭儀假 } }, new Summary() { Title = "產檢假" , RparTyps = new List() { RPAR_TYPE.T0E_產檢假 } }, new Summary() { Title = "其他假別(一)", RparTyps = new List() { RPAR_TYPE.T0F_防疫照顧假, RPAR_TYPE.T0G_無薪假, RPAR_TYPE.T0H_防疫隔離假 } } }; int 總時數 = 0; int rowId = 3; foreach (DataRow r in 資料來源.Tables[0].Rows) { DateTime 起日 = WDAC.GetDateTimeValue(r["RPRDT"]); DateTime 迄日 = WDAC.GetDateTimeValue(r["RPEDT"]); string 起時 = WDAC.GetStringValue(r["RPRTM"]); string 迄時 = WDAC.GetStringValue(r["RPETM"]); string 類別 = WDAC.GetStringValue(r["RPTYP"]); if (起日 < 月初) { 起日 = 月初; 起時 = timeCalc.上班時間; } if (迄日 > 月底) { 迄日 = 月底; 迄時 = timeCalc.下班時間; } //Double 時數 = WDAC.GetDoubleValue(r["RPTCT"]) / 60; int 時數 = timeCalc.計算請假總時數(WDAC.GetStringValue(資料來源.Tables[0].Rows[0]["RPNUM"]), 起日, 迄日, 起時, 迄時, 類別, !以時分顯示時數); 總時數 += 時數; #region 區分假別統計 var summary = summarys.FirstOrDefault(p => p.RparTyps.Contains(類別)); if (summary != null) { summary.Minutes += 時數; } #endregion excel.SetCellValue(rowId, 0, 起日.ToString("MM月dd日"), titleStyleCenter); excel.SetCellValue(rowId, 1, "~", titleStyleCenter); excel.SetCellValue(rowId, 2, 迄日.ToString("MM月dd日"), titleStyleCenter); excel.SetCellValue(rowId, 3, 起時, titleStyleCenter); excel.SetCellValue(rowId, 4, 迄時, titleStyleCenter); excel.SetCellValue(rowId, 5, WDAC.GetStringValue(r["類別"]), titleStyleCenter); excel.SetCellValue(rowId, 6, MinuteToTime(時數), titleStyleCenter); excel.SetCellValue(rowId, 7, WDAC.GetStringValue(r["RPAGT"]), titleStyleCenter); excel.SetCellValue(rowId, 8, WDAC.GetStringValue(r["RPRSN"]), bodyStyleCenterS); excel.SetCellValue(rowId, 9, WDAC.GetStringValue(r["RPDOC"]), bodyStyleCenterS); excel.SetRowHeight(rowId, BodyRowHeight); rowId++; } #region 底下的統計 var summaryRows = summarys.Count + 1; excel.MergeCell(rowId + 2, 2, rowId + summaryRows, 3); excel.MergeCell(rowId + 2, 4, rowId + summaryRows, 4); excel.MergeCell(rowId + 2, 5, rowId + summaryRows, 5); excel.SetCellValue(rowId + 2, 2, "總請假時數:", titleStyleRightNoBorder); excel.SetCellValue(rowId + 2, 4, MinuteToTime(總時數), titleStyleCenterNoBorder); excel.SetCellValue(rowId + 2, 5, "hrs", titleStyleLeftNoBorder); excel.SetRangeOuterBorder(rowId + 2, 2, rowId + summaryRows, 5, BorderStyle.Thin); var rr = 2; foreach (var symmary in summarys) { excel.SetCellValue(rowId + rr, 6, symmary.Title + ":", titleStyleLeftNoBorder); excel.SetCellValue(rowId + rr, 7, MinuteToTime(symmary.Minutes), titleStyleCenterNoBorder); excel.SetCellValue(rowId + rr, 8, "hrs", titleStyleLeftNoBorder); excel.SetRangeOuterBorder(rowId + rr, 6, rowId + rr, 8, BorderStyle.Thin); excel.SetRowHeight(rowId + rr, BodyRowHeight); rr++; } rowId += summaryRows; #endregion #region 表尾批示 //excel.MergeCell(rowId + 10, 0, rowId + 10, 9); //excel.SetCellValue(rowId + 10, 0, "申請人:             計畫督導:             人事單位:", titleStyleLeftNoBorder); //excel.SetRowHeight(rowId + 10, BodyRowHeight); //excel.MergeCell(rowId + 1, 1, rowId + 1, 3); //excel.MergeCell(rowId + 2, 1, rowId + 2, 3); //excel.SetCellValue(rowId + 1, 1, "申請人", titleStyleCenter); //excel.SetRangeOuterBorder(rowId + 1, 1, rowId + 1, 3, BorderStyle.Thin); //excel.SetRangeOuterBorder(rowId + 2, 1, rowId + 2, 3, BorderStyle.Thin); //excel.MergeCell(rowId + 1, 4, rowId + 1, 6); //excel.MergeCell(rowId + 2, 4, rowId + 2, 6); //excel.SetCellValue(rowId + 1, 4, "公司計畫督導", titleStyleCenter); //excel.SetRangeOuterBorder(rowId + 1, 4, rowId + 1, 6, BorderStyle.Thin); //excel.SetRangeOuterBorder(rowId + 2, 4, rowId + 2, 6, BorderStyle.Thin); //excel.MergeCell(rowId + 1, 7, rowId + 1, 8); //excel.MergeCell(rowId + 2, 7, rowId + 2, 8); //excel.SetCellValue(rowId + 1, 7, "公司計畫主持人", titleStyleCenter); //excel.SetRangeOuterBorder(rowId + 1, 7, rowId + 1, 8, BorderStyle.Thin); //excel.SetRangeOuterBorder(rowId + 2, 7, rowId + 2, 8, BorderStyle.Thin); //excel.SetRowHeight(rowId + 1, BodyRowHeight); //excel.SetRowHeight(rowId + 2, BodyRowHeight); #endregion #endregion excel.SetColumnWidth(0, 11); excel.SetColumnWidth(1, 4); excel.SetColumnWidth(2, 11); excel.SetColumnWidth(3, 11); excel.SetColumnWidth(4, 11); excel.SetColumnWidth(5, 11); excel.SetColumnWidth(6, 18); excel.SetColumnWidth(7, 12); excel.SetColumnWidth(8, 20); excel.SetColumnWidth(9, 15); MemoryStream ms = new MemoryStream(); workbook.Write(ms); return ms; } } class Summary { public string Title; public int Minutes; public List RparTyps; }