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; }
}