Excel(エクセル)の条件付き書式であれば、行や数字の色を変えることが簡単にできます。C#でエクセルを扱う場合も、この条件付き書式を適用することが可能です。
今回紹介する方法は、エクセルのインストールを必要としないライブラリ「SpreadsheetLight」を使って、条件付き書式を追加する方法について解説します。
数字が羅列しているだけの表から、重要なデータを色付けなどで強調することで特定の情報を素早くピックアップすることができるでしょう。
エクセルの条件付き書式とは
「条件付き書式」とは、「条件によってセルの書式を自動的に切り替える」ことができる機能です。たくさんのデータを自動的に判別するため、手作業で1つずつ確認しながら変更する手間を大幅に省略できます。
条件付き書式の例として、テスト結果が60点より小さい点数のセルの背景色を「赤」、更に60点に近いほど薄い赤にし、点数が低くなるにつれて背景色が濃くなる設定(カラースケール)があります。
こうすることで点数がより低い部分が強調され、テスト結果の良し悪しがすぐに分かる表を作成できます。
今回は予め用意されたテスト結果に、上図の条件付き書式を適用させたエクセルファイルを「SpreadsheetLight」で出力してみます。
SpreadsheetLightについて
Microsoftが提供するExcel(2007以降)およびLibreOffice Calcと互換性があるオープンソースのライブラリです。無料で利用できるMITライセンスで商用利用も可能です。
Excelに依存せず独自エンジンで動作するので、エクセルがなくても動かすことができます。Officeのインストールが不要というのは大きなメリットの1つでしょう。
このライブラリはNuGetでインストールすることが可能です。インストールの方法や使用方法についてはこちらの記事で紹介しますので、参考にしてみてくださいね。
ここからはライブラリーのインストールが完了していることを前提に進めていきます。
プログラムの実装
ここでは元データとなるエクセルファイル(テスト結果)を読み込んで、ファイル内のテスト結果を複製して条件付き書式を追加します。
元データとなるエクセルファイルにテスト結果を入力して、ファイル名を「SampleDataSource.xlsx」としてCドライブに保存します。テスト結果は初めに図で記載したものと同じです。
エクセルの読み込み
using (SLDocument OriginalSheet = new SLDocument(@"C:\SampleDataSource.xlsx"))
{
//これでファイルを開くことができます。
}
引数にはファイル名を渡すことができますが、実行アプリと同じ階層のディレクトリに保存しておく必要があります。こうしないと「System.IO.FileNotFoundException」という例外が発生します。
SLDocumentを扱う際はリソースの解放忘れを防止する為に、usingステートメントを使うことが公式サイトで推奨されている実装方法です。
リソースを解放していないと、ファイルを開いた後に閉じていないので、ファイルが開きっぱなしの状態になってしまいます。場合によってはファイルにアクセスできない不具合が発生してしまうので要注意です。
テスト結果を新規ファイルへコピー
using (SLDocument ModifySheet = new SLDocument())
using (SLDocument OriginalSheet = new SLDocument(@"SampleDataSource.xlsx"))
{
SLStyle style = OriginalSheet.CreateStyle();
for (int i = 1; i < 14; i++)
{
for (int ii = 1; ii < 10; ii++)
{
style = OriginalSheet.GetCellStyle(i, ii); // 元ファイルのスタイルを取得
ModifySheet.SetCellStyle(i, ii, style); // 新しいワークシートへスタイルを適用
switch (style.FormatCode)
{
case "General": // 表示形式が「標準」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsString(i, ii));
break;
case "0": // 表示形式が「数値」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsInt32(i, ii));
break;
case "@": // 表示形式が「文字列」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsRstType(i, ii));
break;
}
}
}
}
セルの表示形式はSLStyle.FormatCodeで元ファイルの形式を取得して、その表示形式に合わせてセルに文字や値を取得するメソッドを使い分けます。こうすることで入力するセルに表示形式を引き継ぐことができます。
メソッド | 表示形式 |
GetCellValueAsString(int rowIndex, int columnIndex) | 標準 |
GetCellValueAsInt32(int rowIndex, int columnIndex) | 数値 |
GetCellValueAsRstType(int rowIndex, int columnIndex) | 文字列 |
GetCellValueAsDateTime(int rowIndex, int columnIndex) | 時刻 |
条件付き書式を適用
using (SLDocument ModifySheet = new SLDocument())
using (SLDocument OriginalSheet = new SLDocument(@"SampleDataSource.xlsx"))
{
SLStyle style = OriginalSheet.CreateStyle();
for (int i = 1; i < 14; i++)
{
for (int ii = 1; ii < 10; ii++)
{
style = OriginalSheet.GetCellStyle(i, ii); // 元ファイルのスタイルを取得
ModifySheet.SetCellStyle(i, ii, style); // 新しいワークシートへスタイルを適用
switch (style.FormatCode)
{
case "General": // 表示形式が「標準」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsString(i, ii));
break;
case "0": // 表示形式が「数値」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsInt32(i, ii));
break;
case "@": // 表示形式が「文字列」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsRstType(i, ii));
break;
}
}
}
//カラースケール適用
SLConditionalFormatting cf = null;
cf = new SLConditionalFormatting("C3", "G13");
cf.SetCustom2ColorScale(
SLConditionalFormatMinMaxValues.Number, "30", System.Drawing.Color.OrangeRed,
SLConditionalFormatMinMaxValues.Number, "60", System.Drawing.Color.White);
ModifySheet.AddConditionalFormatting(cf);
//ファイルの保存
ModifySheet.SaveAs("sample.xlsx");
}
条件付き書式を適用する範囲を指定してSLConditionalFormattingのインスタンスを生成します。いかにもカラースケールをセットしますよというメソッドに必要な情報を入力します。ここでは最小値30よりも小さい値はOrangeRedになるようにし、最大値60以上はWhiteになるようにしました。
最後にファイルを保存すれば終了です。
さっそく作成されたアプリを開いてみましょう。下図のように表が作成されたら完成です。
カラースケール以外の条件付き書式を適用
「SpreadsheetLight」ではカラースケール以外の条件付き書式を利用することができます。例えば条件付き書式の1種であるアイコンセットです。アイコンセットには信号機や、矢印、旗といったなじみのあるマークが用意されており、これらを活用すれば表が見やすくなるかもしれません。
using (SLDocument ModifySheet = new SLDocument())
using (SLDocument OriginalSheet = new SLDocument(@"./Excel\SampleDataSource.xlsx"))
{
SLStyle style = OriginalSheet.CreateStyle();
for (int i = 1; i < 14; i++)
{
for (int ii = 1; ii < 10; ii++)
{
style = OriginalSheet.GetCellStyle(i, ii); // 元ファイルのスタイルを取得
ModifySheet.SetCellStyle(i, ii, style); // 新しいワークシートへスタイルを適用
switch (style.FormatCode)
{
case "General": // 表示形式が「標準」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsString(i, ii));
break;
case "0": // 表示形式が「数値」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsInt32(i, ii));
break;
case "@": // 表示形式が「文字列」
ModifySheet.SetCellValue(i, ii, OriginalSheet.GetCellValueAsRstType(i, ii));
break;
}
}
}
//カラースケール適用
SLConditionalFormatting cf = null;
cf = new SLConditionalFormatting("C3", "G13");
cf.SetCustomIconSet(SLThreeIconSetValues.ThreeSymbols, false, false,
true, "30", SLConditionalFormatRangeValues.Number,
true, "60", SLConditionalFormatRangeValues.Number);
ModifySheet.AddConditionalFormatting(cf);
//ファイルの保存
ModifySheet.SaveAs("sample.xlsx");
}
先ほどのカラースケールとは異なり、SetCustomIconSetメソッドで条件を指定してアイコンセットを設定しています。数値が30未満の場合は×マーク、30~60未満の場合はエクスクラメーションマーク、60以上はチェックマークになります。
まとめ
エクセルのインストールを必要としないライブラリ「SpreadsheetLight」を使って、条件付き書式を追加する方法について解説しました。
他にも条件付き書式を扱うことができるので、ぜひ試してみてください。
SpreadsheetLightについて気になる方はこちらの記事もお勧めです。
以上、最後まで読んでいただきありがとうございました。