尝试读取xlsx
保存在Excel 2007
using EPPlus
library 中的 excel 文件 ( ) 时出错。
一些解决方法:
- 带有 EPPlus v. 的 ASP.net mvc 5 应用程序。
4.0.4.0
- 用户可以从我的网站下载模板文件,然后在其中填写所需的数据,然后将其上传回来。文件包含
4
工作表,其中之一是hidden
. 工作簿受密码保护,工作表也受到保护。他们都有不同的密码。模板文件 (xlsx
) 在Excel 2007 or 2010
. - 当用户发回文件时,我正在尝试使用打开并阅读它
EPPlus
- 当我发布在 Excel2010 中填写的文件时,一切正常。
ExcelPackage
但是当我从 Excel 2007 发布文件时, ctor中出现异常。
好的。现在有一些代码片段。有我使用流上传和读取文件的初始代码。
[HttpPost]
[ValidateAntiForgeryToken]
[ActionName("ImportPublications")]
public async Task<JsonResult> AjaxImportPublications(int id, HttpPostedFileBase xlsImport) {
AjaxExtResult result = new AjaxExtResult();
if (xlsImport == null || xlsImport.ContentLength == 0) {
result.Error = new[] { "Ошибка загрузки файла" };
return Json(result);
}
try {
using (var package = new ExcelPackage(xlsImport.InputStream)){
// do something here
}
result.Success = true;
}
catch (Exception e) {
result.Error = new[] { e.Message };
}
return Json(result);
}
上面的代码适用于 Excel 2010,但不适用于 2007。抛出异常然后调用ExcelPackage()
ctor。
调试数据:
上传的文件ContentType
是"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
异常详情(磁盘写入错误):
Message: "Ошибка на диске в процессе записи. (Exception from HRESULT: 0x8003001D (STG_E_WRITEFAULT))"
StackTrace:
at OfficeOpenXml.Utils.CompoundDocument.ILockBytes.WriteAt(Int64 ulOffset, IntPtr pv, Int32 cb, UIntPtr& pcbWritten)
at OfficeOpenXml.Utils.CompoundDocument.GetLockbyte(MemoryStream stream)
at OfficeOpenXml.ExcelPackage.Load(Stream input, Stream output, String Password)
at OfficeOpenXml.ExcelPackage.Load(Stream input)
at OfficeOpenXml.ExcelPackage..ctor(Stream newStream)
at webDCReports.Controllers.MembersController.<AjaxImportPublications>d__56.MoveNext() ...
之后我尝试将工作簿保护密码添加到ctor
参数并将代码更改为
using (var package = new ExcelPackage(xlsImport.InputStream, "my_passwrod")) {
之后我有了新的异常类型:"The stream must be read/write"。看起来不错,因为我不保存上传的文件,所以我决定保存文件并将代码更改为(不带密码):
var fi = new FileInfo(target);
using (var package = new ExcelPackage(fi)) {
和异常详细信息是:
Message: Can not open the package. Package is an OLE compound document. If this is an encrypted package, please supply the password.
Inner exception: "The file is not an valid Package file. If the file is encrypted, please supply the password in the constructor."
此时,当我上传 2010 年保存的文件时 - 代码工作正常。将工作簿密码添加到调用代码会给我无效密码异常。
实际上它看起来也不错,因为文件本身没有密码保护/加密。
有谁知道发生了什么,如何解决这个问题?
重要更新:
我已删除woorkbook
保护并成功打开文件。