Files
thinkyu/Web/App_Code/Report/加班費印領清冊.cs
T
sryang 577060bc78 chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
2026-09-10 09:42:37 +08:00

492 lines
21 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
/// <summary>
/// 加班費印領清冊 的摘要描述
/// </summary>
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<OverTimeItem> oneDayItems = new List<OverTimeItem>();
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; }
}