【ClosedXML】C#でOfficeのファイルを操作【その3】

台風11号でえらい目にあった管理人Aです。

それでは、前回に続きClosedXMLのコード部分を順に述べていきます。

とりあえず、前提条件と実現したいことのおさらいです。

【前提条件】
・社内共通フォーマットの日報がある
・扱うファイル形式は「*.xlsx」で1ブック1シート
 ⇒1ブックで1月分
・土日の行は休みなのでグレーアウト(するマクロが組み込まれているらしい)
・「案件名」、「開始時刻」、「終了時刻」はドロップダウンリスト(セル参照)で選択
【実現したいこと】
①共通フォーマットを基に1ブック12シートの「*.xlsx」を作成する
 ⇒1ブックで1年分
②年月日に対応する曜日を埋める
③土日に加えて祝日の行をグレーアウトする
 ⇒2016年以降に施行される「山の日」も対応
④①~③を実現するユーザインタフェースの作成

それでは、【実現したいこと】の②③のコード部分です。

 

【動作イメージ】
aboutclosedxml1_2

動作イメージです。

 

【コード】

※コードは必要最小限にしています。。。

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」についてつらつらとする予定です。

コメントを残す

メールアドレスが公開されることはありません。