在EPPLUS中读取xlsx(2007)文件时出错

时间:2015-11-18 11:38:02

标签: asp.net asp.net-mvc excel-2007 epplus epplus-4

尝试阅读使用xlsx库保存在Excel 2007中的Excel文件(EPPlus)时出错。

一些解决方法:

  1. ASP.net mvc 5 app with EPPlus v。4.0.4.0
  2. 用户可以从我的网站下载模板文件,然后在其中填写所需数据,然后将其上传回来。文件包含4个工作表,其中一个是hidden。工作簿受密码保护,工作表也受到保护。他们都有不同的密码。在xlsx生成的模板文件(Excel 2007 or 2010)。
  3. 当用户发回文件时,我正在尝试使用EPPlus
  4. 打开并阅读它
  5. 当我发布在Excel2010中填写的文件时,Everythins工作正常。但是当我从Excel 2007发布文件时,ExcelPackage ctor。
  6. 中有例外

    确定。现在有些代码片段。我的初始代码是使用流上传和读取文件。

    [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保护并成功打开文件。

0 个答案:

没有答案