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

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

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

エクセルファイルのパスワードを解除して保存する方法

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■91148 / inTopicNo.1)  エクセルファイルのパスワードを解除して保存する方法
  
□投稿者/ 河童 (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"));

}
引用返信 編集キー/
■91154 / inTopicNo.2)  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要素から削除すればいいみたい。
引用返信 編集キー/
■91235 / inTopicNo.3)  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"));

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

fileSharing要素自体は存在しているようなので、要素削除の方で行った方が良いかも。
// sharing.RemoveAttribute("reservationPassword");
root.RemoveChild(sharing);
引用返信 編集キー/
■91260 / inTopicNo.5)  Re[4]: エクセルファイルのパスワードを解除して保存する方法
□投稿者/ 河童 (53回)-(2019/06/09(Sun) 10:34:49)
Hongliang さん、ありがとうございました。

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

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

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ