c# - 检查 Excel 文件是否在 .NET Core 中受密码保护

标签 c# excel asp.net-core-2.0 exceldatareader

技术:

C#

ASP.NET 核心 2.0

Excel(主要是 OpenXml,但偶尔有遗留文档)

目前正在使用 ExcelDataReader 读取文件。

场景:

我需要在服务器上存储一些文件并在以后访问它们以进行工作。用户通过 Web API 上传文件,并以相同的方式调用请求完成工作。

一些用户用密码保护他们的 Excel 文件,要求这些文件在服务器上时保持密码保护。

问题:

我需要检测文档是否受密码保护,以便我可以使用适当的配置来访问它。

我在谷歌上搜索了很多,但它主要来自 Workbook.HasPassword(我认为这是 Excel.Interop 的一部分,我想避免添加)。我还找到了this link一个关于 Office 文档的类似问题,其中的解决方案是通过文件流针对各种 header 数据的长 list 。

理想情况下,我想要一个不需要我打开文件的核心友好解决方案。我不经常处理文档,所以我不知道下一步该去哪里。

有什么建议吗?

最佳答案

因为您已经在使用 ExcelDataReader,所以在 try-catch 子句中打开文件并处理 InvalidPasswordException:

bool ExcelFileRequiresPassword(Stream stream) {
    try {
        using (ExcelReaderFactory.CreateReader(stream)) { }
    } catch (InvalidPasswordException) {
        return true;
    }
    return false;
}

这在性能方面并不算太差。在幕后,它只检查文件中的相关 header ,并处理所有血淋淋的 BIFF、ZIP 和版本控制细节。如果没有密码,则不会读取任何数据。

关于c# - 检查 Excel 文件是否在 .NET Core 中受密码保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51253914/

相关文章:

c# - 视频播放器线程

c# - 如何根据访问者的 IP 地址重定向

c# 保存要查找的值列表的最佳类

c# - 如何使用 LINQ 优化多个 if else

xml - 将 Excel 工作表另存为 xml 在某些行周围添加引号

vba - 如何在VBA中循环400万数组时减少时间成本?

asp.net-core-2.0 - AspNetCore 2.0.5 Add-Migration 尝试创建表而不是更改现有表

javascript - 带有表单标签的 ASP.NET Core - 验证表单 onsubmit 并阻止提交

c# - 在响应 header 中传递非 ASCII 字符

excel - 引用范围内单元格值的方式之间的差异