尝试阅读使用xlsx
库保存在Excel 2007
中的Excel文件(EPPlus
)时出错。
一些解决方法:
4.0.4.0
4
个工作表,其中一个是hidden
。工作簿受密码保护,工作表也受到保护。他们都有不同的密码。在xlsx
生成的模板文件(Excel 2007 or 2010
)。EPPlus
ExcelPackage
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。
调试数据:
updloaded file 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")) {
之后我有了新的异常类型:“流必须是读/写”。它看起来很好,因为我不保存上传的文件,所以我决定保存文件并更改代码(没有pwd):
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
保护并成功打开文件。