2016-03-13 248 views
2

我试图使用NPOI 2.1.3.1从某些数据库数据创建Excel文件。但是,正在创建的文件已损坏。 Excel拒绝打开它,并将其更改为ZIP并尝试将其解压缩,这也会导致Windows和WinRAR中的错误。我读过的其他线程表示升级到2.1.3.1,因为它修复了XLSX创建的一些问题,但这根本不是真的。我也读过它与它如何压缩文件有关,但似乎没有任何控制它的能力。我希望有人可以用下面我的代码点我在正确的方向:NPOI 2.1.3.1生成损坏的XLSX文件

public byte[] GetExcelFile(
    QueryModel query) { 
    var orders = Mapper.Map<IList<ExcelListModel>>(Context.Orders.Where(
     o => 
      o.DateOrdered >= query.Start 
      && o.DateOrdered <= query.End)); 
    var workbook = new XSSFWorkbook(); 
    var sheet = workbook.CreateSheet(); 

    for (int i0 = 0, l0 = orders.Count, r = 0; i0 < l0; i0++) { 
     var order = orders[i0]; 

     for (int i1 = 0, l1 = order.Products.Count; i1 < l1; i1++, r++) { 
      var row = sheet.CreateRow(r); 
      var product = order.Products[i1]; 

      row.CreateCell(0).SetCellValue(""); 
      // ... 
      row.CreateCell(18).SetCellValue(""); 
     } 

     for (int i1 = 0, l1 = order.Bonuses.Count; i1 < l1; i1++, r++) { 
      var row = sheet.CreateRow(r); 
      var bonus = order.Bonuses[i1]; 

      row.CreateCell(0).SetCellValue(""); 
      // ... 
      row.CreateCell(18).SetCellValue(""); 
     } 
    } 

    var memoryStream = new MemoryStream(); 

    workbook.Write(memoryStream); 

    return memoryStream.ToArray(); 
} 

回答

2

几个小时后,我不认为有一个与NPOI的实际问题。我已切换到EPPlus,并且它正在输出正确的临时文件,但发送回浏览器的文件仍然被损坏。最终我得出结论,这是ASP.NET MVC的FileResult实现的问题,因为当我覆盖Response对象时,正确的文件被返回给浏览器。欲了解更多信息,看看这个帖子:

ASP.NET MVC FileResult is corrupting files

不幸的是,我已经拆出来NPOI代码时,我切换到EPPlus所以我不能100%地确认它是不是真正的窃听。话虽如此,基于我与EPPlus一起的行为,我不认为NPOI存在问题。