做一个如图所示的加班调休报表,Y轴为一年的十二个月,横轴为一个月的31天以及余数,加班,调休,可调情况,其中第一个月的余数要单独计算(余数=前一年的总加班数-总调休数),然后余数和可调为递推数值,这一个月的余数=上一个月的可调
//源代码
DataTable dt;//dt是存放某员工某日期加班调休数 格式为 工号 日期flowyear(20110902) 加班数 调休数
DataTable dt1;//dt1存放请事假调休和加班的员工 格式为 工号 日期(20110902)日期类型(上/下/全半天) 流程类型(事假。调休。加班。。。)
String result;//余数
//新建一个DataTable,存放一个员工当年每月的余数,加班,调休,可调的数值
DataTable dtThisYear = new DataTable();
dtThisYear.Columns.Add("Month", typeof(string)); //6位
dtThisYear.Columns.Add("YuShu", typeof(string));
dtThisYear.Columns.Add("OvertimeDay", typeof(string));
dtThisYear.Columns.Add("ExchangeDay", typeof(string));
dtThisYear.Columns.Add("RemainDay", typeof(string));
for (int i = 1; i <= 12; i++) //遍历1~12月
{
//判断dt中有无此月份。如果有,则取其中的值,否则,插入一条初始化的记录
DataRow[] arrDR = dt.Select("FlowYear = " + flowYear + i.ToString().PadLeft(2, '0'));
DataRow drThisYear = dtThisYear.NewRow();
drThisYear["Month"] = flowYear + i.ToString().PadLeft(2, '0');
if (i == 1)
{
drThisYear["YuShu"] = result;
}
else
{
drThisYear["YuShu"] = dtThisYear.Rows[i - 2]["RemainDay"].ToString();
}
if (arrDR != null && arrDR.Length > 0)
{
drThisYear["OvertimeDay"] = arrDR[0]["OvertimeDay"].ToString();
drThisYear["ExchangeDay"] = arrDR[0]["ExchangeDay"].ToString();
}
else
{
drThisYear["OvertimeDay"] = "0";
drThisYear["ExchangeDay"] = "0";
}
drThisYear["RemainDay"] = (Convert.ToDecimal(drThisYear["YuShu"])
- Convert.ToDecimal(drThisYear["ExchangeDay"])
+ Convert.ToDecimal(drThisYear["OvertimeDay"])).ToString();
dtThisYear.Rows.Add(drThisYear);
}
string[] sArray = null;
string s = " |1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|余数|加班|调休|可调";
sArray = s.Split('|');
StringBuilder builder = new StringBuilder();
#region Table
builder.AppendLine("<table cellspacing=\"0\" cellpadding=\"5\" rules=\"all\" border=\"1\">");
builder.AppendLine("<thead><tr><th>" + "加班调休报表" + "</th></td></thead>");
builder.AppendLine(@"<tbody><tr><td colspan='2'>姓名:</td>
<td colspan='4'>" + dt.Rows[0]["ChineseName"].ToString() + "</td><td colspan='26'></td><td>年份:</td><td colspan='3'>" + flowYear + "</td></tr></tbody>");
builder.AppendLine("<tr style=\"font-weight: bold; white-space: nowrap;\">");
foreach (string item in sArray)
{
if (item.Equals("Opertion") || item.Equals("PageDisplaySequence"))
{
continue;
}
builder.AppendLine("<td>" + item.ToString() + "</td>");//0
}
builder.AppendLine("</tr>");
Dictionary<string, string> dic = new Dictionary<string, string>();
#region//把日期和相应的符号标识添加到Dictionary key-value 日期-符号
for (int d = 0; d < dt1.Rows.Count; d++)
{
判断如果是上半天加班/事假/调休分别是用什么符号表示,
把结果以日期和符号的形式添加到dic中
}
for (int i = 1; i < 13; i++)
{
builder.AppendLine("<tr>");
builder.AppendLine("<Td>" + i.ToString() + "</td>");
for (int j = 1; j < 32; j++)
{
#region 判断I J 根据在dic中是否包含该日期,把相应的符号填充上去
if (i < 10 && j < 10)
{
if (dic.ContainsKey(flowYear + "0" + i.ToString() + "0" + j.ToString()))
{
builder.AppendLine("<td>" + dic[flowYear + "0" + i.ToString() + "0" + j.ToString()] + "</td>");
}
else
{
builder.AppendLine("<td> </td>");
}
}
else if (i < 10 && j >= 10)
{
if (dic.ContainsKey(flowYear + "0" + i.ToString() + j.ToString()))
{
builder.AppendLine("<td>" + dic[flowYear + "0" + i.ToString() + j.ToString()] + "</td>");
}
else
{
builder.AppendLine("<td> </td>");
}
}
else if (i >= 10 && j < 10)
{
if (dic.ContainsKey(flowYear + i.ToString() + "0" + j.ToString()))
{
builder.AppendLine("<td>" + dic[flowYear + i.ToString() + "0" + j.ToString()] + "</td>");
}
else
{
builder.AppendLine("<td> </td>");
}
}
else
{
if (dic.ContainsKey(flowYear + i.ToString() + j.ToString()))
{
builder.AppendLine("<td>" + dic[flowYear + i.ToString() + j.ToString()] + "</td>");
}
else
{
builder.AppendLine("<td> </td>");
}
}
}
//余数
builder.AppendLine("<Td>" + dtThisYear.Rows[i-1]["YuShu"].ToString() + "</td>");
//加班
builder.AppendLine("<Td>" + dtThisYear.Rows[i - 1]["OvertimeDay"].ToString() + "</td>");
//调休
builder.AppendLine("<Td>" + dtThisYear.Rows[i - 1]["ExchangeDay"].ToString() + "</td>");
//可调
builder.AppendLine("<Td>" + dtThisYear.Rows[i - 1]["RemainDay"].ToString() + "</td>");
builder.AppendLine("</tr>");
}
builder.AppendLine("</table>");