2

暗号化された 2007 Excel ドキュメントを読み取ろうとすると、OOXML ライブラリの使用に問題が発生します。DecryptToStream メソッドに送信したパスワードは、「パスワードが無効です」というメッセージを送り返していますが、Excel に直接アクセスすると、パスワードは正常に機能します。以下は私が使用しているコードです。

OleStorage ols = new OleStorage(d.fileLocation);
OfficeCrypto oc = new OfficeCrypto();
Stream test = oc.DecryptToStream(ols, "test123");

また、POI Decryptor を使用して、暗号化された 2007 Excel を読み取ろうとしましたが、これもうまくいきませんでした。以下はコードです。

FileStream file = new FileStream(d.fileLocation, FileMode.Open, System.IO.FileAccess.Read);
NPOI.POIFS.FileSystem.POIFSFileSystem nfs;
nfs = new NPOI.POIFS.FileSystem.POIFSFileSystem(file);
Stream excelData;
try
{
    string password = "test123";
    EncryptionInfo info = new EncryptionInfo(nfs);
    Decryptor dc = Decryptor.GetInstance(info);

    if (!dc.VerifyPassword(password))
    {
        throw new NotImplementedException();
    }

    excelData = dc.GetDataStream(nfs);

}
catch (Exception ex)
{
    excelData = (Stream)file;
}

VerifyPassword メソッドは、何を渡しても常に true を返し、ドキュメントを読み取れません。http://poi.apache.org/encryption.htmlを参考に上記のコードを作成しました。

どんな助けでも大歓迎です!

4

1 に答える 1

3

私の知る限り、現在のNPOI バージョン 1.2.5は Excel2007 ファイルをサポートしていません。幸いなことに、 NPOI 2.0 アルファ版 は Excel2007 ファイルをサポートしていますが、暗号化された Excel ファイルはサポートしていません。

ただし、暗号化された Excel ファイルの読み取りをサポートするOfficeOpenXmlCryptoというプロジェクトがあります。このプロジェクトは、NPOI バージョン 1.2.1 と、Excel 2007 ファイルを読み取るためのExcelPackageプロジェクトに基づいています。

OfficeOpenXmlCryptoプロジェクトのソースをダウンロードし、古い NPOI ライブラリを新しい NPOI 2.0 ライブラリに置き換えて、プロジェクトをコンパイルできます。

次に、XSSFWorkbookOfficeCryptoStreamクラスの組み合わせを使用して、暗号化された Excel ファイルの内容を読み取ることができます。

using (OfficeCryptoStream ocs = OfficeCryptoStream.Open("c:\\temp\\secured.xlsx", "PA$$W0rd"))
{
  NPOI.XSSF.UserModel.XSSFWorkbook w = new NPOI.XSSF.UserModel.XSSFWorkbook(ocs);

  NPOI.xssf.extractor.XSSFExcelExtractor ee = new NPOI.xssf.extractor.XSSFExcelExtractor(w);

  Console.Out.WriteLine(ee.Text);                    
}

代わりに、EPPlus クラス ライブラリExcelPackageは、暗号化された Excel ドキュメントをサポートする と呼ばれるクラスを提供します。このクラスにWorkbookは、Excel ドキュメントのコンテンツにアクセスするためのいくつかのプロパティ ( ) もあります。

以下は、暗号化された Excel ファイルの最初のセルを読み取る簡単な例です。

using (FileStream file = new FileStream("c:\\temp\\secure.xlsx", 
       FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
{
  using (ExcelPackage ep = new ExcelPackage(file, "P@$$W0rd"))
  {
    Console.Out.WriteLine(ep.Workbook.Worksheets[1].Cells["A1"].Value);     
  }
} 

OpenXml 2.0 SDK SpreadsheetDocumentクラスをクラスと組み合わせて使用​​することもできますExcelPackage

次のコードを使用して、最初のセル (暗号化された Excel ドキュメント) の内容を読み取ります。

using (FileStream file = new FileStream("c:\\temp\\secure.xlsx", 
       FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
{
  using (ExcelPackage ep = new ExcelPackage(file, "P@$$W0rd"))
  {     
    using (SpreadsheetDocument sd = SpreadsheetDocument.Open(ep.Package))
    {
      WorkbookPart workbookPart = sd.WorkbookPart;
      WorksheetPart worksheetPart = workbookPart.WorksheetParts.Last();
      SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

      var row = sheetData.Elements<Row>().FirstOrDefault();
      var cell = row.Elements<Cell>().FirstOrDefault();

      Console.Out.WriteLine(cell.CellValue.InnerText);
    }
  }
}

パスワードが無効な場合、クラスのコンストラクターは をExcelPackageスローします。UnauthorizedAccessException

于 2012-09-26T18:25:36.463 に答える