梅雨で憂鬱な管理人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);-④ } } // 雛型ファイルのシートを削除する 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ファイルの作成方法でした。