Excel

【C#】SpreadsheetLightでExcelファイルを出力する方法【インストール方法あり】

はじめに

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

「C#から簡単にExcelファイルの扱いたい」という方は是非一度お試しください。

こんなことに使える
  • 自動でエクセルデータを集計する
  • CSVをグラフ付エクセルに自動変換する
  • NetOfficeなど遅いライブラリと入れ替えて高速化をする

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

環境

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

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

NuGetでのインストール方法

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

VisualStudioのメニューで、NuGetの画面を表示させる方法を説明した画像

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

NuGetでSpreadSheetLightを検索してインストールする方法を説明した画像

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

ライセンスの同意画面の説明

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

実行結果

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

SpreadSheetLightで生成したエクセルファイルを表示した画像

※ 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オブジェクトを使ってもっと簡単に作成する方法もあるようです。今後掘り下げて、別記事で解説していきたいと思います。

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

Lenovo Web広告限定ストア

エキスパートがよく使う「ThinkPad」や、コスパ抜群の「IdeaPad」がお得に購入できます。そろそろ、Macに負けない機能的なデザイン、フルカスタマイズしたPCが欲しい!とい方は以下のリンクからお得に購入してください。特別割引価格やクーポン情報がGETできます。

Lenovo

効率的にエクセルを使う方法

Excelで大量のデータを扱うなら、高解像度のディスプレイが絶対おすすめです。WQHD対応モニターなら、同サイズのフルHDと比べて1.8倍の情報量。表示のストレスも劇的に減って、仕事のモチベが上がります。さらに今なら30%オフのセール中です。


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

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

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

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

POSTED COMMENT

  1. NW より:

    初めまして
    SpreadsheetLightで以下の点で困っております。

    既存(ひな形)のExcelファイルを開き編集して出力した場合にExcelを開くと「ファイルが破損しています。」で開けないのですが・・・
    解決方法がわかればご教示頂けませんでしょうか
    よろしくお願いいたします。

    SLDocument sl = new SLDocument(“hoge.xlsx”, “Sheet1”);
    context.Response.Clear();
    context.Response.ContentType = “application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”;
    context.Response.AddHeader(“Content-Disposition”, “attachment; filename=hogehoge.xlsx”);
    sl.SaveAs(context.Response.OutputStream);
    context.Response.End();

    • えす より:

      NWさん、こんにちは
      ご質問ありがとうございます。

      いただいたコードでの再現など、お力になれるか確認してみます。

      • えす より:

        NWさん こんにちは

        ソースからASP.NETと推測して、.NetFrameworkのWebFormでコードを試してみました。

        ASP.NETは詳しくないので自信はないのですが、結論として「ファイルが破損しています」のエラーは発生しませんでした。
        (空のxlsxファイルを読み込んでダウンロード実行。Excel, LibreOfficeCalc共にエラーなし)

        原因も推測ですが、もしかすると、既存のExcelファイル上の何か(罫線・画像・マクロ・シート etc…)に、
        SpreadsheetLightが対応できずに破損させているのかもしれません。

        一度同じコードで、「新規作成した中身が空のExcelファイル」を読み込むようにして、
        問題がファイル側か、コード側かの切り分けをしてみるのはいかがでしょうか。

        解決方法に至らずに申し訳ないですが、参考まで。

COMMENT

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