我正在尝试确定打开受保护工作表的最佳方法,如果可能的话。我在spreadsheetgear的文档中做了一些研究,但我还没有真正找到解决方案。
我遇到过两种我认为可以提供帮助的选择。 Spreadsheetgear确实有Unprotect(string password)
方法,但截至目前我无法使用它。我让用户在本地系统上选择一个工作簿并将其上传到服务器。当我尝试打开并读取文件时,页面会中断并抛出异常
损坏的OpenXML文档。
截至目前,我打开像这样的无保护工作簿
byte[] file = Session["FileUpload"] as byte[];
using (MemoryStream fileStream = new MemoryStream(file))
{
IWorkbook workbook = Factory.GetWorkbookSet().Workbooks.OpenFromStream(fileStream);
.....
}
这在未受保护的工作簿上工作正常,但是当它受到保护时,我会收到损坏的文档错误。理想情况下,我想要同时取消保护和打开,但我不知道如何实现这一点。OpenFromStream
确实有一个重载,你可以在其中输入一个字符串作为密码,我试过但没有运气。文档对于这些方法并不好,所以我不确定我是否正确使用它们。
答案 0 :(得分:4)
<强>更新强>
SpreadsheetGear 2017(V8)增加了对用于Open XML(* .xlsx和* .xlsm)文件的新工作表和工作簿保护/加密选项的支持。如果您使用SpreadsheetGear 2012并且无法打开工作表和/或受工作簿保护的文件,请尝试下载SpreadsheetGear 2017(30-day trial for evaluators或Licensed users)。
您可能会遇到已知限制,很快就会解决。 SpreadsheetGear 2012的工作簿和工作表保护实现基于Excel 2007(ECMA-376第1版)。但是,Microsoft已经为以后版本的Open XML(XLSX / XLSM)文件格式规范添加了许多新的工作簿保护选项以及更强大的加密形式。 SpreadsheetGear 2012尚未添加对这些新文件格式选项和加密表单的支持,因此在尝试打开这些类型的工作簿时,您可能会收到“损坏的OpenXML文档”或“不支持的加密类型”异常,前者是您的接收。
好消息是,将在今年晚些时候发布的SpreadsheetGear V8的下一个主要版本中添加与Excel 2010/2013兼容的密码保护,尽管此时间表可能会失效。
在V8发布之前,一种解决方法是使用Excel 2010或Excel 2013取消保护任何工作簿和单个工作表,然后使用SpreadsheetGear本身或Excel 2007重新保护这些工作簿/工作表,这将使用旧的保护/加密选项。还有一些方法可以破解Windows注册表,告诉Excel 2010和Excel 2013使用Excel 2007中使用的加密选项保存工作簿(请参阅此link),但这不是一个非常好的解决方案IMO。
答案 1 :(得分:4)
在撰写本文时,SpreadsheetGear的V8尚未发布,所以我想我会提到我们是如何解决这个限制的。手动取消保护然后在早期的Excel版本中重新保护并不是我们在商业应用程序中使用的选项。另请注意,第二种解决方法实际上并不起作用。微软支持花了很多时间让他们承认这一点。
事实证明,工作表保护不会加密任何内容,它只会散列密码,并且在允许访问之前依赖Excel从用户那里获取密码。 2013年,他们更改了哈希算法,这是SpreadsheetGear尚未支持的部分。数据未加密的事实使得这种&#34;保护&#34;失败是微不足道的(只要你不介意一点点低级XML解析,实际上我做的非常多;-)。
每次我们使用SpreadsheetGear打开工作簿时,我们都会通过预处理器传递XML流,该预处理器只是剥离包含哈希的元素,然后将流传递给SpreadsheetGear,然后SpreadsheetGear将工作表视为不受保护。我们会在保存工作簿之前跟踪哪些工作表未受保护&#34;,然后使用SpreadsheetGear(使用旧的哈希算法)重新保护它们。请注意,这并没有提供真实的&#34; Unprotect方法,您需要调用者在允许访问之前提供正确的密码。如果这是一个要求,那么大概你也可以实现这个。这种方法有很大的性能影响,主要是因为我们必须在将整个内容传递给SpreadsheetGear之前重新压缩工作表流。对我们来说不是问题,因为在我们的典型工作簿中,重新计算沼泽的开放时间。显然,对于临时用户来说,这不是一种方法,但对于我们来说,以某种方式使其工作是不容谈判的。
答案 2 :(得分:3)
首先,感谢前两位解释发生了什么的贡献者。
其中一位是Tim Anderson,他回复了我发给SpreadsheetGear的支持电子邮件,说...
SpreadsheetGear 2012的最新更新包括一个修补程序(7.4.8.100),允许打开这些受密码保护的#34;床单。 ProtectContents方法仍然使用密码参数,但它被删除而不使用。
&#34;我们正在添加对V8版本中为整体工作簿保护提供的新加密选项的支持。添加&#39; full&#39;但是,支持工作表保护(不会丢失密码)对于V8来说并不是一件可靠的事情。&#34;