2012-09-25 2 views
2

암호화 된 2007 Excel 문서를 읽으려고 할 때 OOXML 라이브러리를 사용하는 데 문제가 있습니다. DecryptToStream 메서드에 보내는 암호는 "Password not valid"메시지를 다시 보내지만 직접 입력하면 암호가 제대로 작동합니다. 아래는 내가 사용하고있는 코드입니다.OOXML Excel 암호가 작동하지 않는 NPOI

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

는 또한 암호화 된 2007 엑셀을 읽으려고 시도하는 POI 해독기를 사용하여 시도했다, 그러나 나는뿐만 아니라이와 운이 없었 없습니다. 아래는 코드입니다.

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 방법에 관계없이 항상 내가 전달할 어떤 사실 반환되지 않으며 여전히 문서를 읽지 않습니다. 나는 위의 코드를 참조로 http://poi.apache.org/encryption.html을 사용하여 만들었습니다.

도움이 될 것입니다.

답변

2

내가 아는 한 현재 NPOI 버전 1.2.5은 Excel2007 파일을 지원하지 않습니다. 다행히 NPOI 2.0 alpha version 은 Excel2007 파일을 지원하지만 암호화 된 Excel 파일은 지원하지 않습니다.

그러나 암호화 된 Excel 파일 읽기를 지원하는 OfficeOpenXmlCrypto 이라는 프로젝트가 있습니다. 이 프로젝트는 Excel 2007 파일을 읽는 NPOI 버전 1.2.1 및 ExcelPackage 프로젝트를 기반으로합니다.

당신은 OfficeOpenXmlCrypto 프로젝트의 소스를 다운로드 새로운 NPOI 2.0 라이브러리 이전 NPOI 라이브러리를 교체하고 프로젝트를 컴파일 할 수 있습니다. EPPlus class library 가 지원을 제공 ExcelPackage라는 클래스를 제공하는 대안으로

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);      
} 

:

그런 다음 암호화 된 엑셀 파일의 내용을 읽을 수있는 XSSFWorkbookOfficeCryptoStream 클래스 의 comibnation을 사용할 수 있습니다 암호화 된 Excel 문서 이 클래스에는 Excel 문서의 내용에 액세스 할 수있는 몇 가지 속성 (Workbook) 이 있습니다.

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

당신은 또한 ExcelPackage 클래스와 함께 에 OPENXML 2.0 SDKSpreadsheetDocument 클래스를 사용할 수 있습니다 : 여기

암호화 된 Excel 파일의 첫 번째 셀을 읽는 간단한 예입니다.

는 첫 번째 셀 (암호화 된 엑셀 문서)의 내용을 읽고 다음 코드를 사용하여 암호가 유효하지 않은 경우

using (FileStream file = new FileStream("c:\\temp\\secure.xlsx", 
     FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite)) 
{ 
    using (ExcelPackage ep = new ExcelPackage(file, "[email protected]$$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가 발생합니다.

+0

도움을 주신 Hans에게 감사드립니다. 나는이 첫번째 일을 내일 시도하고 그에 따라 표시 할 것이다. –

+0

위의 해결책을 사용하여 몇 가지 문제가 있습니다. NPOI 클래스 라이브러리에는 ExcelPackage 클래스가 없습니다.여기에 포함시킬 수있는 또 다른 라이브러리는 http://excelpackage.codeplex.com/ 클래스를 포함하고 있습니다. ExcelPackage.dll을 추가 할 때. 귀하의 예제에서 생성자는 문자열과 파일 스트림보다는 fileinfo를 취하므로 작동하지 않습니다. 마지막으로, ExcelPackage 라이브러리를 연구 할 때, 여기에있는 EPPlus 라이브러리를 사용하는 것이 더 좋음을 알았습니다 : http://epplus.codeplex.com/. 당신의 대답에 대한 평가가 잘못 되었다면 저를 바로 잡으십시오. –

+0

한스의 솔루션은 EPPlus 문서와 매우 유사하게 보입니다. EPPlus를 의미 할 때 실수로 NPOI를 넣었을 수도 있습니다. EPPlus를 사용할 때 나는 당신의 답을 받아 들였습니다. –

관련 문제