【VB.NET】ClosedXML:列の操作

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("列の設定")

'B列を取得
Dim col1 = ws.Column("B")
'B列全体を塗りつぶし
col1.Style.Fill.BackgroundColor = XLColor.Red
'B列の幅を設定
col1.Width = 20

'4番目(D列)の列を取得
Dim col2 = ws.Column(4)
'D列全体を塗りつぶし
col2.Style.Fill.BackgroundColor = XLColor.DarkOrange
'D列の幅を設定
col2.Width = 5

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

範囲の中の列を処理する

Dim wb = New XLWorkbook
Dim ws = wb.Worksheets.Add("範囲の中の列")

'指定した範囲のすべての列
ws.Range("A1:B2").Columns.Style.Fill.BackgroundColor = XLColor.DimGray

'大き目の範囲を取得
Dim bigRange = ws.Range("A4:V6")
'以下の列番号の指定はすべてこの範囲に対する相対指定

'番号で連続する列を指定
bigRange.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red

'列名で連続する行を指定
bigRange.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue

'列名で連続する行を指定
bigRange.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink

'テキストの番号で離れた列を指定
bigRange.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange

'列名で離れた列を指定
bigRange.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise

'列名で1列を指定
bigRange.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan

'指定した列の幅を設定
ws.Columns("A:V").Width = 3

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

ワークシートの列を処理する

Dim wb As New XLWorkbook
Dim ws = wb.Worksheets.Add("ワークシートの列")

'番号で連続する列を指定
ws.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red

'列名で連続する列を指定
ws.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue

'列名で連続する列を指定
ws.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink

'テキストの番号で離れた列を指定
ws.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange

'列名で離れた列を指定
ws.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise

'列名で1列を指定
ws.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan

'指定の列の幅を設定
ws.Columns("A:V").Width = 3

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

列の挿入

ワークシートに列を挿入する過程を画像と共に少しずつ見ていきます。

途中経過の図では見やすくするために罫線を引いてますが、罫線を引くコードは省略しています(一番最後にだけ載せています)。

Dim wb = new XLWorkbook
Dim ws = wb.Worksheets.Add("列の挿入")

'Columns を使ってワークシート全体に色を付ける
ws.Columns.Style.Fill.BackgroundColor = XLColor.FromArgb(228,248,232)

'いくつかのセルに "X" を挿入する
For Each r in Enumerable.Range(1, 5) 'For r As Integer  = 1 To 5
    For Each c In Enumerable.Range(1, 5) 'For c As Integer = 1 To 5
        ws.Cell(r, c).Value = "X"
    Next
Next

'水色にする列を決める
Dim aquaColumn = ws.Column(2) 'B列
'赤色にする列を決める
Dim redColumn = ws.Column(5) 'E列

'水色にする予定だった列を水色にする
aquaColumn.Style.Fill.BackgroundColor = XLColor.Aqua
'水色の列の後に 2 列挿入
aquaColumn.InsertColumnsAfter(2)

'この時点で redColumn の列番号は 5(E列)から 7(G列)になっている点に注意

'赤色にする予定だった列を赤色にする
redColumn.Style.Fill.BackgroundColor = XLColor.Red
'赤色の列の前に 2 列挿入
redColumn.InsertColumnsBefore(2)

' 3 行目と 4 行目の背景色をオレンジ色にする
ws.Rows(3, 4).Style.Fill.BackgroundColor = XLColor.Orange

'B1:D1 の後に 2 列挿入
ws.Range("B1:D1").InsertColumnsAfter(2)

'B2:D2 の前に 2 列挿入
ws.Range("B2:D2").InsertColumnsBefore(2)

'B3:D3 の後に 2 列挿入
ws.Range("B3:D3").InsertColumnsAfter(2)

'B4:D4 の前に 2 列挿入
ws.Range("B4:D4").InsertColumnsBefore(2)

'見やすくするための罫線
ws.Range(1,1,6,12).Style.Border _
    .SetInsideBorder(XLBorderStyleValues.Thin) _
    .Border.SetOutsideBorder(XLBorderStyleValues.Thin)

'ws.Range(ws.RangeUsed.FirstCell, ws.RangeUsed.LastCell.CellRight.CellBelow).Style.Border _
'    .SetInsideBorder(XLBorderStyleValues.Thin) _
'    .Border.SetOutsideBorder(XLBorderStyleValues.Thin)

wb.SaveAs("D:\test\InsertingColumns.xlsx")
System.Diagnostics.Process.Start("D:\test\InsertingColumns.xlsx")

列の挿入と削除

ワークシートで列を挿入したり削除したりする過程を画像と共に少しずつ見ていきます。

途中経過の図では見やすくするために現在の範囲(rng)を選択状態にしています(rng.Select)が、選択のコード(rng.Select)は省略しています(一番最後にだけ載せています)。

Dim wb = New XLWorkbook
Dim ws = wb.Worksheets.Add("列の挿入と削除")

'B2:C3 の範囲を取得
Dim rng = ws.Range("B2:C3")
rng.SetValue("(=^・^=)") '範囲にテキストを挿入

'取得した範囲の前に1列追加
ws.Column(1).InsertColumnsAfter(1) 'rng の開始が C2 になる

'Column を使用して範囲の間に1列追加
ws.Column(3).InsertColumnsAfter(1) 'rng.ColumnCount = 3 になる

'Range を使用して範囲の前に1列追加
ws.Range("A2:A3").InsertColumnsAfter(1) 'rng の開始が D2 になる

'Range を使用して範囲の間に1列追加
ws.Range("D2:D3").InsertColumnsAfter(1) 'rng.ColumnCount = 4 になる

'Range を使用して(rng のすべての行を含まないで)列を挿入した場合、rng の指す範囲に影響を与えない
ws.Range("A1:A2").InsertColumnsAfter(1)

'Range を使用して(rng のすべての行を含まないで)列を挿入した場合、rng の指す範囲に影響を与えない
ws.Range("E3:E4").InsertColumnsAfter(1)

'Column を使用して範囲の前の1列を削除
ws.Column(1).Delete 'rng の開始が C2 になる

'Range を使用して範囲の前の1列を削除
ws.Range("A2:A3").Delete(XLShiftDeletedCells.ShiftCellsLeft) 'rng の開始が B2 になる

'Column を使用して範囲の間の1列を削除
ws.Column(3).Delete 'rng.ColumnCount = 3 になる

'Range を使用して範囲の間の1列を削除
ws.Range("C2:C3").Delete(XLShiftDeletedCells.ShiftCellsLeft) 'rng.ColumnCount = 2 になる

'Range を使用して(rng のすべての行を含まないで)列を削除した場合、rng の指す範囲に影響を与えない
ws.Range("A1:A2").Delete(XLShiftDeletedCells.ShiftCellsLeft)

'Range を使用して(rng のすべての行を含まないで)列を削除した場合、rng の指す範囲に影響を与えない
ws.Range("D3:D4").Delete(XLShiftDeletedCells.ShiftCellsLeft)

rng.Select '範囲を選択
'ファイルに保存
wb.SaveAs("D:\test\InsertingAndDeletingColumns.xlsx")

行の高さ、列の幅

'ワークシートのすべての行
ws.RowHeight = 30
ws.Rows.Height = 20

'ワークシートの特定の行
ws.Rows(3).Height = 10
ws.Rows(5, 6).Height = 15

'ワークシートのすべての列
ws.ColumnWidth = 3
ws.Columns.Width = 5

'ワークシートの特定の列
ws.Column(2).Width = 7
ws.Columns(5, 6).Width = 10

'すべてのワークシートのデフォルト値を変更
'(直後にコードでワークシートを追加した場合に有効)
workbook.RowHeight = 30
workbook.ColumnWidth = 30

コンテンツに合わせて行の高さと列の幅を調整する

Dim wb = New XLWorkbook
Dim ws = wb.Worksheets.Add("コンテンツに合わせて調整")

'フォントサイズを変えていくつかのテキストを挿入
ws.Cell(1, 1).Value = "高い行"
ws.Cell(1, 1).Style.Font.FontSize = 30
ws.Cell(2, 1).Value = "とても広い列"
ws.Cell(2, 1).Style.Font.FontSize = 20

'ws.Cell(1, 1).Value = "Tall Row"
'ws.Cell(1, 1).Style.Font.FontSize = 30
'ws.Cell(2, 1).Value = "Very Wide Column"
'ws.Cell(2, 1).Style.Font.FontSize = 20

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

'1-2行目の高さを調整
ws.Rows(1, 2).AdjustToContents

'すべての行の高さ/すべての列の幅をまとめて調整することもできます
'ws.Rows.AdjustToContents
'ws.Columns.AdjustToContents

'どのセルに対して列幅の調整が行われるのか見てみましょう
'(行の高さの調整も同様のことが言えます)

'テキストを挿入
ws.Cell(4, 2).Value = "列幅の調整は5-7行目が対象なのでこの行は無視されます"
ws.Cell(5, 2).Value = "短いテキスト"
ws.Cell(6, 2).Value = "このセルは結合セルなので列幅の調整は無視されます"
ws.Range(6, 2, 6, 4).Merge
ws.Cell(7, 2).Value = "列幅の調整はこのセルに対して行われます"
ws.Cell(8, 2).Value = "列幅の調整は5-7行目が対象なのでこの行は無視されます"

'ws.Cell(4, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"
'ws.Cell(5, 2).Value = "Short text"
'ws.Cell(6, 2).Value = "Width ignored because it's part of a merge"
'ws.Range(6, 2, 6, 4).Merge
'ws.Cell(7, 2).Value = "Width should adjust to this cell"
'ws.Cell(8, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"

'列幅の調整は5-7行目を対象に行うこととします
'(結合セルは無視されます)
ws.Column(2).AdjustToContents(5, 7)

'列幅の調整を開始する行を指定することもできます
'ws.Column(3).AdjustToContents(9)

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

 

残念ながら日本語のコンテンツについては列幅に対する .AdjustToContents が正常に動作しないようです。(ClosedXML 0.94.2)by エレン・イースト(当サイトの管理人)

ClosedXML で作成した新規ワークブックのデフォルトフォントは Calibri になるので、日本語のコンテンツに対して AdjustToContents を使う場合は日本語フォントを設定しておかないと正しく動作しません(下図は日本語フォントを設定せずに AdjustToContents を実行した場合。上記のコードは日本語フォントを設定するように修正済み)。

英語のコンテンツはそのままでも正常に動作します。

列内のセルを操作する

Dim wb = new XLWorkbook
Dim ws = wb.Worksheets.Add("列内のセル")

'Column を使って1列目を IXLColumn として取得
Dim col1 = ws.Column(1)
'1列目の最初のセルの背景色を赤色に
col1.Cell(1).Style.Fill.BackgroundColor = XLColor.Red
'1列目の2番目のセルの背景色を青色に
col1.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue
'1列目の3番目)、5-6番目のセルの背景色を赤色に
col1.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red
'1列目の8番目と9番目のセルの背景色を青色に
col1.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue

'Range を使って2列目の一部の範囲を IXLRangeColumn として取得
Dim col2 = ws.Range("B1:B9").FirstColumn
'2列目の最初のセルの背景色を赤色に
col2.Cell(1).Style.Fill.BackgroundColor = XLColor.Red
'2列目の2番目のセルの背景色を青色に
col2.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue
'2列目の3番目)、5-6番目のセルの背景色を赤色に
col2.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red
'2列目の8番目と9番目のセルの背景色を青色に
col2.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue

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

行・列を非表示にする

Dim wb = new XLWorkbook
Dim ws = wb.Worksheets.Add("表示・非表示")

ws.Columns(1, 3).Hide '列 1-3 を非表示
ws.Rows(1, 3).Hide '行 1-3 を非表示

ws.Column(2).Unhide '列 2 を表示
ws.Row(2).Unhide '行 2 を表示

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

行・列を固定する(ウィンドウ枠の固定)

Dim wb = new XLWorkbook
Dim wsFreeze = wb.Worksheets.Add("ウィンドウ枠の固定")

'行と列を同時に固定
wsFreeze.SheetView.Freeze(3, 5)

'行と列を別々に固定することもできます
'wsFreeze.SheetView.FreezeRows(3)
'wsFreeze.SheetView.FreezeColumns(5)

'固定を解除
'wsFreeze.SheetView.Freeze(0, 0)



'SplitRow / SplitColumn でもできます
'wsFreeze.SheetView.SplitRow = 3
'wsFreeze.SheetView.SplitColumn = 5

'固定を解除
'wsFreeze.SheetView.SplitRow = 0
'wsFreeze.SheetView.SplitColumn = 0

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

行・列のアウトライン(グループ化)

下図のようなアウトラインを作成します。

 

コード

Dim wb = new XLWorkbook
Dim ws = wb.Worksheets.Add("アウトライン")

ws.Outline.SummaryHLocation = XLOutlineSummaryHLocation.Right
ws.Columns(2, 6).Group '列 2-6(B-F) のアウトライン(レベル1)を作成
ws.Columns(2, 4).Group '列 2-4(B-D) のアウトライン(レベル2)を作成
ws.Column(2).Ungroup(True) '列2をすべてのアウトラインから外す

ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Bottom
ws.Rows(1, 5).Group '行 1-5 のアウトライン(レベル1)を作成
ws.Rows(1, 4).Group '行 1-4 のアウトライン(レベル2)を作成
ws.Rows(1, 4).Collapse '行 1-4 を折りたたむ
ws.Rows(1, 2).Group '行 1-2 のアウトライン(レベル3)を作成
ws.Rows(1, 2).Ungroup '行 1-2 を最後のアウトラインから外す

'特定のアウトラインレベルを折りたたんだり展開したりすることもできます
'
' ws.CollapseRows(outlineLevel As Int32)
' ws.CollapseColumns(outlineLevel As Int32)
'
' ws.ExpandRows(outlineLevel As Int32)
' ws.ExpandColumns(outlineLevel As Int32)

'すべてのアウトラインレベルを一度に折りたたんだり展開したりすることもできます
'
' ws.CollapseRows
' ws.CollapseColumns
'
' ws.ExpandRows
' ws.ExpandColumns

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

 

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

コメントの投稿

avatar
  購読する  
通知を受け取る対象