C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

エクセルファイルのパスワードを解除して保存する方法 /河童 (19/06/03(Mon) 19:55) #91148
Re[1]: エクセルファイルのパスワードを解除して保存する方法 /Hongliang (19/06/04(Tue) 11:37) #91154
  └ Re[2]: エクセルファイルのパスワードを解除して保存する方法 /河童 (19/06/07(Fri) 18:59) #91235
    └ Re[3]: エクセルファイルのパスワードを解除して保存する方法 /Hongliang (19/06/07(Fri) 19:25) #91236
      └ Re[4]: エクセルファイルのパスワードを解除して保存する方法 /河童 (19/06/09(Sun) 10:34) #91260 解決済み


親記事 / ▼[ 91154 ]
■91148 / 親階層)  エクセルファイルのパスワードを解除して保存する方法
□投稿者/ 河童 (51回)-(2019/06/03(Mon) 19:55:06)

分類:[C#] 

いつも大変お世話になっております。


読み取りパスワードと書き込みパスワードが設定されたエクセルファイルを
パスワード設定なしの別名でファイルを保存したいと思っています。

EPPlusというライブラリを利用しています。
エクセルはExcel2010です。

わからないことは、
書き込みパスワードが解除されないことです。

package.Encryption.Password = "";

別名のファイルを開くと読み取りパスワードは解除されているのですが、
書き込みパスワードが解除されていません。


どうにかして両方のパスワードを解除することはできないでしょうか?
違う方法でもパスワードなしでファイルを保存する方法はないでしょうか?

アドバイス、よろしくお願いします。


// For EPPlus
using OfficeOpenXml;
using OfficeOpenXml.Style;

// パスワードが設定されているエクセル
var template = new FileInfo(xlsFile);

// パスワードは「1111」
using (ExcelPackage package = new ExcelPackage(template, "1111"))
{
// シート名「201906」
string SN = "201906";
ExcelWorksheets worksheets = package.Workbook.Worksheets;
var sheet = worksheets[SN];

  // パスワード解除
package.Encryption.Password = "";

// 別名でエクセルを保存
package.SaveAs(new FileInfo(@"C:\Sample.xlsx"));

}
[ □ Tree ] 返信 編集キー/

▲[ 91148 ] / ▼[ 91235 ]
■91154 / 1階層)  Re[1]: エクセルファイルのパスワードを解除して保存する方法
□投稿者/ Hongliang (814回)-(2019/06/04(Tue) 11:37:45)
2019/06/04(Tue) 13:08:13 編集(投稿者)
2019/06/04(Tue) 13:04:29 編集(投稿者)

.xlsxの中身を見た感じ、workbook.xml内の
/workbook/fileSharing/@reservationPassword
が書き込みパスワード(のハッシュ値)のようですが、EPPlusのソース内にはこの名前が見つからないので、プロパティなどの形では対応してないようです。
直接XMLをいじればなんとかなるようです。

// using System.Xml;
var doc = package.Workbook.WorkbookXml;
var man = new XmlNamespaceManager(doc.NameTable);
var root = doc.DocumentElement;
man.AddNamespace("def", root.NamespaceURI);
var sharing = (XmlElement)root.SelectSingleNode("def:fileSharing", man);
sharing.RemoveAttribute("reservationPassword");

package.SaveAs(...);

<追記>
Office2013からはreservationPasswordではなくて他の属性を使うみたい?
新旧どちらでも使える方法として、fileSharing要素自体をworkbook要素から削除すればいいみたい。
[ 親 91148 / □ Tree ] 返信 編集キー/

▲[ 91154 ] / ▼[ 91236 ]
■91235 / 2階層)  Re[2]: エクセルファイルのパスワードを解除して保存する方法
□投稿者/ 河童 (52回)-(2019/06/07(Fri) 18:59:50)
こんばんは。
Hongliang さん、お返事ありがとうございます。

なかなか難しくて、
まだ書き込みパスワードが解除できていません。
ビルドしたときにエラーは発生していないのですが、
コピーしたファイルを開くと書き込みのパスワードを
聞いてきます。 

// For EPPlus
using OfficeOpenXml;
using OfficeOpenXml.Style;

// パスワードが設定されているエクセル
var template = new FileInfo(xlsFile);

// パスワードは「1111」
using (ExcelPackage package = new ExcelPackage(template, "1111"))
{
// シート名「201906」
string SN = "201906";
ExcelWorksheets worksheets = package.Workbook.Worksheets;
var sheet = worksheets[SN];

// 読み取りパスワード解除
package.Encryption.Password = "";

// EPPlusには書き込みパスワードの解除のプロパティがなかったので
// 直接XMLを操作している
var doc = package.Workbook.WorkbookXml;
var man = new XmlNamespaceManager(doc.NameTable);
var root = doc.DocumentElement;
man.AddNamespace("def", root.NamespaceURI);
var sharing = (XmlElement)root.SelectSingleNode("def:fileSharing", man);
// 書き込みパスワードの解除
//sharing.RemoveAttribute("reservationPassword");
sharing.RemoveAttribute("1111");


// 別名でエクセルを保存
package.SaveAs(new FileInfo(@"C:\Sample.xlsx"));

[ 親 91148 / □ Tree ] 返信 編集キー/

▲[ 91235 ] / ▼[ 91260 ]
■91236 / 3階層)  Re[3]: エクセルファイルのパスワードを解除して保存する方法
□投稿者/ Hongliang (821回)-(2019/06/07(Fri) 19:25:03)
一度doc.InnerXmlを表示させてみて、XMLの構造がどうなっているか確認してみては如何でしょう。

fileSharing要素自体は存在しているようなので、要素削除の方で行った方が良いかも。
// sharing.RemoveAttribute("reservationPassword");
root.RemoveChild(sharing);
[ 親 91148 / □ Tree ] 返信 編集キー/

▲[ 91236 ] / 返信無し
■91260 / 4階層)  Re[4]: エクセルファイルのパスワードを解除して保存する方法
□投稿者/ 河童 (53回)-(2019/06/09(Sun) 10:34:49)
Hongliang さん、ありがとうございました。

XMLの確認方法から調べてみます。

また不明点ができたときは、よろしくお願いします。

解決済み
[ 親 91148 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -