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

'列を取得
Dim row = ws.Row(2)
'行全体の塗りつぶし
row.Style.Fill.BackgroundColor = XLColor.Red
'行の高さを設定
row.Height = 30

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

範囲の中の行を処理する

Dim wb = new XLWorkbook
Dim ws = wb.Worksheets.Add("範囲の中の行")

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

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

'番号で連続する行を指定
bigRange.Rows(1, 2).Style.Fill.BackgroundColor = XLColor.Red
'テキストの番号で連続する行を指定
bigRange.Rows("4:5").Style.Fill.BackgroundColor = XLColor.Blue

'テキストの番号で離れた行を指定
bigRange.Rows("7:8,10:11").Style.Fill.BackgroundColor = XLColor.Orange

'テキストの番号で1行を指定
bigRange.Rows("13").Style.Fill.BackgroundColor = XLColor.Cyan

'ワークシートの行の高さ
ws.Rows.Height = 15

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

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

Dim wb = new XLWorkbook
Dim ws = wb.Worksheets.Add("ワークシートの行")

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

'テキストの番号で連続する行を指定
ws.Rows("4:5").Style.Fill.BackgroundColor = XLColor.Blue

'テキストの番号で離れた行を指定
ws.Rows("7:8,10:11").Style.Fill.BackgroundColor = XLColor.Orange

'テキストの番号で1行を指定
ws.Rows("13").Style.Fill.BackgroundColor = XLColor.Cyan

'ワークシートの指定の行の高さ
ws.Rows("1:13").Height = 15

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

行の挿入

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

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

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

'Rows を使ってワークシート全体に色を付ける
ws.Rows.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 aquaRow = ws.Row(2) 
'赤色にする行を決める
Dim redRow = ws.Row(5) 

'水色にする予定だった行を水色にする。
aquaRow.Style.Fill.BackgroundColor = XLColor.Aqua
'水色の行の下に 2 行挿入
aquaRow.InsertRowsBelow(2)

'この時点で redRow の行番号は 5 から 7 になっている点に注意

'赤色にする予定だった行を赤色にする
redRow.Style.Fill.BackgroundColor = XLColor.Red
'赤色の行の上に 2 行挿入
redRow.InsertRowsAbove(2)

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

'A2:A4 の下に 2 行挿入
ws.Range("A2:A4").InsertRowsBelow(2)

'B2:B4 の上に 2 行挿入
ws.Range("B2:B4").InsertRowsAbove(2)

'C2:C4 の下に 2 行挿入
ws.Range("C2:C4").InsertRowsBelow(2)

'D2:D4 の上に 2 行挿入
ws.Range("D2:D4").InsertRowsAbove(2)

'見やすくするための罫線
ws.Range(1,1,15,6).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\InsertingRows.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.Row(1).InsertRowsBelow(1) 'rng の開始が B3 になる

'Row を使用して範囲の間に1行追加
ws.Row(3).InsertRowsBelow(1) 'rng.RowCount = 3 になる

'Range を使用して範囲の上に1行追加
ws.Range("B1:C1").InsertRowsBelow(1) 'rng の開始が B4 になる

'Range を使用して範囲の間に1行追加
ws.Range("B4:C4").InsertRowsBelow(1) 'rng.RowCount = 4 になる

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

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

'Row を使用して範囲の上の1行を削除
ws.Row(1).Delete 'rng の開始が B3 になる

'Range を使用して範囲の上の1行を削除
ws.Range("B1:C1").Delete(XLShiftDeletedCells.ShiftCellsUp) 'rng の開始が B2 になる

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

'Range を使用して範囲の間の1行を削除
ws.Range("B3:C3").Delete(XLShiftDeletedCells.ShiftCellsUp) 'rng.RowCount = 2 になる

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

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

rng.Select '範囲を選択
'ファイルに保存
wb.SaveAs("D:\test\InsertingAndDeletingRows.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("行内のセル")

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

'Range を使って2行目の一部の範囲を IXLRangeRow として取得
Dim row2 = ws.Range("A2:I2").FirstRow '範囲の中の最初の行
'2行目の最初のセルの背景色を赤色に
row2.Cell(1).Style.Fill.BackgroundColor = XLColor.Red
'2行目の2番目のセルの背景色を青色に
row2.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue
'2行目の3番目(C列)、5-6番目(E-F列)のセルの背景色を赤色に
row2.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red
'2行目の8番目(H列)と9番目(I列)のセルの背景色を青色に
row2.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue

'すべての列の幅を 7 に
ws.Columns.Width = 7

wb.SaveAs("D:\test\RowCells.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
  購読する  
通知を受け取る対象