EPPlus を使ってブックを操作する方法。

 

新しいブックを作る

 

新しいブックを作るには ExcelPackage のオブジェクトを作成する。

 

using (var package = new ExcelPackage())
{
}

 

ただし、この状態はメモリ上に作られたというだけである。
大多数の場合はファイルとしてほしいだろうから、ファイルに保存する操作も必要である。

 

また、ブック内にワークシートが一つもない状態なので、実際はワークシートも追加しなくてはならない。

 

 

新しいブックにシート(Sheet1)を追加し、ファイルに保存するサンプルを以下に示す。

 

using (var package = new ExcelPackage())
{
    var sheet = package.Workbook.Worksheets.Add("Sheet1");
    package.SaveAs(new FileInfo(@"C:\tmp\EPPlus\NewBook.xlsx"));
}

 

ブックを開く(FileInfoを使う方法)

 

ExcelPackage のコンストラクタに FileInfo を指定してブックを開く。

 

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

using (var package = new ExcelPackage(fi))
{
    // TODO: 処理を書く
}

 

ブックを開く(Streamを使う方法)

 

Stream を使う場合、次のいずれかの方法でブックを開ける。

 

  • ExcelPackage のコンストラクタを使う
  • ExcelPackage.Load メソッドを使う

 

 

ExcelPackage のコンストラクタを使う場合は次のように書く。

 

using (var stream = new FileStream(@"C:\tmp\EPPlus\Book1.xlsx",
                                   FileMode.Open))
{
    // コンストラクタにStreamを指定する
    using (var package = new ExcelPackage(stream))
    {
        // TODO: 処理を書く
    }
}

 

 

ExcelPackage.Load メソッドを使う場合は次のように書く。

 

using (var package = new ExcelPackage())
{
    using (var stream = new FileStream(@"C:\tmp\EPPlus\Book1.xlsx",
                                       FileMode.Open))
    {
        // LoadメソッドにStreamを指定する
        package.Load(stream);
    }

    // TODO: 処理を書く
}

 

読み取りパスワード付きブックを開く

 

読み取りパスワードが設定されたブックは、開くときにパスワードを一緒に指定すれば開ける。

 

ExcelPackage のコンストラクタを使う場合、第2引数にパスワードを指定する。

 

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

using (var package = new ExcelPackage(fi, "12345678"))
{
    // 略

 

Stream の場合も同様で、ExcelPackage のコンストラクタの第2引数にパスワードを指定する。

 

using (var stream = new FileStream(@"C:\tmp\EPPlus\Book2.xlsx",
                                   FileMode.Open))
{
    using (var package = new ExcelPackage(stream, "12345678"))
    {
        // 略

 

ExcelPackage.Load メソッドを使う場合、メソッドの第2引数にパスワードを指定する。

 

package.Load(stream, "12345678");

 

パスワードに誤りがある場合は、System.Security.SecurityException: ‘Invalid password’ が発生する。

 

ブックを上書き保存する

 

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 を指定する。

 

//
// FileInfoを使う場合
//
// 名前を付けて保存
var newFi = new FileInfo(@"C:\tmp\EPPlus\NewBook1.xlsx");
package.SaveAs(newFi);

//
// Streamを使う場合
//
// 名前を付けて保存
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";

// 上書き保存(もちろん名前を付けて保存(SaveAs)も可)
package.Save();

 

保存時に指定する

 

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

 

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

 

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

 

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

 

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

// 名前を付けて保存(こちらにもパスワードを指定)
var newFi = new FileInfo(@"C:\tmp\EPPlus\NewBook1.xlsx");
package.SaveAs(newFi, "12345678");

// → 読み取りパスワードには "12345678" が設定される

 

書き込みパスワードを付けて保存する(たぶん無理)

 

書き込みパスワードを付ける機能はなさそうである。

 

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