2016-09-29 106 views
0

我在一個問題上掙扎了好幾個小時,但不知道問題出在哪裏以及如何解決。希望你能給我一些提示。我非常感謝。NPOI excel公開問題

以下代碼的主要思想是讀取文檔列表中的文檔並打開每個文檔(excel格式)並將工作表移動到destWorkbook,並最終將destWorkbook保存爲excel格式。

public bool GenerateMergedWorkbook(DocumentModelList documentlist) 
{ 
    HSSFWorkbook destWorkbook = new HSSFWorkbook(); 
    IList<DocumentModel> downloadDocumentList = GetDownloadDocumentList(documentlist); 
    foreach (var document in downloadDocumentList) 
    { 
     if (!string.IsNullOrEmpty(document.documentpath)) 
     { 
      MergeSheet(document.documentpath, document.code, destWorkbook); 
     } 
    } 

    string destDocumentPath = HttpContext.Current.Server.MapPath("~/UserTemplate/xxx.xls"); 
    destWorkbook.Write(new FileStream(destDocumentPath, FileMode.Create, FileAccess.ReadWrite)); 
    destWorkbook.Close(); 
    destWorkbook = null; 
    return true; 
} 

private void MergeSheet(string documentPath, string code, HSSFWorkbook destWorkbook) 
{ 
    string filePath = HttpContext.Current.Server.MapPath(documentPath); 
    using (var fileStream = new FileStream(filePath, FileMode.Open)) 
    { 
      HSSFWorkbook workbook = new HSSFWorkbook(fileStream); 
      bool moveSheetFlag = false; 

      for (int i = 0; i < workbook.NumberOfSheets; i++) 
      { 
       HSSFSheet sheet = workbook.GetSheetAt(i) as HSSFSheet; 
       if (sheet.SheetName.IndexOf(code) >= 0) 
       { 
        sheet.CopyTo(destWorkbook, sheet.SheetName, true, true); 
        moveSheetFlag = true; 
        break; 
       } 
      } 
      workbook.Close(); 
      if (!moveSheetFlag) 
      { 
       string message = "xxxxxx"; 
       throw new FormatException(message); 
      } 
      fileStream.Close(); 
    } 
} 

和上面的代碼可以用名稱爲「xxx.xls」,但是當我嘗試打開該文件,就會彈出如下圖所示的消息產生了Excel, enter image description here enter image description here

我做了很多個小時的調查,仍然不知道,有人可以幫助我。非常感謝。

回答

0

我突然發現了答案,

destWorkbook.Write(new FileStream(destDocumentPath, FileMode.Create, FileAccess.ReadWrite)); 

應該關閉流如下圖所示,

var stream = new FileStream(destDocumentPath, FileMode.Create, FileAccess.ReadWrite); 
      destWorkbook.Write(stream); 
      stream.Close(); 
+0

可能改善你的解決方案。在使用塊中聲明FileStream以使其關閉並處理。 EX。使用(FileStream stream = new FileStream(destDocumentPath,FileMode.Create,FileAccess.ReadWrite)){destWorkbook.Write(stream); } –

+0

感謝您的建議,這是一個很好的做法。我會接受。 – Jacob