OpenXml获取被保护Sheet的密码并革除保护
OpenXml获取被保护Sheet的密码并解除保护
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DocumentFormat.OpenXml.Spreadsheet; using com.mksword.Net.OpenXmlTools; using com.mksword.OpenXmlUtil_log4netTool; using DocumentFormat.OpenXml.Packaging; namespace ConsoleApplication5 { class Class1 : ExcelTool { public override void Action() { if (_Core.HandOpenSpreadsheetDocumentOnLoacl(UnProtectCell, true)) { SetLog("UnProcted", OXULogType.INFO); } else { SetLog("Operation Failed", OXULogType.FATAL); } } private bool UnProtectCell(SpreadsheetDocument SSD) { bool result = false; WorkbookPart WBP = SSD.WorkbookPart; Workbook WB = WBP.Workbook; Sheet S = WB.Descendants<Sheet>().Where(SH => SH.Name == "Sheet1") .FirstOrDefault(); if (S != null) { WorksheetPart WSP = WBP.GetPartById(S.Id) as WorksheetPart; Worksheet WS = WSP.Worksheet; SheetProtection SP = WS.Descendants<SheetProtection>() .FirstOrDefault(); if (SP != null) { SetLog(SP.Password.Value, OXULogType.FATAL); SP.Remove(); WS.Save(); result = true; } else SetLog("SheetProtection in NULL", OXULogType.FATAL); } else SetLog("Sheet is NULL", OXULogType.FATAL); return result; } public String GetSheetPassword(String password) { Int32 pLength = password.Length; Int32 hash = 0; if (pLength == 0) return hash.ToString("X"); for (Int32 i = pLength - 1; i >= 0; i--) { hash = hash >> 14 & 0x01 | hash << 1 & 0x7fff; hash ^= password[i]; } hash = hash >> 14 & 0x01 | hash << 1 & 0x7fff; hash ^= 0x8000 | 'N' << 8 | 'K'; hash ^= pLength; return hash.ToString("X"); } } }