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" が設定される
書き込みパスワードを付けて保存する(たぶん無理)
書き込みパスワードを付ける機能はなさそうである。
元から書き込みパスワードが設定されたブックを開いて上書き保存はできるが、新しくパスワードを設定したり、パスワードを変更したりはできない。