C#

【C#】エクセルを読み込んで条件付き書式を適用する方法を紹介

Excel(エクセル)の条件付き書式であれば、行や数字の色を変えることが簡単にできます。C#でエクセルを扱う場合も、この条件付き書式を適用することが可能です。

今回紹介する方法は、エクセルのインストールを必要としないライブラリ「SpreadsheetLight」を使って、条件付き書式を追加する方法について解説します。

数字が羅列しているだけの表から、重要なデータを色付けなどで強調することで特定の情報を素早くピックアップすることができるでしょう。

エクセルの条件付き書式とは

条件付き書式」とは、「条件によってセルの書式を自動的に切り替える」ことができる機能です。たくさんのデータを自動的に判別するため、手作業で1つずつ確認しながら変更する手間を大幅に省略できます。

条件付き書式の例として、テスト結果が60点より小さい点数のセルの背景色を「赤」、更に60点に近いほど薄い赤にし、点数が低くなるにつれて背景色が濃くなる設定(カラースケール)があります。

こうすることで点数がより低い部分が強調され、テスト結果の良し悪しがすぐに分かる表を作成できます。

今回は予め用意されたテスト結果に、上図の条件付き書式を適用させたエクセルファイルを「SpreadsheetLight」で出力してみます。

SpreadsheetLightについて

Microsoftが提供するExcel(2007以降)およびLibreOffice Calcと互換性があるオープンソースのライブラリです。無料で利用できるMITライセンスで商用利用も可能です。

Excelに依存せず独自エンジンで動作するので、エクセルがなくても動かすことができます。Officeのインストールが不要というのは大きなメリットの1つでしょう。

このライブラリはNuGetでインストールすることが可能です。インストールの方法や使用方法についてはこちらの記事で紹介しますので、参考にしてみてくださいね。

【C#】ExcelをSpreadsheetLightで操作する方法Excel(エクセル)の書き込み・読み込み・エクセル操作するならC#専用ライブラリ「SpreadsheetLight」がおすすめ。無料で利用できる上に、豊富なサンプルで導入が簡単です。この記事ではライブラリのインストールを始め、基本となるエクセルの操作方法について詳しく解説をしています。...

ここからはライブラリーのインストールが完了していることを前提に進めていきます。

プログラムの実装

ここでは元データとなるエクセルファイル(テスト結果)を読み込んで、ファイル内のテスト結果を複製して条件付き書式を追加します。

元データとなるエクセルファイルにテスト結果を入力して、ファイル名を「SampleDataSource.xlsx」としてCドライブに保存します。テスト結果は初めに図で記載したものと同じです。

エクセルの読み込み

エクセルファイルの読み込みはSLDocumentの引数にファイルのパスを渡すことで、そのファイルを開くことができます。
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)時刻

条件付き書式を適用

次にコピーしたテスト結果にSLConditionalFormattingクラスを使ってカラースケールを適用させます。
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について気になる方はこちらの記事もお勧めです。

【C#】Excelを操作して帳票を出力するアプリを作成C#でExcelのファイルを作成してテンプレートを出力する方法を紹介します。実際にエクセルファイルを出力するアプリの作成を通して操作方法を詳しく解説します。...
【C#】Excelにグラフ(チャート)を挿入する方法(SpreadsheetLight)C#でExcelにグラフ(チャート)を挿入するなら、エクセル専用ライブラリ「SpreadsheetLight」がおすすめ。無料でライブラリが利用ができる上に、操作も簡単。この記事では棒グラフを挿入する方法を紹介していますので、参考にしてみてください。...
【C#】折れ線グラフをExcelファイルに表示する方法(SpreadsheetLight)折れ線グラフをC#のエクセルライブラリ「SpreadsheetLight」で表示する方法を紹介します。Excelに対して書き込み操作と読み込み操作が可能なライブラリです。本記事ではExcelファイルに折れ線グラフを表示する方法について解説しています。...

以上、最後まで読んでいただきありがとうございました。

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA