using AIMSExtension; using Microsoft.Office.Interop.Excel; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace AIMS.OperationFront.UI { public partial class frmPersonSchedulKeep : Form { private bool isDataLoaded = false; private System.Data.DataTable dtDoctorNurses = null; private System.Data.DataTable dtSchedulingType = null; private System.Data.DataTable dtOverLackHours = null; private System.Data.DataTable dtMainTable = null; private System.Data.DataTable dtSchedulingNew = null; private Dictionary dicSchedulingTypeIdName = new Dictionary(); private Dictionary dicSchedulingTypeNameId = new Dictionary(); private GPDbHelper dbHelper = new GPDbHelper(); public frmPersonSchedulKeep() { InitializeComponent(); } /// /// 由班次Id获取班次名称 /// /// 班次Id /// private string getSchedulingTypeName(int id) { if (dicSchedulingTypeIdName.ContainsKey(id)) { return dicSchedulingTypeIdName[id]; } return ""; } /// /// 由班次名称获取班次Id /// /// 班次名称 /// private int getSchedulingTypeId(string name) { if (dicSchedulingTypeNameId.ContainsKey(name)) { return dicSchedulingTypeNameId[name]; } return 0; } /// /// 字符串数组加空项 /// /// 字符串数组 /// private string[] ArrayAddEmptyValue(string[] items) { int n = items.Length; string[] items2 = new string[n + 1]; items2[0] = ""; Array.Copy(items, 0, items2, 1, n); return items2; } private void FrmDeptAttendance_Load(object sender, EventArgs e) { //dbHelper = new GPDbHelper(); //this.dataGridView1.RowPostPaint += GPControls.DataGridView_RowPostPaint; GetMainDataTable(); this.WindowState = FormWindowState.Maximized; this.dataGridView1.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; } /// /// 结构时间(小时 分钟) /// struct MyHourMinute { public int hour; public int minute; } /// /// 上下班时间 /// struct MySxbTime { public DateTime sbTime; public DateTime xbTime; } /// /// 由时间字符串解析出结构时间 /// /// 时间字符串 /// private MyHourMinute GetMyHourMinute(string time) { MyHourMinute hm; hm.hour = -1; /*不正确的时间表示*/ hm.minute = 0; if (string.IsNullOrEmpty(time)) return hm; int[] arr = GPFunctions.StringToIntArray(time, ':'); if (arr.Length == 2) { hm.minute = arr[1]; } hm.hour = arr[0]; return hm; } /// /// 由上下班时间字符串解析出上下班时间 /// /// 上班时间字符 /// 下班时间字符 /// private MySxbTime GetMySxbTime(string beginTime, string endTime) { /*获取上下班时间, 如果下班时间早于上班时间,则无效*/ MySxbTime sxbTime; DateTime dateTime = this.dateTimePicker1.Value.Date; if (string.IsNullOrEmpty(beginTime) || string.IsNullOrEmpty(endTime)) { sxbTime.sbTime = dateTime; sxbTime.xbTime = dateTime.AddDays(-1); return sxbTime; } MyHourMinute hm = GetMyHourMinute(beginTime); sxbTime.sbTime = dateTime.AddHours(hm.hour).AddMinutes(hm.minute); hm = GetMyHourMinute(endTime); sxbTime.xbTime = dateTime.AddHours(hm.hour).AddMinutes(hm.minute); if (sxbTime.xbTime.CompareTo(sxbTime.sbTime) <= 0) { sxbTime.xbTime = sxbTime.xbTime.AddDays(1); } return sxbTime; } /// /// 读取主显示表数据 /// private void GetMainDataTable() { if (dtMainTable != null) { if (GPFunData.GetDataTableChangedCount(dtMainTable) > 0) { if (MessageBox.Show("数据有修改,没有保存,是否要保存?", "提示信息", MessageBoxButtons.YesNo) == DialogResult.Yes) { SaveData(); } } } isDataLoaded = false; DateTime dateTime = this.dateTimePicker1.Value.Date; int year = dateTime.Year; int month = dateTime.Month; int day = dateTime.Day; string sql; /*读取手术麻醉科的医生WorkersType=2护士信息 WorkersType=*/ if (chxInvalidWorker.Checked) { if (radioDoctor.Checked) { sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,2 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='麻醉医生' order by w.[PersonOrder] "; } else { sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,1 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='手术室护士' order by w.[PersonOrder] "; } } else { if (radioDoctor.Checked) { sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,2 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='麻醉医生' and w.IsValid=1 order by w.[PersonOrder] "; } else { sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,1 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='手术室护士' and w.IsValid=1 order by w.[PersonOrder] "; } } dtDoctorNurses = dbHelper.GetDataTable(sql); sql = "select Id, [Name], BeginTime, EndTime from SchedulingType"; dtSchedulingType = dbHelper.GetDataTable(sql); dicSchedulingTypeIdName.Clear(); dicSchedulingTypeNameId.Clear(); foreach (DataRow dr in dtSchedulingType.Rows) { int id = (int)dr["Id"]; string name = dr["Name"].ToString(); dicSchedulingTypeIdName[id] = name; dicSchedulingTypeNameId[name] = id; } DataGridView dgv = this.dataGridView1; dgv.AutoGenerateColumns = false; sql = string.Format("SELECT Id, WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2 from ScheduleOverLackHours where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime)); dtOverLackHours = dbHelper.GetDataTable(sql); sql = string.Format("select Id, WorkerId, SchedulingDate, SchedulingType from SchedulingNew where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime)); dtSchedulingNew = dbHelper.GetDataTable(sql); DataView dvWorkers = dtDoctorNurses.DefaultView; DataView dvOverLackHours = dtOverLackHours.DefaultView; DataView dvSchedulingNew = dtSchedulingNew.DefaultView; DataView dvSchedulingType = dtSchedulingType.DefaultView; System.Data.DataTable dataTable = dtOverLackHours.Clone(); dataTable.Columns.Add("SchedulingTypeName", typeof(string)); dataTable.Columns.Add("WorkNo", typeof(string)); dataTable.Columns.Add("HCode", typeof(string)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Columns.Add("RoleName", typeof(string)); dataTable.Columns.Add("BeginTime2", typeof(DateTime)); dataTable.Columns.Add("EndTime2", typeof(DateTime)); bool isNurse = radioNurse.Checked; if (!isNurse) { dvWorkers.RowFilter = "WorkersType=2"; } else { dvWorkers.RowFilter = "WorkersType=1"; } dvWorkers.Sort = "OrderBy"; int n = dvWorkers.Count; for (int i = 0; i < n; i++) { DataRow dr = dataTable.NewRow(); DataRowView dvr = dvWorkers[i]; /*WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2*/ int workerId = (int)dvr["id"]; int workersType = (int)dvr["WorkersType"]; int SchedulingTypeId = 0; string beginTime, endTime; MySxbTime sxbTime; dr["WorkerId"] = (int)dvr["Id"]; dr["WorkersType"] = workersType; dr["WorkNo"] = dvr["WorkNo"].ToString(); dr["Name"] = dvr["Name"].ToString(); dr["HCode"] = dvr["HCode"].ToString(); dr["RoleName"] = (workersType == 2 ? "医生" : "护士"); dr["SchedulingDate"] = dateTime; dvOverLackHours.RowFilter = string.Format("WorkerId={0}", workerId); if (dvOverLackHours.Count > 0) { SchedulingTypeId = GPFunctions.CInt(dvOverLackHours[0]["SchedulingTypeId"]); dr["SchedulingTypeId"] = SchedulingTypeId; if (SchedulingTypeId > 0) { dr["SchedulingTypeName"] = getSchedulingTypeName(SchedulingTypeId); beginTime = dvOverLackHours[0]["BeginTime"].ToString(); endTime = dvOverLackHours[0]["EndTime"].ToString(); dr["BeginTime"] = beginTime; dr["EndTime"] = endTime; sxbTime = GetMySxbTime(beginTime, endTime); if (sxbTime.sbTime.CompareTo(sxbTime.xbTime) < 0) { dr["BeginTime2"] = sxbTime.sbTime; dr["EndTime2"] = sxbTime.xbTime; } } dr["OverHours"] = dvOverLackHours[0]["OverHours"]; dr["LackHours"] = dvOverLackHours[0]["LackHours"]; dr["OverTime1"] = dvOverLackHours[0]["OverTime1"]; dr["OverTime2"] = dvOverLackHours[0]["OverTime2"]; dr["LackTime1"] = dvOverLackHours[0]["LackTime1"]; dr["LackTime2"] = dvOverLackHours[0]["LackTime2"]; } else { dvSchedulingNew.RowFilter = string.Format("WorkerId={0}", workerId); if (dvSchedulingNew.Count > 0) { SchedulingTypeId = (int)dvSchedulingNew[0]["SchedulingType"]; dr["SchedulingTypeId"] = SchedulingTypeId; dr["SchedulingTypeName"] = getSchedulingTypeName(SchedulingTypeId); dvSchedulingType.RowFilter = string.Format("Id={0}", SchedulingTypeId); if (dvSchedulingType.Count > 0) { beginTime = dvSchedulingType[0]["beginTime"].ToString(); endTime = dvSchedulingType[0]["endTime"].ToString(); dr["BeginTime"] = beginTime; dr["EndTime"] = endTime; sxbTime = GetMySxbTime(beginTime, endTime); dr["BeginTime2"] = sxbTime.sbTime; dr["EndTime2"] = sxbTime.xbTime; dr["OverTime1"] = sxbTime.xbTime; dr["OverTime2"] = sxbTime.xbTime; dr["LackTime1"] = sxbTime.xbTime; dr["LackTime2"] = sxbTime.xbTime; } } } dataTable.Rows.Add(dr); } dataTable.AcceptChanges(); this.dataGridView1.DataSource = dataTable; dtMainTable = dataTable; DisplayTotalInfo(new string[] { "OverHours", "LackHours" }, new string[] { "加班小时数", "缺勤小时数" }); isDataLoaded = true; } private void btnExit_Click(object sender, EventArgs e) { this.Close(); } private void button1_Click(object sender, EventArgs e) { ExportToExcel(string.Format("{0}考勤缺勤表.xls", this.dateTimePicker1.Value.ToString("yyyy-MM-dd")), this.dataGridView1); } private void textFind_TextChanged(object sender, EventArgs e) { string text = textFind.Text.Trim(); dtMainTable.DefaultView.RowFilter = string.Format("WorkNo like '%{0}%' or Name like '%{0}%' or HCode like '%{0}%' ", text); } private void radioDoctor_CheckedChanged(object sender, EventArgs e) { GetMainDataTable(); } private void radioNurse_CheckedChanged(object sender, EventArgs e) { GetMainDataTable(); } private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { GetMainDataTable(); } private void chxInvalidWorker_CheckedChanged(object sender, EventArgs e) { GetMainDataTable(); } private void btnFresh_Click(object sender, EventArgs e) { GetMainDataTable(); } /// /// 显示汇总数据 /// /// 汇总字段列表 /// 汇总字段显示标题 private void DisplayTotalInfo(string[] fieldname, string[] displayname) { int n = fieldname.Length; decimal[] num = new decimal[n]; DataRowCollection rows = dtMainTable.Rows; for (int i = 0, m = rows.Count; i < m; i++) { for (int j = 0; j < n; j++) { num[j] += GPFunctions.CDecimal(rows[i][fieldname[j]]); } } StringBuilder sb = new StringBuilder(); for (int k = 0; k < n; k++) { sb.Append(string.Format("{0}: {1} ", displayname[k], num[k])); } labelTotal.Text = sb.ToString(); } private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { /*表格值修改时*/ if (!isDataLoaded) return; DataGridView dgv = this.dataGridView1; int rowIndex = e.RowIndex; int colIndex = e.ColumnIndex; string columnName = dgv.Columns[colIndex].Name; if (string.IsNullOrEmpty(columnName)) return; dgv.CellValueChanged -= dataGridView1_CellValueChanged; double dblValue; decimal overHours, lackHours; DateTime t1, t2; bool ischanged = false; DataGridViewRow dvr = dgv.Rows[rowIndex]; DateTime dateTime = this.dateTimePicker1.Value.Date; MySxbTime sxbTime; TimeSpan ts; switch (columnName) { case "SchedulingTypeName": /*班次调为不可编辑 2020-01-10*/ //intValue = getSchedulingTypeId(dvr.Cells[colIndex].Value.ToString()); //DataView dv = dtSchedulingType.DefaultView; //dv.RowFilter = string.Format("id={0}", intValue); //if (dv.Count > 0) //{ // beginTime = dv[0]["BeginTime"].ToString(); // endTime = dv[0]["EndTime"].ToString(); // dvr.Cells["SchedulingTypeId"].Value = intValue; // dvr.Cells["BeginTime"].Value = beginTime; // dvr.Cells["endTime"].Value = endTime; // hm = GetMyHourMinute(beginTime); // t1 = dateTime.AddHours(hm.hour).AddMinutes(hm.minute); // dvr.Cells["OverTime1"].Value = t1; // dvr.Cells["OverTime2"].Value = t1; // hm = GetMyHourMinute(endTime); // t2 = dateTime.AddHours(hm.hour).AddMinutes(hm.minute); // dvr.Cells["LackTime1"].Value = t2; // dvr.Cells["LackTime2"].Value = t2; //} //dgv.EndEdit(); break; case "OverHours": /*输入加班时数,加班时数应当正数,如果是负数或者0, 就自动调整为空值。 如果存在加班起点,就直接计算加班终点,如果不存在加班起点(说明无班次),就以18点做为加班起点,计算加班终点。*/ overHours = GPFunctions.CDecimal(dvr.Cells[colIndex].Value); if (overHours <= 0) { if (overHours < 0) MessageBox.Show(string.Format("加班时数({0}),请输入非负数。", overHours), "提示信息"); dvr.Cells["OverHours"].Value = DBNull.Value; dvr.Cells["OverTime2"].Value = dvr.Cells["OverTime1"].Value; } else { if (dvr.Cells["OverTime1"].Value == DBNull.Value) { t1 = dateTime.AddHours(18); dvr.Cells["OverTime1"].Value = t1; } else { t1 = GPFunctions.CDate(dvr.Cells["OverTime1"].Value); } dvr.Cells["OverTime2"].Value = t1.AddMinutes((double)overHours * 60); } ischanged = true; dgv.EndEdit(); break; case "LackHours": /*输入缺勤时数,如果存在缺勤终点,就直接计算缺勤起点,如果不存在缺勤终点(说明无班次),就以18点做为终点,计算缺勤起点*/ lackHours = GPFunctions.CDecimal(dvr.Cells[colIndex].Value); if (lackHours <= 0) { if (lackHours < 0) MessageBox.Show(string.Format("缺勤时数({0}),请输入非负数。", lackHours), "提示信息"); dvr.Cells["LackHours"].Value = DBNull.Value; dvr.Cells["OverTime1"].Value = dvr.Cells["OverTime2"].Value; } else { if (dvr.Cells["LackTime2"].Value == DBNull.Value) { t2 = dateTime.AddHours(18); dvr.Cells["LackTime2"].Value = t2; } else { t2 = GPFunctions.CDate(dvr.Cells["LackTime2"].Value); } dblValue = 0 - GPFunctions.CDbl(lackHours) * 60; dvr.Cells["LackTime1"].Value = t2.AddMinutes(dblValue); } ischanged = true; dgv.EndEdit(); break; case "Overtime1": /*输入加班起点时间,如果存在加班小时数,就计算终点时间。 如果不存在加班小时数,存在加班终点,且加班终点大于起点,就计算加班小时数,加班终点不大于起点, 将加班终点时设为加班起点,加班时数为空。*/ t1 = GPFunctions.CDate(dvr.Cells[colIndex].Value); t1 = dateTime.AddHours(t1.Hour).AddMinutes(t1.Minute); dvr.Cells["OverTime1"].Value = t1; overHours = GPFunctions.CDecimal(dvr.Cells["OverHours"].Value); if (overHours.CompareTo(0) > 0) { t2 = t1.AddMinutes((double)overHours * 60); dvr.Cells["OverTime2"].Value = t2; } else { if (dvr.Cells["OverTime2"].Value == DBNull.Value) { dvr.Cells["OverTime2"].Value = t1; dvr.Cells["OverHours"].Value = DBNull.Value; } else { t2 = GPFunctions.CDate(dvr.Cells["OverTime2"].Value); if (t2.CompareTo(t1) > 0) { ts = t2 - t1; overHours = GPFunctions.CDecimal(ts.TotalHours); dvr.Cells["OverHours"].Value = overHours; } else { dvr.Cells["OverTime2"].Value = t1; dvr.Cells["OverHours"].Value = DBNull.Value; } } } ischanged = true; dgv.EndEdit(); break; case "Overtime2": /*输入加班终点时间,如果存在加班起点,就计算加班小时数。 如果不存在加班起点(也一定不存在加班小时数),将加班起点时设为加班终点,加班时数为空。*/ t2 = GPFunctions.CDate(dvr.Cells[colIndex].Value); t2 = dateTime.AddHours(t2.Hour).AddMinutes(t2.Minute); sxbTime.sbTime = GPFunctions.CDate(dvr.Cells["BeginTime2"].Value); if (t2.CompareTo(sxbTime.sbTime) < 0) { t2 = t2.AddDays(1); } dvr.Cells["OverTime2"].Value = t2; if (dvr.Cells["OverTime1"].Value == DBNull.Value) { dvr.Cells["OverTime1"].Value = t2; dvr.Cells["OverHours"].Value = DBNull.Value; } else { t1 = GPFunctions.CDate(dvr.Cells["OverTime1"].Value); if (t2.CompareTo(t1) <= 0) { dvr.Cells["OverTime2"].Value = t1; dvr.Cells["OverHours"].Value = DBNull.Value; } else { ts = t2 - t1; overHours = GPFunctions.CDecimal(ts.TotalHours); dvr.Cells["OverHours"].Value = overHours; } } ischanged = true; dgv.EndEdit(); break; case "LackTime1": /*输入缺勤起点时间,如果存在缺勤终点,就计算缺勤小时数。如果不存在缺勤终点(缺勤小时数也一定不存在),将缺勤终点设为缺勤起点,缺勤小时数为空。*/ t1 = GPFunctions.CDate(dvr.Cells[colIndex].Value); t1 = dateTime.AddHours(t1.Hour).AddMinutes(t1.Minute); dvr.Cells["LackTime1"].Value = t1; if (dvr.Cells["LackTime2"].Value == DBNull.Value) { dvr.Cells["LackTime2"].Value = t1; dvr.Cells["LackHours"].Value = DBNull.Value; } else { t2 = GPFunctions.CDate(dvr.Cells["LackTime2"].Value); if (t2.CompareTo(t1) <= 0) { dvr.Cells["LackTime2"].Value = t1; dvr.Cells["LackHours"].Value = DBNull.Value; } else { ts = t2 - t1; lackHours = GPFunctions.CDecimal(ts.TotalHours); dvr.Cells["LackHours"].Value = lackHours; } } ischanged = true; dgv.EndEdit(); break; case "LackTime2": /*输入缺勤终点时间,如果存在缺勤小时数,就计算缺勤起点。 如果不存在缺勤小时数,存在缺勤起点,就计算缺勤小时数。如果不存在缺勤起点(缺勤小时数也一定不存在),将缺勤起点设为缺勤终点,缺勤小时数为空。*/ t2 = GPFunctions.CDate(dvr.Cells[colIndex].Value); t2 = dateTime.AddHours(t2.Hour).AddMinutes(t2.Minute); sxbTime.sbTime = GPFunctions.CDate(dvr.Cells["BeginTime2"].Value); if (t2.CompareTo(sxbTime.sbTime) < 0) t2 = t2.AddDays(1); dvr.Cells["LackTime2"].Value = t2; lackHours = GPFunctions.CDecimal(dvr.Cells["LackHours"].Value); if (lackHours.CompareTo(0) > 0) { t1 = t2.AddMinutes((double)lackHours * (-1) * 60); dvr.Cells["LackTime1"].Value = t1; } else { if (dvr.Cells["LackTime1"].Value == DBNull.Value) { dvr.Cells["LackHours"].Value = DBNull.Value; dvr.Cells["LackTime1"].Value = t2; } else { t1 = GPFunctions.CDate(dvr.Cells["LackTime1"].Value); if (t2.CompareTo(t1) <= 0) { dvr.Cells["LackTime1"].Value = t2; dvr.Cells["LackHours"].Value = DBNull.Value; } else { ts = t2 - t1; lackHours = GPFunctions.CDecimal(ts.TotalHours); dvr.Cells["LackHours"].Value = lackHours; } } } ischanged = true; dgv.EndEdit(); break; default: break; } if (ischanged) { DisplayTotalInfo(new string[] { "OverHours", "LackHours" }, new string[] { "加班小时数", "缺勤小时数" }); } dgv.CellValueChanged += dataGridView1_CellValueChanged; } /// /// 保存数据 /// private void SaveData() { System.Data.DataTable dataTable = dtMainTable.Clone(); int n = dtMainTable.Rows.Count; string[] columns = new string[] { "WorkerId", "SchedulingDate", "WorkersType", "SchedulingTypeId", "BeginTime", "EndTime", "OverHours", "LackHours", "OverTime1", "OverTime2", "LackTime1", "LackTime2" }; for (int i = 0; i < n; i++) { DataRow dr, dr2; dr = dtMainTable.Rows[i]; int overHours = GPFunctions.CInt(dr["OverHours"]); int lackHours = GPFunctions.CInt(dr["LackHours"]); if (overHours > 0 || lackHours > 0) { dr2 = dataTable.NewRow(); GPFunData.CopyDataRow(dr, dr2, columns); dataTable.Rows.Add(dr2); } } n = dataTable.Rows.Count; if (n == 0) return; DateTime dateTime = Convert.ToDateTime(dataTable.Rows[0]["SchedulingDate"]); try { dbHelper.BeginTransaction(); n = dbHelper.Execute(string.Format("delete ScheduleOverLackHours where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime))); n = dbHelper.DataTableSave(dataTable, "SELECT Id, WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2 from ScheduleOverLackHours"); dbHelper.Commit(); dtMainTable.AcceptChanges(); MessageBox.Show("保存成功。", "提示信息"); } catch (Exception ex) { dbHelper.RollBack(); MessageBox.Show("保存失败:" + ex.Message, "提示信息"); } } /// /// 检查数据的合理性 /// /// private bool CheckData() { bool isOverChecked = chxOverTime.Checked; bool isLackChecked = chxLackTime.Checked; if ((!isOverChecked) && (!isLackChecked)) return true; DataGridView dgv = this.dataGridView1; int rowCount = dgv.Rows.Count; bool isok = true; for (int i = 0; i < rowCount; i++) { int overHours, lackHours; MySxbTime sxbTime; DateTime overTime1, overTime2, lackTime1, lackTime2; DataGridViewCellCollection cells = dgv.Rows[i].Cells; sxbTime.sbTime = GPFunctions.CDate(cells["BeginTime2"].Value); sxbTime.xbTime = GPFunctions.CDate(cells["EndTime2"].Value); if (sxbTime.sbTime.CompareTo(sxbTime.xbTime) == 0) { continue; } /*检查加班时间*/ if (isOverChecked) { overHours = GPFunctions.CInt(cells["OverHours"].Value); if (overHours > 0) { overTime1 = GPFunctions.CDate(cells["OverTime1"].Value); overTime2 = GPFunctions.CDate(cells["OverTime2"].Value); if (overTime1.CompareTo(sxbTime.sbTime) >= 0 && overTime1.CompareTo(sxbTime.xbTime) < 0) { MessageBox.Show("加班起点不能在上下班时间内。", "提示信息"); dgv.CurrentCell = dgv.Rows[i].Cells["OverTime1"]; isok = false; break; } if (overTime2.CompareTo(sxbTime.sbTime) > 0 && overTime2.CompareTo(sxbTime.xbTime) <= 0) { dgv.CurrentCell = dgv.Rows[i].Cells["OverTime1"]; MessageBox.Show("加班终点不能在上下班时间内。", "提示信息"); isok = false; break; } } } /*检查加班时间*/ if (isLackChecked) { lackHours = GPFunctions.CInt(cells["LackHours"].Value); if (lackHours > 0) { lackTime1 = GPFunctions.CDate(cells["LackTime1"].Value); lackTime2 = GPFunctions.CDate(cells["LackTime2"].Value); if (lackTime1.CompareTo(sxbTime.sbTime) <= 0 || lackTime1.CompareTo(sxbTime.xbTime) > 0) { dgv.CurrentCell = dgv.Rows[i].Cells["LackTime1"]; MessageBox.Show("缺勤起点不能在上下班时间外。", "提示信息"); isok = false; break; } if (lackTime2.CompareTo(sxbTime.sbTime) < 0 || lackTime2.CompareTo(sxbTime.xbTime) > 0) { dgv.CurrentCell = dgv.Rows[i].Cells["LackTime2"]; MessageBox.Show("缺勤终点不能在上下班时间外。", "提示信息"); isok = false; break; } } } } return isok; } private void btnSave_Click(object sender, EventArgs e) { /*保存数据*/ if (!CheckData()) { return; } SaveData(); } private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { } private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { DataGridView dgv = this.dataGridView1; int rowIndex = e.RowIndex; int colIndex = e.ColumnIndex; string columnName = dgv.Columns[colIndex].Name; if (string.IsNullOrEmpty(columnName)) return; DateTime t, dateTime; dateTime = this.dateTimePicker1.Value.Date; switch (columnName) { case "Overtime1": t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value); if (t.CompareTo(dateTime) < 0) { t = dateTime; dgv.Rows[rowIndex].Cells[colIndex].Value = t; } break; case "Overtime2": t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value); if (t.CompareTo(dateTime) < 0) { t = dateTime; dgv.Rows[rowIndex].Cells[colIndex].Value = t; } break; case "LackTime1": t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value); if (t.CompareTo(dateTime) < 0) { t = dateTime; dgv.Rows[rowIndex].Cells[colIndex].Value = t; } break; case "LackTime2": t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value); if (t.CompareTo(dateTime) < 0) { t = dateTime; dgv.Rows[rowIndex].Cells[colIndex].Value = t; } break; default: break; } } private void btnPrint_Click(object sender, EventArgs e) { /*打印出缺勤表*/ DateTime dateTime = this.dateTimePicker1.Value; int year = dateTime.Year; int month = dateTime.Month; DateTime monthFirstDay = new DateTime(year, month, 1); DateTime nextMonthFirstDay = monthFirstDay.AddMonths(1); int dayMax = nextMonthFirstDay.AddDays(-1).Day; string sql = string.Format("SELECT a.WorkerId, w.[Name], Day(a.SchedulingDate) as [Day], a.WorkersType, a.OverHours, a.LackHours FROM ScheduleOverLackHours a inner join Person w on a.WorkerId = w.id WHERE SchedulingDate >= '{0}' AND SchedulingDate<'{1}' order by WorkersType desc, w.PersonOrder, [Day]", GPFunctions.DateStr(monthFirstDay), GPFunctions.DateStr(nextMonthFirstDay)); System.Data.DataTable dataTable = dbHelper.GetDataTable(sql); GoldPrinter.ExcelAccess excel = new GoldPrinter.ExcelAccess(); excel.IsVisibledExcel = false; string filepath = string.Format("{0}\\Template\\职工出缺勤表.xlt", System.Windows.Forms.Application.StartupPath); excel.Open(filepath); Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.Workbooks.ActiveSheet; string strTitle; strTitle = PublicMethod.HospitalName + "职工出(缺)勤表"; excel.SetCellText(1, "A", strTitle); excel.SetCellText(2, "E", string.Format("{0} 年 {1} 月", year, month)); int rowsCount = dataTable.Rows.Count; decimal sumOverHours = 0, sumLackHours = 0; int prewWorkId = 0; int workerNumber = 0; int rowsNumber = 0; Microsoft.Office.Interop.Excel.Range range; switch (dayMax) { case 30: ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0; break; case 29: ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0; ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 32]).EntireColumn.ColumnWidth = 0; break; case 28: ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0; ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 32]).EntireColumn.ColumnWidth = 0; ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 31]).EntireColumn.ColumnWidth = 0; break; default: break; } for (int i = 0; i < rowsCount; i++) { decimal overHours, lackHours; DataRow dr = dataTable.Rows[i]; int workerId = Convert.ToInt32(dr["WorkerId"]); int day = Convert.ToInt32(dr["Day"]); overHours = GPFunctions.CDecimal(dr["OverHours"]); lackHours = GPFunctions.CDecimal(dr["LackHours"]); if (workerId == prewWorkId) { sumOverHours += overHours; sumLackHours += lackHours; } else { /*合并姓名单元格, 填入名称*/ workerNumber++; rowsNumber = 4 + (workerNumber - 1) * 2; range = xlSheet.Range[xlSheet.Cells[rowsNumber, 1], xlSheet.Cells[rowsNumber + 1, 1]]; range.Merge(System.Reflection.Missing.Value); xlSheet.Cells[rowsNumber, 1] = dr["Name"].ToString(); xlSheet.Cells[rowsNumber, 2] = "加班"; xlSheet.Cells[rowsNumber + 1, 2] = "缺勤"; range = xlSheet.Range[xlSheet.Cells[rowsNumber, "AI"], xlSheet.Cells[rowsNumber + 1, "AI"]]; range.Merge(System.Reflection.Missing.Value); /*设置缺勤行字体颜色*/ rowsNumber = rowsNumber + 1; range = xlSheet.Range[xlSheet.Cells[rowsNumber, 2], xlSheet.Cells[rowsNumber, 34]]; range.Font.Color = Color.Red; //红色 if (workerNumber > 1) { /*填写上一个职工行的合计数*/ rowsNumber = 4 + (workerNumber - 2) * 2; if (sumOverHours > 0) xlSheet.Cells[rowsNumber, "AH"] = sumOverHours; if (sumLackHours > 0) xlSheet.Cells[rowsNumber + 1, "AH"] = sumLackHours; /*合并累计单元格*/ xlSheet.Cells[rowsNumber, "AI"] = sumOverHours - sumLackHours; if (sumOverHours - sumLackHours < 0) { /*累计小于0,红色显示*/ range.Font.Color = Color.Red; //红色 } } sumOverHours = overHours; sumLackHours = lackHours; prewWorkId = workerId; } /*填入加班和缺勤缺勤小时数*/ rowsNumber = 4 + (workerNumber - 1) * 2; if (overHours > 0) xlSheet.Cells[rowsNumber, 2 + day] = overHours; if (lackHours > 0) xlSheet.Cells[rowsNumber + 1, 2 + day] = lackHours; System.Windows.Forms.Application.DoEvents(); } if (workerNumber > 0) { /*填写最后一个职工行的合计数*/ rowsNumber = 4 + (workerNumber - 1) * 2; if (sumOverHours > 0) xlSheet.Cells[rowsNumber, "AH"] = sumOverHours; if (sumLackHours > 0) xlSheet.Cells[rowsNumber + 1, "AH"] = sumLackHours; xlSheet.Cells[rowsNumber, "AI"] = sumOverHours - sumLackHours; if (sumOverHours - sumLackHours < 0) { /*累计小于0,红色显示*/ range = xlSheet.Range[xlSheet.Cells[rowsNumber, "AI"], xlSheet.Cells[rowsNumber, "AI"]]; range.Font.Color = Color.Red; //红色 } } excel.PrintPreview(); excel.Close(); } /// /// 导出Excel /// /// 文件路径 /// 控件DataGridView public static void ExportToExcel(string fileName, DataGridView gridView, int[] excludeColcumns = null) { int rowsCount = gridView.Rows.Count; if (rowsCount == 0) { MessageBox.Show("没有数据", "提示信息"); return; } string saveFileName = ""; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "xls"; saveDialog.Filter = "Excel文件|*.xls"; saveDialog.FileName = fileName; saveDialog.ShowDialog(); saveFileName = saveDialog.FileName; if (saveFileName.IndexOf(":") < 0) return; //被点了取消 if (saveFileName == "") return; Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) { MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel"); return; } Workbooks workbooks = xlApp.Workbooks; Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet); //取得sheet1 Worksheet worksheet = (Worksheet)workbook.ActiveSheet; //写入标题 int colLen = gridView.ColumnCount; List list = new List(); for (int i = 0; i < colLen; i++) { bool isok = gridView.Columns[i].Visible; MyIntInt o; if (isok) { if (excludeColcumns != null) { if (Array.IndexOf(excludeColcumns, i) >= 0) { isok = false; } } } if (isok) { o = new MyIntInt(); o.Key = i; o.Val = gridView.Columns[i].Width; list.Add(o); } } int col = 0; foreach (MyIntInt o in list) { col++; worksheet.Cells[1, col] = gridView.Columns[o.Key].HeaderText; Microsoft.Office.Interop.Excel.Range range = worksheet.Range[worksheet.Cells[1, col], worksheet.Cells[1, col]]; range.ColumnWidth = o.Val > 200 ? 200 : o.Val; } //写入数值 for (int r = 0, n = rowsCount; r < n; r++) { col = 0; foreach (MyIntInt o in list) { col++; worksheet.Cells[r + 2, col] = gridView.Rows[r].Cells[o.Key].Value; } System.Windows.Forms.Application.DoEvents(); } worksheet.Columns.EntireColumn.AutoFit();//列宽自适应 try { workbook.Saved = true; workbook.SaveCopyAs(saveFileName); } catch (Exception ex) { MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message, "提示信息"); } xlApp.Quit(); GC.Collect();//强行销毁 MessageBox.Show("文件: " + saveFileName + " 保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } public class MyIntInt { public int Key { get; set; } public int Val { get; set; } } }