台風11号でえらい目にあった管理人Aです。
それでは、前回に続きClosedXMLのコード部分を順に述べていきます。
とりあえず、前提条件と実現したいことのおさらいです。
【前提条件】 ・社内共通フォーマットの日報がある ・扱うファイル形式は「*.xlsx」で1ブック1シート ⇒1ブックで1月分 ・土日の行は休みなのでグレーアウト(するマクロが組み込まれているらしい) ・「案件名」、「開始時刻」、「終了時刻」はドロップダウンリスト(セル参照)で選択
【実現したいこと】①共通フォーマットを基に1ブック12シートの「*.xlsx」を作成する ⇒1ブックで1年分②年月日に対応する曜日を埋める ③土日に加えて祝日の行をグレーアウトする ⇒2016年以降に施行される「山の日」も対応④①~③を実現するユーザインタフェースの作成
それでは、【実現したいこと】の②③のコード部分です。
【動作イメージ】
動作イメージです。
【コード】
※コードは必要最小限にしています。。。 SaveFileDialog sFD = new SaveFileDialog(); // ダイアログ諸設定 sFD.Filter = "XLSXファイル|*.xlsx"; sFD.DefaultExt = "XLSX"; ~ try { // 雛型ファイルを開き、それをベースに日報ファイルを作成 using(var wb = new XLWorkbook(textBox1.Text)) { using(var wbSource = new XLWorkbook(textBox1.Text)) { // WorkSheetをWorkBookオブジェクトに追加 for (int i = 1; i <= 12; i++) { // 雛型ファイルのシートを12か月分コピーする wbSource.Worksheet(1).CopyTo(wb, comboBox1.Text + "年" + i.ToString() + "月度", i + 1); // WorkSheetオブジェクト var ws = wb.Worksheet(i + 1); // シートの年月から日数を取得 int iDays = DateTime.DaysInMonth(int.Parse(comboBox1.Text), i);-① for (int j = 3; j <= 33; j++)-② { if (j < iDays + 3) { DateTime dt = new DateTime(int.Parse(comboBox1.Text), i, j - 2);-③ // 曜日の埋め込み ws.Cell("B" + j.ToString()).Value = dt.ToString("ddd");-④ // 土日祝日判定-⑤ if (clsHolidayChecker.Holiday(dt).holiday != clsHolidayChecker.HolidayInfo.HOLIDAY.WEEKDAY) { // 土日祝日の場合、セルの背景色を変更 ws.Range("A" + j.ToString() + ":" + "G" + j.ToString()).Style.Fill.BackgroundColor = XLColor.LightGray;-⑥ } } else { // 日 ws.Cell("A" + j.ToString()).Value = ""; } } } } // 雛型ファイルのシートを削除する wb.Worksheet(1).Delete(); // 作業内容を保存 wb.SaveAs(sFD.FileName); } // 正常メッセージ ~ } catch (Exception ex) { // 異常メッセージ ~ // ダイアログ破棄 sFD.Dispose(); }
【日報作成】ボタンを押した時のコードです。
【解説】
①で対象年月の一月あたりの日数を取得します。
DateTime.DaysInMonthメソッドのパラメータで、
・パラメータ1:年(西暦)
・パラメータ2:月
②ワークシートの3~33行目まで1日~31日になっています。
③で対象年月日のインスタンスを初期化しています。
④ 【左辺】 「どのセルに?」、「値」をセットするかの情報を与えています。 ・「どのセルに?」ws.Cell(パラメータ).Value・「値」のセット先ws.Cell("B" + j.ToString()).Value 【右辺】 対象年月日の「曜日の省略名」を取得しています。 ちなみに、ToStringメソッドのパラメータについてですが、 ・"d":日にち (1~31) ・"dd":日にち (01~31) 0埋めです ・"ddd":曜日の省略名(月、…、日) ・"dddd":曜日の完全な名前(月曜日、…、日曜日)
⑤で土日祝日判定しています。こちらは諸事情により公開できません。m(__)m
2016年8月11日(山の日)にも対応済みで、振替休日判定もしています。
⑥ 【左辺】 「どこからどこまでのセルを?」、「セルの背景色」を指定しています。 ・「どこからどこまでのセルを?」ws.Range("A" + j.ToString() + ":" + "G" + j.ToString()).Style.Fill.BackgroundColorセルを範囲指定します。 ・「セルの背景色」ws.Range("A" + j.ToString() + ":" + "G" + j.ToString()).Style.Fill.BackgroundColor
かいつまんでですが、対象年月日の曜日の埋め込みと土日祝日行のグレーアウトでした。
次回からは「OpenXML」についてつらつらとする予定です。