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

梅雨で憂鬱な管理人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);-
   }
  }

  // 雛型ファイルのシートを削除する
  wb.Worksheet(1).Delete();-
  // 作業内容を保存
  wb.SaveAs(sFD.FileName);
 }
 // 正常メッセージ
 ~
}
catch (Exception ex)
{
 // 異常メッセージ
 ~
 // ダイアログ破棄
 sFD.Dispose();
}

【日報作成】ボタンを押した時のコードです。

チェック処理は省いています。

【解説】

ファイルダイアログのフィルターとデフォルト拡張子は「*.xlsx」で。
「ClosedXML」はExcel2007以降対応なので。。。
※無理矢理「*.xls」で作成しようとすると、エラーになります。試してみましょう。
ワーク用Excelファイルオープン
ここでしかファイルを操作しないので、usingしましょう。

続いてコピー元Excelファイルオープン
このファイルもここでしかファイルを操作しないので、usingしましょう。
※②③のパラメータに同じファイルを指定していますが、12ヶ月のシートを作成した後の罫線の状態がおかしいので、同じファイルを指定しています。本来であれば、

・②のパラメータなし
・③の前にワーク用Excelファイルに新規シート追加

例えば、
wb.Worksheets.Add("dummy");
みたいにダミーシートを追加がよいかと。。。
でコピー元Excelファイルのシートをワーク用Excelファイルに12回コピー追加しています。ちなみに

wbSource.Worksheet(1)

下線部分はコピー元Excelファイルのシートを指定しています。

CopyToメソッドのパラメータで、

・パラメータ1:コピー先ワークブックオブジェクト
・パラメータ2:コピーするワークシートの名称
・パラメータ3:コピーするワークシートの順序

一つのメソッドで簡単にシートがコピーできます。
でワーク用Excelファイルの先頭シートがコピー元Excelファイルのものですので削除。

 

かいつまんでですが、まずは1年分のExcelファイルの作成方法でした。

コメントを残す

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