2016-09-12 20 views
5

Şu anda, MemoryStream parametresini geçirerek Open XML SpreadsheetDocument sınıfında yeni bir Excel belgesi oluşturuyorum. Şu anda bu SpreadsheetDocument nesnesinde bir parola ayarlamam gerekiyor, ancak denediğim şey işe yaramıyor gibi görünüyor. Excel belgesi, şifre sormadan açılır.Açık XML ile bir Excel belgesini nasıl parola ile koruruz

using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(mem, true)) 
{ 
    foreach (var sheet in spreadsheet.WorkbookPart.WorksheetParts) 
    { 
     sheet.Worksheet.Append(new SheetProtection() { Password = "test" }); 
    } 
} 

Ben de çalıştılar hiçbir başarı ile şu:

using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(mem, true)) 
{ 
    spreadsheet.WorkbookPart.Workbook.WorkbookProtection = new WorkbookProtection 
    { 
     LockStructure = true, 
     LockWindows = true, 
     WorkbookPassword = "test" 
    } 
} 

Ne lütfen Eksik Aşağıda (memMemoryStream parametre olmak üzere) Ben şimdiye kadar denedim nedir?

+0

Olası kopyalar (http://stackoverflow.com/questions/15168011/excel-file-password-protection-with-open-xml-sdk) –

+0

Evet Bu benim ilk denememin kod örneğini aldığım ama başarılı olmadığı yer. –

+0

Ve başka [SO yanıt sonrası] o, fark etmedi (http://stackoverflow.com/a/15281182/997668) bir çağrı yapmak için önermektedir 'Kaydet()' o durumda yöntemi çalışmıyor? '// yine de çalışmıyorsa bunu ekleyin. Bu, verilerin kaydedildiğinden emin olur. //worksheet.Worksheet.Save(); ' Denediniz mi? Bu da yardımcı olmadı mı? – Michael

cevap

0

Tamam, tam olarak ne yapmak istediğimi değil, ama ben Açık XML SDK'sını bırakarak ve belgeyi korumak için Office.Interop derlemelerini kullanmaya son verdim. Açık XML kullanmanın ilk nedeni, bir Interop çalışma kitabının bir akışla açılamaması, gerçek bir dosya gerektirmesiydi.

0

Bu deneyebilirsiniz:

using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(mem, true)) 
{ 
    foreach (var worksheetPart in spreadsheet.WorkbookPart.WorksheetParts) 
    { 
      SheetProtection sheetProt = new SheetProtection() { Sheet = true, Objects = true, Scenarios = true, Password = "test" }; 
      worksheetPart.Worksheet.InsertAfter(sheetProt, worksheetPart.Worksheet.Descendants<SheetData>().LastOrDefault()); 
    } 
} 
3

açık XML sac Şifre "HexBinaryValue" giriş Veri türü vardır korur. bu yüzden giriş şifresi dizeden hexa'ya dönüştürülür.

foreach (var worksheetPart in spreadsheet.WorkbookPart.WorksheetParts) 
    { 
     //Call the method to convert the Password string "MyPasswordfor sheet" to hexbinary type 
     string hexConvertedPassword = HexPasswordConversion("MyPasswordfor sheet"); 
//passing the Converted password to sheet protection 
      SheetProtection sheetProt = new SheetProtection() { Sheet = true, Objects = true, Scenarios = true, Password = hexConvertedPassword }; 
      worksheetPart.Worksheet.InsertAfter(sheetProt,worksheetPart.Worksheet.Descendants<SheetData>().LastOrDefault()); 
worksheetPart.Worksheet.Save(); 
    } 


/* This method will convert the string password to hexabinary value */ 
protected string HexPasswordConversion(string password) 
     { 
      byte[] passwordCharacters = System.Text.Encoding.ASCII.GetBytes(password); 
      int hash = 0; 
      if (passwordCharacters.Length > 0) 
      { 
       int charIndex = passwordCharacters.Length; 

       while (charIndex-- > 0) 
       { 
        hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff); 
        hash ^= passwordCharacters[charIndex]; 
       } 
       // Main difference from spec, also hash with charcount 
       hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff); 
       hash ^= passwordCharacters.Length; 
       hash ^= (0x8000 | ('N' << 8) | 'K'); 
      } 

      return Convert.ToString(hash, 16).ToUpperInvariant(); 
     } 
[Excel Açık XML SDK ile Şifre Koruması Dosya] arasında
+0

nereye karma şifreyi hesaplamak için algoritma aldın bozuk oldu? –