使用电子表格工具打开受保护的工作簿
Opening a protected workbook with spreadsheetgear
我正在尝试确定打开受保护工作表的最佳方式,如果可能的话。我对 spreadsheetgear 的文档做了一些研究,但我还没有真正找到解决方案。
我遇到了两个我认为可能会有所帮助的选项。 Spreadsheetgear 确实有一个 Unprotect(string password)
方法,但截至目前我无法让它工作。我在用户 select 的本地系统上有一个工作簿,并将其上传到服务器。当我尝试打开和读取文件时,分页中断并引发异常
Corrupt OpenXML document.
截至目前,我像这样打开未受保护的工作簿
byte[] file = Session["FileUpload"] as byte[];
using (MemoryStream fileStream = new MemoryStream(file))
{
IWorkbook workbook = Factory.GetWorkbookSet().Workbooks.OpenFromStream(fileStream);
.....
}
这在未受保护的工作簿上工作正常,但当其受保护时,我收到损坏的文档错误。理想情况下,我想同时取消保护和打开,但我不确定如何完成此操作。OpenFromStream
确实有一个过载,您可以在其中输入一个字符串作为密码,我试过但没有成功.这些方法的文档不是很好,所以我不确定我是否正确使用了它们。
更新:
SpreadsheetGear 2017 (V8) 添加了对用于打开 XML(*.xlsx 和 *.xlsm)文件的新工作表和工作簿保护/加密选项的支持。如果您使用的是 SpreadsheetGear 2012 并且在打开受工作表 and/or 工作簿保护的文件时遇到问题,请尝试下载 SpreadsheetGear 2017 (30-day trial for evaluators or Licensed users)。
您可能 运行 遇到了已知的限制,该限制将很快得到解决。 SpreadsheetGear 2012 的工作簿和工作表保护实施基于 Excel 2007(ECMA-376 第一版)。然而,微软已经在 Open XML (XLSX/XLSM) 文件格式规范的更高版本中添加了许多新的工作簿保护选项以及更强大的加密形式。 SpreadsheetGear 2012 尚未添加对这些新文件格式选项和加密形式的支持,因此您在尝试打开这些类型的工作簿时可能会收到 "Corrupt OpenXML document" 或 "Unsupported encryption type" 异常,而前者是接收。
好消息是 Excel SpreadsheetGear 的下一个主要版本 V8 将添加与 2010/2013 兼容的密码保护,该版本计划于今年晚些时候发布,尽管这可能会滑倒。
在发布 V8 之前,一种解决方法是使用 Excel 2010 或 Excel 2013 取消对任何工作簿和单个工作表的保护,然后使用 SpreadsheetGear 本身或 Excel 2007 重新保护保护这些 workbook/worksheets,这将使用旧的 protection/encryption 选项。还有一些方法可以破解 Windows 注册表,告诉 Excel 2010 和 Excel 2013 使用 Excel 2007 中使用的加密选项保存工作簿(请参阅此 link), 但在我看来这不是一个很好的解决方案。
截至撰写本文时,SpreadsheetGear 的 V8 版本尚未发布,因此我想我会提及我们是如何解决此限制的。在较早的 Excel 版本中手动取消保护然后重新保护对我们来说不是一个选项,因为它用于商业应用程序。另请注意,第二种解决方法实际上不起作用。微软花了好几个小时的强力支持才让他们承认这一点。
事实证明,工作表保护不会加密任何内容,它只会散列密码,并依赖 Excel 在允许访问之前从用户那里获取密码。 2013 年,他们更改了哈希算法,这是 SpreadsheetGear 尚不支持的部分。数据未加密这一事实使得这个 "protection" 变得微不足道(只要你不介意一点低级 XML 解析,事实上我经常这样做 ;-)。
每次我们使用 SpreadsheetGear 打开工作簿时,我们都会将 XML 流传递给预处理器,该处理器简单地去除包含哈希的元素,然后将流传递给 SpreadsheetGear,然后它会看到工作表不受保护。我们跟踪哪些工作表是 "unprotected",然后在保存工作簿之前使用 SpreadsheetGear(使用旧的哈希算法)重新保护它们。请注意,这不提供 "real" Unprotect 方法,在该方法中,您需要调用者在允许访问之前提供正确的密码。如果这是一项要求,那么大概您也可以实施该部分。这种方法对性能有很大的影响,主要是因为我们必须在将整个内容传递给 SpreadsheetGear 之前重新压缩工作表流。对我们来说不是问题,因为在我们典型的工作簿中,重新计算沼泽地开放时间。显然,这不是针对临时用户的方法,但我们无法通过某种方式使它正常工作。
首先,感谢其他两位前贡献者解释了发生的事情。
其中之一是 Tim Anderson,他回复了我发送给 SpreadsheetGear 的支持电子邮件,说...
SpreadsheetGear 2012 的最新更新包括一个修补程序 (7.4.8.100),它允许打开这些 "password-protected" 工作表。 ProtectContents 方法仍然采用密码参数,但已删除且未使用。
"We are adding support for the new encryption options provided for overall workbook protection in our V8 release. Adding 'full' support for worksheet protection (which doesn't drop the password) is not a sure thing for V8, though."
我正在尝试确定打开受保护工作表的最佳方式,如果可能的话。我对 spreadsheetgear 的文档做了一些研究,但我还没有真正找到解决方案。
我遇到了两个我认为可能会有所帮助的选项。 Spreadsheetgear 确实有一个 Unprotect(string password)
方法,但截至目前我无法让它工作。我在用户 select 的本地系统上有一个工作簿,并将其上传到服务器。当我尝试打开和读取文件时,分页中断并引发异常
Corrupt OpenXML document.
截至目前,我像这样打开未受保护的工作簿
byte[] file = Session["FileUpload"] as byte[];
using (MemoryStream fileStream = new MemoryStream(file))
{
IWorkbook workbook = Factory.GetWorkbookSet().Workbooks.OpenFromStream(fileStream);
.....
}
这在未受保护的工作簿上工作正常,但当其受保护时,我收到损坏的文档错误。理想情况下,我想同时取消保护和打开,但我不确定如何完成此操作。OpenFromStream
确实有一个过载,您可以在其中输入一个字符串作为密码,我试过但没有成功.这些方法的文档不是很好,所以我不确定我是否正确使用了它们。
更新:
SpreadsheetGear 2017 (V8) 添加了对用于打开 XML(*.xlsx 和 *.xlsm)文件的新工作表和工作簿保护/加密选项的支持。如果您使用的是 SpreadsheetGear 2012 并且在打开受工作表 and/or 工作簿保护的文件时遇到问题,请尝试下载 SpreadsheetGear 2017 (30-day trial for evaluators or Licensed users)。
您可能 运行 遇到了已知的限制,该限制将很快得到解决。 SpreadsheetGear 2012 的工作簿和工作表保护实施基于 Excel 2007(ECMA-376 第一版)。然而,微软已经在 Open XML (XLSX/XLSM) 文件格式规范的更高版本中添加了许多新的工作簿保护选项以及更强大的加密形式。 SpreadsheetGear 2012 尚未添加对这些新文件格式选项和加密形式的支持,因此您在尝试打开这些类型的工作簿时可能会收到 "Corrupt OpenXML document" 或 "Unsupported encryption type" 异常,而前者是接收。
好消息是 Excel SpreadsheetGear 的下一个主要版本 V8 将添加与 2010/2013 兼容的密码保护,该版本计划于今年晚些时候发布,尽管这可能会滑倒。
在发布 V8 之前,一种解决方法是使用 Excel 2010 或 Excel 2013 取消对任何工作簿和单个工作表的保护,然后使用 SpreadsheetGear 本身或 Excel 2007 重新保护保护这些 workbook/worksheets,这将使用旧的 protection/encryption 选项。还有一些方法可以破解 Windows 注册表,告诉 Excel 2010 和 Excel 2013 使用 Excel 2007 中使用的加密选项保存工作簿(请参阅此 link), 但在我看来这不是一个很好的解决方案。
截至撰写本文时,SpreadsheetGear 的 V8 版本尚未发布,因此我想我会提及我们是如何解决此限制的。在较早的 Excel 版本中手动取消保护然后重新保护对我们来说不是一个选项,因为它用于商业应用程序。另请注意,第二种解决方法实际上不起作用。微软花了好几个小时的强力支持才让他们承认这一点。
事实证明,工作表保护不会加密任何内容,它只会散列密码,并依赖 Excel 在允许访问之前从用户那里获取密码。 2013 年,他们更改了哈希算法,这是 SpreadsheetGear 尚不支持的部分。数据未加密这一事实使得这个 "protection" 变得微不足道(只要你不介意一点低级 XML 解析,事实上我经常这样做 ;-)。
每次我们使用 SpreadsheetGear 打开工作簿时,我们都会将 XML 流传递给预处理器,该处理器简单地去除包含哈希的元素,然后将流传递给 SpreadsheetGear,然后它会看到工作表不受保护。我们跟踪哪些工作表是 "unprotected",然后在保存工作簿之前使用 SpreadsheetGear(使用旧的哈希算法)重新保护它们。请注意,这不提供 "real" Unprotect 方法,在该方法中,您需要调用者在允许访问之前提供正确的密码。如果这是一项要求,那么大概您也可以实施该部分。这种方法对性能有很大的影响,主要是因为我们必须在将整个内容传递给 SpreadsheetGear 之前重新压缩工作表流。对我们来说不是问题,因为在我们典型的工作簿中,重新计算沼泽地开放时间。显然,这不是针对临时用户的方法,但我们无法通过某种方式使它正常工作。
首先,感谢其他两位前贡献者解释了发生的事情。
其中之一是 Tim Anderson,他回复了我发送给 SpreadsheetGear 的支持电子邮件,说...
SpreadsheetGear 2012 的最新更新包括一个修补程序 (7.4.8.100),它允许打开这些 "password-protected" 工作表。 ProtectContents 方法仍然采用密码参数,但已删除且未使用。
"We are adding support for the new encryption options provided for overall workbook protection in our V8 release. Adding 'full' support for worksheet protection (which doesn't drop the password) is not a sure thing for V8, though."