【VB.NET】ClosedXML:テーブルの作成(2)

MEMO
  • この記事は GitHub - ClosedXML - Wiki を参考に書かせていただいたものですが、C# から VB.NET への書き換えをし、英語から日本語へ翻訳しただけでなく、元記事の構成・コード・コメント等を変更している場合もありますのでご了承ください。
  • 現在 ClosedXML のメンテナンスをご担当されている Francois Botha 様からの掲載許可もいただいてます。
  • この記事のコードサンプルについては、Imports ClosedXML.Excel が宣言されていることを前提としています。
  • ClosedXML の作成者について:Francois Botha, Aleksei Pankratev, Manuel de Leon, Amir Ghezelbash
  • ClosedXML のライセンスについて:GitHub - ClosedXML - MIT License

下図のような表を作成します。

 

ワークブックの作成

Dim wb = New XLWorkbook

ワークシートの追加

Dim ws = wb.Worksheets.Add("日本の塔")

テキストの追加

'表タイトル
ws.Cell("B2").Value = "日本の塔"

'名称
Dim fieldTitle_name As String = "名称"
ws.Cell("B3").Value = fieldTitle_name
ws.Cell("B4").Value = "東京タワー(日本電波塔)"
ws.Cell("B5").Value = "東京スカイツリー"
ws.Cell("B6").SetValue("明石海峡大橋(主塔)") '値設定の別のやり方

'所在地
Dim fieldTitle_location As String = "所在地"
ws.Cell("C3").Value = fieldTitle_location
ws.Cell("C4").Value = "東京都港区芝公園"
ws.Cell("C5").Value = "東京都墨田区押上一丁目"
ws.Cell("C6").SetValue("淡路市 - 神戸市間") '値設定の別のやり方

ブール値、日付、数値の追加

'電波塔か?(ブール値)
Dim fieldTitle_isRadioTower As String = "電波塔"
ws.Cell("D3").Value = fieldTitle_isRadioTower
ws.Cell("D4").Value = True
ws.Cell("D5").Value = True
ws.Cell("D6").SetValue(False) '値設定の別のやり方

'竣工・開通日(日付)
Dim fieldTitle_completionDate As String = "竣工・開通日"
ws.Cell("E3").Value = fieldTitle_completionDate
ws.Cell("E4").Value = New DateTime(1958, 12, 23)
ws.Cell("E5").Value = New DateTime(2012, 2, 29)
ws.Cell("E6").SetValue(New DateTime(1998, 4, 5)) '値設定の別のやり方

'高さ(数値)
Dim fieldTitle_height As String = "高さ"
ws.Cell("F3").Value = fieldTitle_height
ws.Cell("F4").Value = 333
ws.Cell("F5").Value = 634
ws.Cell("F6").SetValue(298.3) '値設定の別のやり方

範囲の指定

'ワークシートから指定
Dim rngTable = ws.Range("B2:F6")

'他の範囲から指定
Dim rngDates = rngTable.Range("D3:D5") 'アドレスは rngTable に対する相対位置(ワークシートに対する位置ではない)
Dim rngNumbers = rngTable.Range("E3:E5") 'アドレスは rngTable に対する相対位置(ワークシートに対する位置ではない)

日付と数字の書式設定

'OpenXML の定義済みフォーマット(d-mmm-yy)。
'rngDates.Style.NumberFormat.NumberFormatId = 15

'ユーザー定義の書式設定
rngDates.Style.NumberFormat.Format = "yyyy年MM月dd日"
rngNumbers.Style.NumberFormat.Format = "#,##0.0 ""m"""

表タイトルのセルの書式を一度に設定

rngTable.FirstCell().Style _
    .Font.SetBold() _
    .Fill.SetBackgroundColor(XLColor.FromArgb(191,191,191)) _
    .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center)

表タイトルのセルを結合

rngTable.FirstRow().Merge() 'rngTable.Range("A1:E1").Merge() または rngTable.Row(1).Merge() でもOK。

ヘッダー(列タイトル)の書式

Dim rngHeaders = rngTable.Range("A2:E2") 'アドレスは rngTable に対する相対位置(ワークシートに対する位置ではない)
rngHeaders.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center
rngHeaders.Style.Font.Bold = True
rngHeaders.Style.Font.FontColor = XLColor.DarkBlue
rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua

データ部分のテーブルを作成

Dim rngData = ws.Range("B3:F6")
Dim excelTable = rngData.CreateTable
'シート上にテーブルを作成したくないが、範囲をテーブルとして扱いたい場合は rngData.AsTable を使う。

'「合計」用の行を追加
excelTable.ShowTotalsRow = true
'「高さ(メートル) 」フィールドの平均を計算
'列の名前を使用して目的のセルを操作している点に注目
excelTable.Field(fieldTitle_height).TotalsRowFunction = XLTotalsRowFunction.Average
'「合計」用の行の「竣工・開通日」フィールドにラベルを入力
excelTable.Field(fieldTitle_completionDate).TotalsRowLabel = "平均:"
excelTable.Field(fieldTitle_completionDate).TotalsCell.Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Right) '右寄せ

太い罫線を追加

'シートのコンテンツに太い罫線を追加
ws.RangeUsed().Style.Border.OutsideBorder = XLBorderStyleValues.Thick

'それぞれの辺の罫線を指定する場合
'contents.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick
'contents.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick
'contents.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick
'contents.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick

コンテンツに合わせて列幅を調整

'コンテンツが日本語の場合は日本語フォントにしておかないと AdjustToContents が正しく動作しない
ws.Style.Font.FontName = "游ゴシック";
ws.Columns().AdjustToContents

'次のようにして列範囲を指定することもできる
'ws.Columns(2, 6).AdjustToContents または ws.Columns("2-6").AdjustToContents

ワークブックを保存

wb.SaveAs("D:\test\TowersInJapan.xlsx")

 

「【VB.NET】ClosedXML の使い方」の一覧を表示

購読する
通知を受け取る対象
guest
0 Comments
Inline Feedbacks
View all comments