メイン画像

EPPlus - Excelファイルを保存する

EPPlus - Excelファイルを保存する


EPPlus でブックを保存する方法を紹介する。

サンプルの動作確認には、以下の環境を利用した。

  • .NET Framework 4.8
  • EPPlus 4.5.3.3
    (商用利用できる最後のバージョン)

上書き保存

Excel ブックを FileInfo 指定で開いた場合は、 ExcelPackage.Save メソッドで上書き保存できる。

良いか悪いか、書き込みパスワードが設定されているブックも、パスワードを入力することなく上書き保存できた。

var fi = new FileInfo(@"C:\tmp\EPPlus\Book1.xlsx");

using (var package = new ExcelPackage(fi))
{
    //
    // ~~~何らかの処理~~~
    //

    // 上書き保存
    package.Save();
}

Stream 指定で開いた場合、Save メソッドでは保存されなかった。
(Stream.CanWrite プロパティは true なのに)

例外も発生しなかったので、上書き保存されなかったことを検知する術はなさそうだ。

Stream 指定で開いた場合は、後述の「名前を付けて保存」のやり方で保存するしかないだろう。

using (var package = new ExcelPackage())
{
    using (var stream = new FileStream(@"C:\tmp\EPPlus\Book1.xlsx",
                                       FileMode.Open))
    {
        // ブックを開く
        package.Load(stream);

        //
        // ~~~何らかの処理~~~
        //

        // 上書き保存……されない?!
        package.Save();
    }
}

名前を付けて保存

ExcelPackage.SaveAs メソッドで名前を付けて保存ができる。
メソッドの引数には FileInfo または Stream を指定する。

// 名前を付けて保存
var newFi = new FileInfo(@"C:\tmp\EPPlus\NewBook1.xlsx");
package.SaveAs(newFi);
// 名前を付けて保存
using (var outputStream = new FileStream(@"C:\tmp\EPPlus\NewBook1.xlsx",
                                         FileMode.Create))
{
    package.SaveAs(outputStream);
}

書き込みできないストリーム(Stream.CanWrite プロパティが false)を指定した場合、例外が発生する。
発生する例外は System.Exception: Can not write to outputstream 。

try
{
    // 名前を付けて保存
    // 読み取り専用のストリームを指定してみる
    using (var outputStream = new FileStream(@"C:\tmp\EPPlus\NewBook1.xlsx",
                                             FileMode.Open,
                                             FileAccess.Read,
                                             FileShare.ReadWrite))
    {
        package.SaveAs(outputStream);
    }
}
catch (Exception ex)
{
    // 例外が投げられた
    //   System.Exception: Can not write to outputstream
    System.Diagnostics.Debug.WriteLine(ex.Message);
}

読み取りパスワードを付けて保存

読み取りパスワードを付けて保存するには、次のいずれかの方法を使う。

  • プロパティに設定してから保存する
  • 保存時に指定する

プロパティに設定してから保存する

ExcelPackage.Encryption.Password プロパティにパスワードを設定してから保存する。

// パスワードを設定
package.Encryption.Password = "ABCDEFGH";

// 上書き保存
package.Save();

// ↑もちろん名前を付けて保存(SaveAs)も可

保存時に指定する

ExcelPackage.SaveAs メソッドの第2引数にパスワードを指定して保存する。

// 名前を付けて保存(SaveAs メソッドの第2引数がパスワード)
var newFi = new FileInfo(@"C:\tmp\EPPlus\NewBook1.xlsx");
package.SaveAs(newFi, "ABCDEFGH");

優先度は SaveAs メソッドで指定したパスワードの方が高い

もし、両方に指定した場合、 SaveAs メソッドに指定したパスワードが保存される。

// パスワードを設定
package.Encryption.Password = "ABCDEFGH";

// 名前を付けて保存
// (SaveAs メソッドの第2引数にもパスワードを指定。こちらが使われる)
var newFi = new FileInfo(@"C:\tmp\EPPlus\NewBook1.xlsx");
package.SaveAs(newFi, "12345678");

書き込みパスワードを付けて保存(おそらくできない)

書き込みパスワードを付ける機能はないと思われ。

元から書き込みパスワードが設定されたブックを開いて上書き保存は可能だが、新しくパスワードを設定したり、パスワードを変更したりはできない。


アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事