エクセルを操作したい。。。
エクセルは表計算ソフトとして社会人の多くが利用している必須アプリの1つです。
C# を使ってエクセルの読み込みや書き込み等の操作を制御できれば、これまで時間を費やしていた単純な作業を自動化させ、業務を効率することに繋がるでしょう。
今回は、エクセルがパソコンにインストールされていなくても、入力や出力ができる便利なライブラリ「SpreadsheetLight」を使った基本的な操作について紹介します。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
SpreadsheetLightについて
Microsoft が提供する Excel(2007以降)および LibreOffice Calc と互換性があるオープンソースのライブラリです。ライセンスは MIT ライセンスで提供されており、利用における制約や制限が少なく、無料で商用利用が可能です、
\ SpreadsheetLightの公式サイトを開く /
セル単位の読み書きはもちろん、条件付き書式の追加や図・グラフの挿入を簡単に行うことができます。
Microsoft.Office.Interop.Excel とは異なり、エクセルがインストールされていないパソコンでも動作させることが可能なのは大きなメリットの1つです。
2012年にバージョン1.0がリリースされてから機能追加やバグの修正が行われており、最新バージョンは3.5.0でした(2023年11月現在)。ただし、最新バージョン 3.5.0 は2020年から更新がありません。活発的な開発は行われていないため、Excel の新しい機能が利用できない可能性があります。
SpreadsheetLight は NuGet で公開されているので、下記の手順でライブラリをインストールして利用しましょう。
NuGetでインストール
まずは Visual Studio を起動して任意のプロジェクト名でプロジェクトを新規作成します。
ソリューション エクスプローラーからプロジェクトを選択して右クリックして「NuGet パッケージの管理」を選択します。
開いたNuGetパッケージマネージャーで「参照」を選択し、検索欄に「SpreadsheetLight」と入力します。
検索結果の一覧の中にある「SpreadsheetLight」を選択して「インストール」を押します。
インストールが正常に終了したら完了です。
エクセルの操作方法
ここからは C# で エクセルを操作できる「SpreadsheetLight」ライブラリの使い方を紹介します。
環境
- 統合開発環境:Visual Studio 2022
- フレームワーク:.NET 7.0
- SpreadsheetLightのバージョン:3.5.0
頻繁に使用する操作をピックアップして、項目別にコードの書き方をまとめています。
名前空間の宣言
「SpreadsheetLight」でエクセルを操作するために、名前空間に含まれている様々なクラス群を使うので、下記のように名前空間を宣言する必要があります。
using SpreadsheetLight;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
これをしないと、型または名前空間の名前’xxxx’が見つかりませんでした(usingディレクティブまたはアセンブリ参照が指定されていることを確認してください)というエラーメッセージが表示されます。
上記のコードをプロジェクトファイルのヘッダー部分に追加しましょう。
ワークブックを作成する
SDLDocument クラスのインスタンスを生成して、エクセルを操作します。新規作成する場合は引数を指定せずに作成します。
新規作成した場合、「Sheet1」という名前のワークシートが自動生成され、初期選択されます。自動生成された Sheet1 の名前を変更したい場合は、RenameWorksheet
メソッドを使います。
SLDocument sl = new SLDocument();
既存のエクセルファイルを読み込んで操作をしたい場合は、ファイルパスを引数で渡すと参照することが可能です。
SLDocument sl = new SLDocument(@"C:\sample.xlsx");
SLDocument クラスに用意されているメソッドやプロパティを使用して、セルへ文字列や数値を入力したり、セルの書式設定を行うことが可能です。
ワークブックに名前を付けて保存する
SLDocument.SaveAsメソッド
ワークブックを保存するには、SaveAs
メソッドを使用します。メソッドの引数にファイル名またはファイルパスを指定します。ファイル名を指定した場合はアプリの実行フォルダに保存され、ファイルパスの場合はそのパスで保存されます。
using (var sl = new SLDocument())
{
// 名前を付けて保存する
sl.SaveAs(@"C:\Sample.xlsx");
// 次のようにファイル名のみでもOK
// sl.SaveAs("Sample.xlsx");
}
ワークシートの名前を変更する
SLDocument.RenameWorksheetメソッド
ワークシートの名前を変更するには、RenameWorksheet
メソッドを使用します。第1引数に変更したいワークシートの名前を指定し、第2引数に変更後の名前を指定します。
using (var sl = new SLDocument())
{
sl.RenameWorksheet(SLDocument.DefaultFirstSheetName, "名前変更シート");
}
実行結果は次のようになります。ワークシートの名前が変更されます。
ワークシートを追加する
SLDocument.AddWorksheetメソッド
ワークブックに新しくワークシートを追加したい場合は、AddWorksheet
メソッドを使用します。
using (var sl = new SLDocument())
{
sl.AddWorksheet("追加シート");
}
実行結果は次のようになります。引数に指定したワークシート名でワークシートが追加されます。
ワークシートを選択する
SLDocument.SelectWorksheetメソッド
複数のワークシートの中から作業したいワークシートを選択するには、SelectWorksheet
メソッドを使用します。
using (var sl = new SLDocument())
{
sl.AddWorksheet("追加シート");
}
SLDocument オブジェクト内で操作するワークシートが選択されます。
セルに値を書き込む
SLDocument.SetCellValueメソッド
1つのセルに対してデータを書き込みを行う場合は、SetCellValue
メソッドを使って「A1 形式」または「行と列」を指定して、入力する文字列や数値等を設定します。
using (var sl = new SLDocument())
{
sl.SetCellValue("A1", "Hello World");
// 次のように行列指定でもOK
sl.SetCellValue(1, 1, "Hello World");
}
実行結果は次のようになります。
ワークブック内に複数のワークシートが存在する場合は、予め操作したいワークシートを選択しておく必要があります。
using (var sl = new SLDocument())
{
// Sheet2とSheet3を追加する
sl.AddWorksheet("Sheet2");
sl.AddWorksheet("Sheet2");
// 作業するワークシートを選択する
sl.SelectWorksheet("Sheet2");
// Sheet2のA1に値を設定する
sl.SetCellValue("A1", "Hello World");
}
また、同メソッドはエクセルで使用する関数を設定することも可能です。次の例では、SUM関数を使用しており、2+5 の和である 7 がセルの「A3」に入力されます。
using (var sl = new SLDocument())
{
// セルの足し算をする
sl.SetCellValue("A1", 2);
sl.SetCellValue("A2", 5);
sl.SetCellValue("A3", "=SUM(A1:A2)");
}
実行結果は次のようになります。
セルの値を読み込む
SLDocument.GetCellValueAsxxxxメソッド
セルに入力されている値を取得する場合は、GetCellValueAsxxxx
メソッドを使用します。xxxxには取得したい型を選択します。単にセルに入力されている値を取得したい場合はGetCellValueAsString
メソッドを使って string 型で取得するといいでしょう。
メソッドの引数に値を取得したいセルを指定します。
using (var sl = new SLDocument())
{
// A1に値を設定する
sl.SetCellValue("A1", "Hello World");
var str = sl.GetCellValueAsString("A1");
Debug.WriteLine(str);
}
実行結果は次のようになります。「A1」で取得したセルの文字列が出力ログに出力されます。
Hello World
セルのフォントスタイルを変更する
SLDocument.SetCellStyleメソッド
セルのフォントを変更する場合は、SLStyle
オブジェクトのSetFont
にフォント名とフォントサイズを指定し、SetCellStyle
メソッドでセルにスタイルを適応させます。
using (var sl = new SLDocument())
{
// SLStyleオブジェクトを生成する
SLStyle style = sl.CreateStyle();
// フォントスタイルを設定する
style.SetFont("Meiryo UI", 20);
style.Font.Underline = DocumentFormat.OpenXml.Spreadsheet.UnderlineValues.Double;
sl.SetCellStyle("A1", style);
}
実行結果は次のようになります。設定したフォントオプションで表示されます。
セルのフォントスタイルを取得する
SLDocument.GetCellStyleメソッド
セルに適用されたフォントスタイルを取得する場合はGetCellStyle
メソッドを使用します。
using (var sl = new SLDocument())
{
SLStyle style = sl.CreateStyle();
style.SetFont("Meiryo UI", 20);
sl.SetCellStyle("A1", style);
sl.SetCellValue("A1", "font style");
style = sl.GetCellStyle("A1");
sl.SetCellStyle("A3", style);
sl.SetCellValue("A3", "font style");
}
実行結果は次のようになります。「A1」のセルのフォントスタイルが「A3」のセルに適用されます。
セルの罫線を設定する
SLStyle.Border.TopBorder.BorderStyleプロパティ
セルの罫線を設定するには、BorderStyle
プロパティを使用します。罫線の種類は、実線や点線、太線等があります。罫線の色は、Color
プロパティで設定します。
using (var sl = new SLDocument())
{
SLStyle style = sl.CreateStyle();
//罫線の形式を設定
style.Border.TopBorder.BorderStyle = BorderStyleValues.Thin;
style.Border.LeftBorder.BorderStyle = BorderStyleValues.Thin;
style.Border.RightBorder.BorderStyle = BorderStyleValues.Thin;
style.Border.BottomBorder.BorderStyle = BorderStyleValues.Thin;
// 罫線の色を設定
style.Border.BottomBorder.Color = System.Drawing.Color.Black;
style.Border.TopBorder.Color = System.Drawing.Color.Black;
style.Border.LeftBorder.Color = System.Drawing.Color.Black;
style.Border.RightBorder.Color = System.Drawing.Color.Black;
sl.SetCellStyle("B2", style);
}
実行結果は次のようになります。「B2」のセルの上下左右に罫線が引かれます。
セルのアライメントを設定する
SLStyle.SetCellStyleメソッド
セルのアライメントを設定するには、SLStyle
オブジェクトのAlignment
に水平方向または垂直方向またはその両方について指定を行い、SetCellStyle
メソッドでセルにスタイルを適応させます。
水平方向
//左寄せ
slStyle.Alignment = new SLAlignment() { Horizontal = HorizontalAlignmentValues.Left };
//中央寄せ
slStyle.Alignment = new SLAlignment() { Horizontal = HorizontalAlignmentValues.Center };
//右寄せ
slStyle.Alignment = new SLAlignment() { Horizontal = HorizontalAlignmentValues.Right };
垂直方向
//上寄せ
slStyle.Alignment = new SLAlignment() { Vertical = VerticalAlignmentValues.Top };
//中央寄せ
slStyle.Alignment = new SLAlignment() { Vertical = VerticalAlignmentValues.Center };
//下寄せ
slStyle.Alignment = new SLAlignment() { Vertical = VerticalAlignmentValues.Bottom };
セルの「A1」のアライメントを中央寄せにしたサンプルコードです。
using (var sl = new SLDocument())
{
SLStyle style = sl.CreateStyle();
// 中央寄せ
style.Alignment = new SLAlignment()
{
Horizontal = HorizontalAlignmentValues.Center,
Vertical = VerticalAlignmentValues.Center
};
// アライメントを適用する
sl.SetCellStyle("A1", style);
sl.SetCellValue("A1", "Hello");
}
実行結果は次のようになります。
グラフを作成する
SLStyle.InsertChartメソッド
SpreadSheetLight では エクセルにグラフを追加する機能があります。ワークシートへグラフを反映するにはSLStyle.InsertChart
メソッドを使用します。
下図のようなグラフを作成することができます。
グラフの作成方法にはついては以下の記事で紹介していますので、参考にしてみてください。
まとめ
パソコンにエクセルのインストールが不要で、エクセルの制御ができるライブラリ「SpreadsheetLight」について紹介をしました。エクセルの書き込みや読み込みなどよく使用する操作を簡単に実装できる便利なライブラリです。
C# でエクセルを操作できるようになれば、帳票の出力やデータ収集の自動化などなど業務を効率化する手段として活躍ができることでしょう。
もしライブラリを使用する機会があれば、今回の記事が参考になれば幸いです。
以上、最後まで読んでいただきありがとうございました。