Excel

【C#】Excel不要の新しいライブラリSpreadsheetLightでExcelファイルを出力する方法

はじめに

Excel不要の新しいExcelライブラリ「SpreadsheetLight」の使い方を、NuGetでのインストールするところから解説します。

「C#から簡単にExcelファイルの読み書きや操作をしてみたい」という方は是非一度お試しください。

この記事の内容
  • SpreadsheetLightについて
  • NuGetでのインストール方法
  • Excelの出力結果
  • Excelファイルを出力するコード
  • コードのポイント
こんなことに使える

エクセルの読み/書き・操作が行えるので、以下のような作業に使えそうです。

  • エクセルデータ集計を自動化する
  • CSVなどの数値データを、グラフ付のエクセルファイルに自動変換する
  • NetOfficeなど遅いライブラリと入れ替えて処理を高速化をする

「SpreadsheetLightって何?」という方は以下の記事をご覧ください。

環境

この記事は以下の環境で作成、動作確認を行っています。

環境バージョンなど備考
VisualStudio   2019 Community 2017でも使用できます
.NET4.7.2
プロジェクトコンソールアプリケーション(.NET Framework) 
SpreadsheetLight3.5.0

NuGetでのインストール方法

VisualStudioのメニューの「プロジェクト」から、「NuGetパッケージの管理」を選択します。

開いたウインド内で「参照」を選択し、検索欄に「SpreadsheetLight」と入力します。
表示されたSpreadsheetLightを選択して「インストール」を押します。

インストールの途中、MicrosoftのDLLへのライセンスの同意が求められるので、「同意する」を選択します。

ざっと調べたところ、上記のライセンス条項は「DLLを改変しない」という内容のようです。あまり詳しくは調べていないので、仕事などで商用利用する場合はご自身で再度規約等をご確認ください。

実行結果

後述するコードを実行すると、以下の氏名・スコア・合計の表が、エクセルファイルが出力されます。

※ xlsx出力したものをLibreOfficeで表示しています。
※ Excelで表示した際も同様の結果となります。

ソースコード

前述した表を出力するコードは以下の通りです。合計はエクセルのSUM関数で計算しています。

日本語も設定なしで正常に表示され、デフォルトで問題ない場合は、bookやsheetの名称を設定する必要もありません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// SpreadsheetLight関連で使用します
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using SpreadsheetLight;


namespace ConsoleAppSpreadSheetLight
{
    class Program
    {
        static void Main(string[] args)
        {

            SLDocument sl = new SLDocument();

            // 項目名称を入力します
            sl.SetCellValue("A1", "氏名");
            sl.SetCellValue("B1", "スコアA");
            sl.SetCellValue("C1", "スコアB");
            sl.SetCellValue("D1", "スコアC");
            sl.SetCellValue("E1", "スコア合計");

            // 氏名の内容を入力します
            sl.SetCellValue("A2", "田中");
            sl.SetCellValue("A3", "鈴木");
            sl.SetCellValue("A4", "山田");

            // 各人のスコアを入力します
            for (int i = 2; i < 2 + 3; i++) { sl.SetCellValue(2, i, i * 10); }
            for (int i = 2; i < 2 + 3; i++) { sl.SetCellValue(3, i, i * 20); }
            for (int i = 2; i < 2 + 3; i++) { sl.SetCellValue(4, i, i * 30); }

            // 各人の合計のため、SUM関数を入力します。

            // ライブラリの機能を使って、行・列の番号から、A1:A5 のような「範囲の文字列」に変換します
            string range1 = SLConvert.ToCellRange(2,2,  2,4);
            string range2 = SLConvert.ToCellRange(3,2,  3,4);
            string range3 = SLConvert.ToCellRange(4,2,  4,4);

            // SUM関数を入力します
            sl.SetCellValue(2,5, "=SUM(" + range1 + ")");
            sl.SetCellValue(3,5, "=SUM(" + range2 + ")");
            sl.SetCellValue(4,5, "=SUM(" + range3 + ")");

            // ちなみに、エクセルは「1」始まりなので、行・列番号(0,0)の指定は無視されます
            // (例外は発生しません)
            sl.SetCellValue(0, 0, "異常な");

            // ファイル名を指定して保存します。
            sl.SaveAs("SpreadsheetLightTest.xlsx");

            // 終了待ちです。
            Console.WriteLine("End of program");
            Console.ReadLine();
        }
    }
}

出力されたエクセルファイルを開いたまま再実行すると、例外が発生します(ファイルが開けない)。エクセルファイルを閉じてから実行してください。

コードのポイント

エクセルファイルの作成と保存

SpreadsheetLightのオブジェクトを生成します。
その後は、ファイル名を指定して保存する関数を呼び出すだけで、エクセルファイルの出力が完了します。
別途ストリームのオープンや、シート・ブックの名前を設定する必要はありません。

// SpreadsheetLightのオブジェクトを生成
 SLDocument sl = new SLDocument();

// ファイル名を指定して保存します。
 sl.SaveAs("SpreadsheetLightTest.xlsx");

範囲の文字列の生成

エクセルで範囲を指定する 「A1:A5 」のような「範囲の文字列」もSpreadsheetLightの機能を使って行・列番号から簡単に生成できます。

// ライブラリの機能を使って、行・列の番号から、A1:A5 のような「範囲の文字列」に変換します
 string range1 = SLConvert.ToCellRange(2,2,  2,4);

まとめ

Excel不要の無料の新しいExcelライブラリ「SpreadsheetLight」の使い方を解説しました。

今回解説した1セルずつ表を作成する以外に、Tableオブジェクトを使ってもっと簡単に作成する方法もあるようです。今後掘り下げて、別記事で解説していきたいと思います。

以下の記事で、グラフを挿入する方法を解説しています。興味のある方は是非ご覧ください。

以上、参考になればうれしいです。

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です