使用电子表格工具打开受保护的工作簿

我试图确定打开受保护的工作表的最佳方法,如果可能的话。 我已经在电子表格的文档中做了一些研究,但我还没有真正find解决scheme。

我遇到了两个我认为可以提供帮助的选项。 Spreadsheetgear确实有一个Unprotect(string password)方法,但截至目前我无法得到它的工作。 我让用户在本地系统上select一个工作簿并将其上传到服务器。 当我尝试打开并读取文件时,页面中断并引发exception

损坏的OpenXML文件。

截至目前,我打开这样的未受保护的工作簿

 byte[] file = Session["FileUpload"] as byte[]; using (MemoryStream fileStream = new MemoryStream(file)) { IWorkbook workbook = Factory.GetWorkbookSet().Workbooks.OpenFromStream(fileStream); ..... } 

这在一个不受保护的工作簿上工作正常,但是当它受保护时,我得到了损坏的文档错误。 理想情况下,我想同时解除保护并打开,但我不知道如何完成此操作。 OpenFromStream确实有一个重载的地方,你可以给它一个string作为我试过的密码,但没有运气。 这些文档对于这些方法来说并不是很好,所以我不确定我是否正确地使用它们。

你可能会遇到一个已知的限制,很快就会解决。 SpreadsheetGear 2012的工作簿和工作表保护实现基于Excel 2007(ECMA-376第1版)。 但是,Microsoft已经在Open XML(XLSX / XLSM)文件格式规范的后期版本中添加了许多新的工作簿保护选项以及更强大的encryptionforms。 SpreadsheetGear 2012还没有添加对这些新的文件格式选项和encryptionforms的支持,所以当您尝试打开这些types的工作簿时,您可能会收到“Corrupt OpenXML document”或“Unsupported encryption type”exception,前者是接收。

好消息是,Excel 2010/2013兼容的密码保护将被添加到SpreadsheetGear V8的下一个主要版本中,预计将在今年晚些时候发布,但是时间表可能会因此而下滑。

在V8发布之前,一种解决方法是使用Excel 2010或Excel 2013对任何工作簿和单个工作表进行解除保护,然后使用SpreadsheetGear本身或Excel 2007重新保护这些将使用较早的保护/encryption选项的工作簿/工作表。 也有办法破解Windowsregistry,告诉Excel 2010和Excel 2013用Excel 2007中使用的encryption选项保存工作簿(请参阅此链接 ),但这不是一个很好的解决scheme国际海事组织。

在撰写本文时,SpreadsheetGear的V8还没有发布,所以我想我会提到我们如何解决这个限制。 手动取消保护,然后重新保护在Excel版本的早期版本不是我们的select,因为它在商业应用程序中使用。 另外请注意,第二个解决方法实际上不起作用。 为了让他们承认这一点,花了好几个小时扭转了微软的支持。

事实certificate,工作表保护不会encryption任何内容,它只是散列密码,并依赖Excel从用户获取允许访问之前。 在2013年,他们改变了哈希algorithm,这就是SpreadsheetGear现在还不支持的那一块。 事实上,数据是未encryption的,这使得这个“保护”微不足道的失败(只要你不介意一点低级别的XMLparsing,这实际上我做的非常多;-)。

每次我们用SpreadsheetGear打开一个工作簿时,我们通过一个预处理器传递XMLstream,简单地去掉包含散列的元素,然后将stream传递给SpreadsheetGear,然后将该工作表视为不受保护。 我们跟踪哪些工作表是“不受保护的”,然后在保存工作簿之前使用SpreadsheetGear(使用旧的散列algorithm)重新保护它们。 请注意,这不提供“真正的”解除保护方法,在允许访问之前,您需要调用者提供正确的密码。 如果这是一个要求,那么大概你也可以实现这件作品。 这种方法有一个很大的性能影响,主要是因为我们必须重新压缩工作表stream,然后将整个事件传递给SpreadsheetGear。 对我们来说不是一个问题,因为在我们典型的工作手册中,重新计算沼泽地的开放时间。 显然,这不是偶然用户的一种方法,但对于我们以某种方式得到这个工作是不可谈的。

首先,感谢前面提到的其他两位撰稿人,他们解释了正在发生的事情。

其中一位是Tim Anderson ,他回复了我发给SpreadsheetGear的支持邮件,说…

  1. SpreadsheetGear 2012的最新更新包括一个修补程序(7.4.8.100),它允许打开这些“受密码保护”的工作表。 ProtectContents方法仍然需要一个密码参数,但是它被丢弃并不被使用。

  2. “我们在V8发行版中增加了对提供全面工作簿保护的新encryption选项的支持,不过,为V8添加对工作表保护(不会丢失密码)的”全面“支持并不是一件确定的事情。