C#读取带密码Excel文件报错:已解锁仍需输入密码
问题:带密码Excel文件使用ExcelPackage时,已解锁仍提示需输入密码
我有一个带密码的Excel文件,希望创建ExcelPackage实例来存储并获取其工作表。以下是我的C#代码:
private static ExcelPackage _epInstance; static string password = "password"; using (var package = new ExcelPackage(fileInfo, password)) { if (_epInstance == null) // ExcelPackage { System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); FileInfo templateFile = new FileInfo(filePath); try { _epInstance = new ExcelPackage(templateFile); _epInstance.Save(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
密码正确,但执行到_epInstance = new ExcelPackage(templateFile);时返回错误:"Can not open the package. Package is an OLE compound document. If this is an encrypted package, please supply the password"。请问为何已解锁仍要求输入密码?
解答
问题出在创建_epInstance的逻辑上:你虽然在外部using块中用密码打开了一个ExcelPackage实例,但内部创建_epInstance时,直接调用new ExcelPackage(templateFile)却没有传入密码参数。这里的templateFile是带密码的原始文件,ExcelPackage尝试打开它时未获取到密码,因此触发了加密文件的报错。
修正方法有两种:
- 直接传入密码创建实例:修改创建
_epInstance的代码,使用带密码的重载方法:_epInstance = new ExcelPackage(templateFile, password); - 复用已解锁的package实例:既然外部已经用密码打开了
package,可以直接复用这个已解锁的实例,避免重复打开加密文件。注意如果要保留实例,需调整using块结构(using块结束后实例会被释放),示例如下:if (_epInstance == null) { System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); FileInfo templateFile = new FileInfo(filePath); try { _epInstance = new ExcelPackage(templateFile, password); // 后续业务操作 } catch (Exception ex) { Console.WriteLine(ex.Message); } }
另外,错误信息中的"OLE compound document"是ExcelPackage对加密Excel文件的标识,只要打开加密文件时未提供密码,就会触发该提示,和之前是否打开过该文件无关。
内容的提问来源于stack exchange,提问作者Tuấn Jin
相关产品推荐
相关产品推荐

