はじめに
Excel不要の新しいExcelライブラリ「SpreadsheetLight」の使い方を、NuGetでのインストールするところから解説します。
「C#から簡単にExcelファイルの扱いたい」という方は是非一度お試しください。
- 自動でエクセルデータを集計する
- CSVをグラフ付エクセルに自動変換する
- NetOfficeなど遅いライブラリと入れ替えて高速化をする
「SpreadsheetLightって何?」という方は以下の記事をご覧ください。
環境
この記事は以下の環境で作成、動作確認を行っています。
環境 | バージョンなど | 備考 |
VisualStudio | 2019 Community | 2017でも使用できます |
.NET | 4.7.2 | |
プロジェクト | コンソールアプリケーション(.NET Framework) | |
SpreadsheetLight | 3.5.0 |
NuGetでのインストール方法
VisualStudioのメニューの「プロジェクト」から、「NuGetパッケージの管理」を選択します。
開いたウインド内で「参照」を選択し、検索欄に「SpreadsheetLight」と入力します。
表示された「SpreadsheetLight」を選択して「インストール」を押します。

インストールの途中、MicrosoftのDLLへのライセンスの同意が求められるので、「同意する」を選択します。
ざっと調べたところ、上記のライセンス条項は「DLLを改変しない」という内容のようです。あまり詳しくは調べていないので、仕事などで商用利用する場合はご自身で再度規約等をご確認ください。
実行結果
後述するコードを実行すると、以下の氏名・スコア・合計の表が、エクセルファイルが出力されます。
※ xlsx出力したものをLibreOfficeで表示しています。
※ Excelで表示した際も同様の結果となります。
フォントが「Office 2007 – 2010以外」で作られてたファイルをSpreadSheetLightで読み込んで、追記。再度エクセルで開くと「ファイルが破損している」と表示されて開けなくなります。
既存のファイルをSpreadSheetLightで追記する場合は、エクセルの「ページレイアウト」→「テーマ」→「フォント」で「Office 2007 – 2010」を設定してください。
※ 情報いただいた、NWさん、とおりすがりさん、NagNagさん、ヌルモンテさんありがとうございます。
全体コード
前述した表を出力するコードは以下の通りです。合計はエクセルの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オブジェクトを使ってもっと簡単に作成する方法もあるようです。今後掘り下げて、別記事で解説していきたいと思います。
SpreadSheetLightでグラフを挿入
以下の記事で、SpreadSheetLightでグラフを挿入する方法を解説しています。興味のある方は以下もご覧ください。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。
初めまして
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ファイル」を読み込むようにして、
問題がファイル側か、コード側かの切り分けをしてみるのはいかがでしょうか。
解決方法に至らずに申し訳ないですが、参考まで。
Excel 2019で作成したxlsxファイルをSpreadsheetLightで読み込んで保存するとファイルが破損します。
2019には対応していないのでしょうか?
とおりすがりさん、こんにちは。
連絡が遅くなりすみません。えすです。
私の環境で、Excel 2019で作成したファイル(データは1セルのみ)を読み込み・保存してみましたが、
破損は起きませんでした。
基本的には、エクセル2019でも使えると思いますが、
図・画像・計算式など、すべての機能には対応していないと思うので、
読み込み元のエクセルをシンプルにするなどの、工夫は必要かもしれません。
既存ファイルの読み込み保存するとファイルが破損するようですが、SpreadsheetLightにて作成したexcelファイルに既存ファイルのシートを張り付けて読み込ませるとうまくいきました。(シートの貼り付けは手動)
NWさん、とおりすがりさんと同じような状況だったと思いますので、参考になれば。
NagNagさん
えすです。
貼り付けすると読み込みできるんですね。
貴重な情報ありがとうございます。
私も同じような状況で困っていましたが
SpreadsheetLightとExcel2016でそれぞれ新規作成した
ファイルを見比べていた所、フォントが違う事に気付き
Excel2016で新規作成後、ページレイアウトタブの
テーマ枠内のフォントでOffice 2007 – 2010を選択し保存した所
SpreadsheetLightで読み込んで保存しても破損しませんでした。
ヌルモンテさん、こんにちは
えすです。
情報ありがとうございます!
私も試してみます
ヌルモンテさん
えすです。
手元の環境(Excel 2019)でも、ファイル破損の再現と、教えていただたいたフォントの変更での回避が確認できました。
改めて、貴重な情報を教えていただき、ありがとうございます。
困っているユーザーさんも多いと思うので、このコメント欄にプラスして、記事内の注意追加、回避方法の新記事などで、皆さんにお知らせしたいと思います。
もし、不都合があれば対応しますので、その際はコメント欄等でお知らせください。