3

尝试读取xlsx保存在Excel 2007using EPPluslibrary 中的 excel 文件 ( ) 时出错。

一些解决方法:

  1. 带有 EPPlus v. 的 ASP.net mvc 5 应用程序。4.0.4.0
  2. 用户可以从我的网站下载模板文件,然后在其中填写所需的数据,然后将其上传回来。文件包含4工作表,其中之一是hidden. 工作簿受密码保护,工作表也受到保护。他们都有不同的密码。模板文件 ( xlsx) 在Excel 2007 or 2010.
  3. 当用户发回文件时,我正在尝试使用打开并阅读它EPPlus
  4. 当我发布在 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保护并成功打开文件。

4

0 回答 0