2016-09-29 7 views
0

Я борюсь за проблему в течение многих часов, но понятия не имею, где проблема и как ее исправить. Надеюсь, вы могли бы дать мне несколько намеков. Я был бы очень признателен.NPOI excel open issue

Основная идея следующего кода - прочитать документ в списке документов и открыть каждый документ (формат 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(); 
    } 
} 

и выше код может генерировать Excel с именем «xxx.xls», но когда я пытаюсь открыть файл, то появится сообщение, как показано ниже, 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 = новый FileStream (destDocumentPath, FileMode.Create, FileAccess.ReadWrite)) {destWorkbook.Write (поток); } –

+0

Спасибо за ваше предложение, это действительно хорошая практика. Я возьму это. – Jacob