///-------------------------------------------------------------- /// <summary> /// シートの日付欄をセットする </summary> /// <param name="rtnArray"> /// 日付配列</param> /// <param name="cld"> /// 日付配列クラス</param> ///-------------------------------------------------------------- private void setDayToSheet(object[,] rtnArray, clsDays cld) { int sRow = 31; for (int i = 0; i < 31; i++) { if (i < 16) { rtnArray[sRow, 5] = cld.dl[i]; rtnArray[sRow + 3, 5] = cld.dw[i]; } else { rtnArray[sRow, 103] = cld.dl[i]; rtnArray[sRow + 3, 103] = cld.dw[i]; } if (i == 15) { sRow = 31; } else { sRow += 6; } } }
///------------------------------------------------------------------- /// <summary> /// 日付配列を作成 </summary> /// <param name="cld"> /// 日付配列クラス</param> /// <param name="shime"> /// 締日</param> /// <param name="zDt"> /// 開始月の前月(勤怠記入開始日の月)</param> /// <param name="nDt"> /// 開始月</param> ///------------------------------------------------------------------- private void setDayArray(clsDays cld, string shime, DateTime zDt, DateTime nDt) { int idl = 0; int iZ = 1; DateTime gDt; while (idl < 31) { int day = Utility.StrtoInt(shime) + iZ; if (DateTime.TryParse(zDt.Year.ToString() + "/" + zDt.Month.ToString() + "/" + day.ToString(), out gDt)) { cld.dl[idl] = gDt.Month.ToString().PadLeft(2, ' ') + "/" + gDt.Day.ToString().PadLeft(2, '0'); cld.dw[idl] = "(" + ("日月火水木金土").Substring(int.Parse(gDt.DayOfWeek.ToString("d")), 1) + ")"; } else { cld.dl[idl] = string.Empty; cld.dw[idl] = string.Empty; } if (day == 31) { iZ = 1; shime = ""; zDt = nDt; } else { iZ++; } idl++; } }
///-------------------------------------------------------------------- /// <summary> /// シートの訂正欄日付をセットする </summary> /// <param name="rtnArray"> /// 日付配列</param> /// <param name="cld"> /// 日付配列クラス</param> /// <param name="oxls"> /// アクティブなエクセルシート</param> ///-------------------------------------------------------------------- private void setDayToSheet2(object[,] rtnArray, clsDays cld, Excel.Worksheet oxls) { // 下部日付欄をセット int sCol = 15; for (int i = 0; i < 31; i++) { if (cld.dl[i] != string.Empty) { rtnArray[129, sCol] = Utility.StrtoInt(cld.dl[i].Substring(3, 2)).ToString(); } else { // 空白欄の背景色を変える Excel.Range aRng = (Excel.Range)oxls.Cells[129, sCol]; oxls.get_Range(aRng, aRng).Interior.ColorIndex = 15; } sCol += 6; } }
///---------------------------------------------------------------------- /// <summary> /// 出勤簿印刷処理 </summary> /// <param name="dg"> /// DataGridViewオブジェクト</param> ///---------------------------------------------------------------------- private void prnSheet(DataGridView dg) { string kihonWorkTime = Properties.Settings.Default.基本実労時 + Properties.Settings.Default.基本実労分.PadLeft(2, '0'); // 印刷開始月 DateTime nDt; // 印刷終了月 DateTime eDt = DateTime.Parse(txtEyear.Text + "/" + txtEmonth.Text + "/01"); DateTime zDt; //マウスポインタを待機にする this.Cursor = Cursors.WaitCursor; // Excel起動 string sAppPath = System.AppDomain.CurrentDomain.BaseDirectory; Excel.Application oXls = new Excel.Application(); Excel.Workbook oXlsBook = (Excel.Workbook)(oXls.Workbooks.Open(Properties.Settings.Default.xlsFAX出勤簿, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)); Excel.Worksheet oxlsSheet = (Excel.Worksheet)oXlsBook.Sheets[1]; Excel.Worksheet oxlsMsSheet = (Excel.Worksheet)oXlsBook.Sheets[1]; // テンプレートシート oxlsSheet.Select(Type.Missing); Excel.Range rng = null; Excel.Range[] aRng = new Excel.Range[3]; int pCnt = 1; // ページカウント object[,] rtnArray = null; try { // スタッフ foreach (DataGridViewRow r in dg.Rows) { // チェックされているスタッフを対象とする if (dataGridView1[colChk, r.Index].Value.ToString() == "False") { continue; } nDt = DateTime.Parse(txtSyear.Text + "/" + txtSmonth.Text + "/01"); // 年月指定範囲でループさせる while (true) { // テンプレートシートを追加する pCnt++; oxlsMsSheet.Copy(Type.Missing, oXlsBook.Sheets[pCnt - 1]); oxlsSheet = (Excel.Worksheet)oXlsBook.Sheets[pCnt]; // シートのセルを一括して配列に取得します rng = oxlsMsSheet.Range[oxlsMsSheet.Cells[1, 1], oxlsMsSheet.Cells[oxlsMsSheet.UsedRange.Rows.Count, oxlsMsSheet.UsedRange.Columns.Count]]; rtnArray = (object[, ])rng.Value2; // 年 rtnArray[3, 14] = nDt.Year.ToString().Substring(2, 1); rtnArray[3, 20] = nDt.Year.ToString().Substring(3, 1); // 月 rtnArray[3, 32] = nDt.Month.ToString().PadLeft(2, '0').Substring(0, 1); rtnArray[3, 38] = nDt.Month.ToString().PadLeft(2, '0').Substring(1, 1); // 氏名 rtnArray[5, 18] = dg[colSName, r.Index].Value.ToString(); // スタッフ№ rtnArray[6, 106] = dg[colSCode, r.Index].Value.ToString().Substring(0, 1); rtnArray[6, 112] = dg[colSCode, r.Index].Value.ToString().Substring(1, 1); rtnArray[6, 118] = dg[colSCode, r.Index].Value.ToString().Substring(2, 1); rtnArray[6, 124] = dg[colSCode, r.Index].Value.ToString().Substring(3, 1); rtnArray[6, 130] = dg[colSCode, r.Index].Value.ToString().Substring(4, 1); // 日給者 if (dg[colKyuyoKbn, r.Index].Value.ToString() == global.NIKKYU) { // 基本労働時間 if (dg[colWorkTime, r.Index].Value.ToString() != string.Empty) { rtnArray[6, 169] = dg[colWorkTime, r.Index].Value.ToString().Substring(1, 1); rtnArray[6, 175] = dg[colWorkTime, r.Index].Value.ToString().Substring(3, 1); rtnArray[6, 181] = dg[colWorkTime, r.Index].Value.ToString().Substring(4, 1); } // 基本就業時間帯1 string tm = dg[colTime1, r.Index].Value.ToString(); if (tm.Length > 10) { rtnArray[18, 29] = tm.Substring(0, 1); rtnArray[18, 35] = tm.Substring(1, 1); rtnArray[18, 41] = tm.Substring(3, 1); rtnArray[18, 47] = tm.Substring(4, 1); rtnArray[18, 57] = tm.Substring(6, 1); rtnArray[18, 63] = tm.Substring(7, 1); rtnArray[18, 69] = tm.Substring(9, 1); rtnArray[18, 75] = tm.Substring(10, 1); } // 基本就業時間帯2 tm = dg[colTime2, r.Index].Value.ToString(); if (tm.Length > 10) { rtnArray[18, 88] = tm.Substring(0, 1); rtnArray[18, 94] = tm.Substring(1, 1); rtnArray[18, 100] = tm.Substring(3, 1); rtnArray[18, 106] = tm.Substring(4, 1); rtnArray[18, 116] = tm.Substring(6, 1); rtnArray[18, 122] = tm.Substring(7, 1); rtnArray[18, 128] = tm.Substring(9, 1); rtnArray[18, 134] = tm.Substring(10, 1); } // 基本就業時間帯3 tm = dg[colTime3, r.Index].Value.ToString(); if (tm.Length > 10) { rtnArray[18, 147] = tm.Substring(0, 1); rtnArray[18, 153] = tm.Substring(1, 1); rtnArray[18, 159] = tm.Substring(3, 1); rtnArray[18, 165] = tm.Substring(4, 1); rtnArray[18, 175] = tm.Substring(6, 1); rtnArray[18, 181] = tm.Substring(7, 1); rtnArray[18, 187] = tm.Substring(9, 1); rtnArray[18, 193] = tm.Substring(10, 1); } } else if (dg[colKyuyoKbn, r.Index].Value.ToString() == global.JIKKYU) // 時給者 { // 基本労働時間 rtnArray[6, 169] = "*"; rtnArray[6, 175] = "*"; rtnArray[6, 181] = "*"; // 基本就業時間帯1 rtnArray[18, 29] = "*"; rtnArray[18, 35] = "*"; rtnArray[18, 41] = "*"; rtnArray[18, 47] = "*"; rtnArray[18, 57] = "*"; rtnArray[18, 63] = "*"; rtnArray[18, 69] = "*"; rtnArray[18, 75] = "*"; // 基本就業時間帯2 rtnArray[18, 88] = "*"; rtnArray[18, 94] = "*"; rtnArray[18, 100] = "*"; rtnArray[18, 106] = "*"; rtnArray[18, 116] = "*"; rtnArray[18, 122] = "*"; rtnArray[18, 128] = "*"; rtnArray[18, 134] = "*"; // 基本就業時間帯3 rtnArray[18, 147] = "*"; rtnArray[18, 153] = "*"; rtnArray[18, 159] = "*"; rtnArray[18, 165] = "*"; rtnArray[18, 175] = "*"; rtnArray[18, 181] = "*"; rtnArray[18, 187] = "*"; rtnArray[18, 193] = "*"; } // 所属店名 rtnArray[11, 25] = dg[colShopName, r.Index].Value.ToString(); // 所属店コード rtnArray[12, 169] = dg[colShopCode, r.Index].Value.ToString().Substring(0, 1); rtnArray[12, 175] = dg[colShopCode, r.Index].Value.ToString().Substring(1, 1); rtnArray[12, 181] = dg[colShopCode, r.Index].Value.ToString().Substring(2, 1); rtnArray[12, 187] = dg[colShopCode, r.Index].Value.ToString().Substring(3, 1); rtnArray[12, 193] = dg[colShopCode, r.Index].Value.ToString().Substring(4, 1); // 開始月 zDt = nDt.AddMonths(-1); // 締日 string shime = dg[colShimebi, r.Index].Value.ToString(); if (shime != global.SHIME_15 && shime != global.SHIME_20) { // 締日記入がないものは15日締とする shime = global.SHIME_15; } // 締日による制御 if (shime == global.SHIME_15) { // 15日締 // 締切文言 rtnArray[25, 103] = "※ 締切 毎月16日~翌15日 ※ 送信締切日:17日迄"; // 訂正欄月区切り罫線 aRng[0] = (Excel.Range)oxlsSheet.Cells[128, 111]; aRng[1] = (Excel.Range)oxlsSheet.Cells[130, 111]; oxlsSheet.get_Range(aRng[0], aRng[1]).Borders.get_Item(Excel.XlBordersIndex.xlEdgeLeft).LineStyle = Excel.XlLineStyle.xlContinuous; // 訂正欄月表示 rtnArray[128, 57] = zDt.Month.ToString(); rtnArray[128, 63] = "月"; rtnArray[128, 147] = nDt.Month.ToString(); rtnArray[128, 153] = "月"; } else { // 20日締 // 締切文言 rtnArray[25, 103] = "※ 締切 毎月21日~翌20日 ※ 送信締切日:22日迄"; // 訂正欄月区切り罫線 aRng[0] = (Excel.Range)oxlsSheet.Cells[128, 81]; aRng[1] = (Excel.Range)oxlsSheet.Cells[130, 81]; oxlsSheet.get_Range(aRng[0], aRng[1]).Borders.get_Item(Excel.XlBordersIndex.xlEdgeLeft).LineStyle = Excel.XlLineStyle.xlContinuous; // 訂正欄月表示 rtnArray[128, 39] = zDt.Month.ToString(); rtnArray[128, 45] = "月"; rtnArray[128, 135] = nDt.Month.ToString(); rtnArray[128, 141] = "月"; } // 日付配列クラスを作成 clsDays cld = new clsDays(); setDayArray(cld, shime, zDt, nDt); // 日付をセット setDayToSheet(rtnArray, cld); // 下部日付欄をセット setDayToSheet2(rtnArray, cld, oxlsSheet); // 配列からシートセルに一括してデータをセットします rng = oxlsSheet.Range[oxlsSheet.Cells[1, 1], oxlsSheet.Cells[oxlsSheet.UsedRange.Rows.Count, oxlsSheet.UsedRange.Columns.Count]]; rng.Value2 = rtnArray; // 年月範囲を超えたらループからぬける nDt = nDt.AddMonths(1); bool nxt = true; switch (nDt.CompareTo(eDt)) { case -1: // 期限内 nxt = true; break; case 0: // 期限日と同日 nxt = true; break; case 1: // 期限日超過 nxt = false; break; } if (!nxt) { break; } } } // 確認のためExcelのウィンドウを表示する //oXls.Visible = true; // 1枚目はテンプレートシートなので印刷時には削除する oXls.DisplayAlerts = false; oXlsBook.Sheets[1].Delete(); //System.Threading.Thread.Sleep(1000); // 印刷 oXlsBook.PrintOut(); // 終了メッセージ MessageBox.Show("終了しました"); } catch (Exception e) { MessageBox.Show(e.Message, "印刷処理", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } finally { // ウィンドウを非表示にする oXls.Visible = false; // 保存処理 oXls.DisplayAlerts = false; // Bookをクローズ oXlsBook.Close(Type.Missing, Type.Missing, Type.Missing); // Excelを終了 oXls.Quit(); // COM オブジェクトの参照カウントを解放する System.Runtime.InteropServices.Marshal.ReleaseComObject(oxlsMsSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(oxlsSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(oXlsBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(oXls); oXls = null; oXlsBook = null; oxlsSheet = null; oxlsMsSheet = null; GC.Collect(); //マウスポインタを元に戻す this.Cursor = Cursors.Default; } }