我使用Open XML SDK创建excel文件。
我想用密码保护他们。
您是否知道使用Open XML SDK以密码保护excel文件?
我知道“com”对象的方式来保护它们,但它不适合我的应用程序。我需要使用Open XML SDK或其他方式来保护文件。
答案 0 :(得分:4)
通过打开xml,可以创建用于保护工作簿或工作表的Excel密码。
以下代码示例是Vincent(http://spreadsheetlight.com/about/)(https://stackoverflow.com/users/12984/vincent-tan)的建议(我再次感谢他):
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docname,true))
{
foreach (var worksheet in spreadSheet.WorkbookPart.WorksheetParts)
{
worksheet.Worksheet.Append(new SheetProtection(){ Password = “CC”});
// add this in case it still doesn’t work. This makes sure the data is saved.
//worksheet.Worksheet.Save();
}
}
如果您有图表或其他内容
以下代码示例是Vincent(http://spreadsheetlight.com/about/)(https://stackoverflow.com/users/12984/vincent-tan)的建议(我再次感谢他):
bool bFound;
OpenXmlElement oxe;
SheetProtection prot;
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open("OtoPark.xlsx", true))
{
foreach (var worksheet in spreadSheet.WorkbookPart.WorksheetParts)
{
prot = new SheetProtection();
prot.Password = "CC";
// these are the "default" Excel settings when you do a normal protect
prot.Sheet = true;
prot.Objects = true;
prot.Scenarios = true;
// Open up Excel and do a password protect yourself and use the
// Productivity Tool to see the property values of the resulting Excel file.
// Consider not using the Password property and use:
//prot.AlgorithmName = "SHA-512";
//prot.HashValue = "somehashvaluebythealgorithm";
//prot.SaltValue = "somesalt";
//prot.SpinCount = 100000;
bFound = false;
oxe = worksheet.Worksheet.FirstChild;
foreach (var child in worksheet.Worksheet.ChildElements)
{
// start with SheetData because it's a required child element
if (child is SheetData || child is SheetCalculationProperties)
{
oxe = child;
bFound = true;
}
}
if (bFound)
{
worksheet.Worksheet.InsertAfter(prot, oxe);
}
else
{
worksheet.Worksheet.PrependChild(prot);
}
worksheet.Worksheet.Save();
}
}
这些方法可以保护任何用户无法意外更改数据。但是,如果您不希望任何不知道密码的用户查看数据,那么您可以使用以下库:
http://dotnetzip.codeplex.com/
您有一个受密码保护的压缩文件,其中包含使用dotnetzip库的excel.xlsx文件。
一个例子:
public void RNCreateZipFile(string ExcelDocName,string PassWord, string ZipDocName)
{
// create a zip
using (var zip = new ZipFile())
{
zip.Password = PassWord;
zip.AddFile(ExcelDocName, "");
zip.Save(ZipDocName);
}
}