2017-02-08 14 views
0

Я осмотрелся и по большей части вижу примеры более сложных проблем, чем мои собственные.Запись в Excel: невозможно получить доступ к закрытому потоку с помощью EPPLUS

Итак, мне предложили использовать EPPLUS в отличие от EXCEL INTEROP из-за улучшения производительности. Это мой первый раз, когда я использую его, и в первый раз, когда я столкнулся с потоками памяти, поэтому я не совсем уверен, что здесь не так. Я пытаюсь записать в файл Excel и преобразовать этот файл Excel в PDF. Чтобы сделать это, я установил через NuGet следующее:

  1. EPPLUS
  2. EPPLUSExcel

Это мой код:

 if (DGVmain.RowCount > 0) 
     { 
      //Source 
      OpenFileDialog openFileDialog = new OpenFileDialog(); 
      openFileDialog.Filter = "Excel Files|*.xls;*.xlsx"; 
      openFileDialog.ShowDialog(); 
      lblSuccess.Text = openFileDialog.FileName; 
      lblPathings = Path.ChangeExtension(openFileDialog.FileName, null); 
      int count = DGVmain.RowCount; 
      int current = 0; 
      int ballast = 0; 

Для каждой строки в DataGridView, выполнить запись в Excel, а затем конвертировать в PDF.

  foreach (DataGridViewRow row in DGVmain.Rows) 
      { 
       //Drag 
       if (lblSuccess.Text == null) 
        return; 
       string drags = Convert.ToString(row.Cells[0].Value); 
       string dragsy = Convert.ToString(row.Cells[1].Value); 
       Persona = drag; 
       generateID(); 
       //Initialize the Excel File 
       try 
       { 

Вот где я ожидал что-то не так:

    using (ExcelPackage p = new ExcelPackage()) 
        { 
         using (FileStream stream = new FileStream(lblSuccess.Text, FileMode.Open)) 
         { 
          ballast++; 
          lblItem.Text = "Item #" + ballast; 
          p.Load(stream); 
          ExcelWorkbook WB = p.Workbook; 
          if (WB != null) 
          { 
           if (WB.Worksheets.Count > 0) 
           { 
            ExcelWorksheet WS = WB.Worksheets.First(); 
            WS.Cells[82, 12].Value = drag13; 
            WS.Cells[84, 12].Value = ""; 
            WS.Cells[86, 12].Value = 0; 
            //========================== Form 
            WS.Cells[95, 5].Value = drag26; 
            WS.Cells[95, 15].Value = drag27; 
            WS.Cells[95, 24].Value = drag28; 
            WS.Cells[95, 33].Value = drag29; 
            //========================== Right-Seid 
            WS.Cells[14, 31].Value = drag27; 
            WS.Cells[17, 31].Value = drag27; 

           } 
          } 
          Byte[] bin = p.GetAsByteArray(); 
          File.WriteAllBytes(lblPathings, bin); 
         } 
         p.Save(); 
        }      
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("Write Excel: " + ex.Message); 
       } 

Отдельный метод для преобразования в PDF, используя EPPLUSEXCEL и SpireXLS.

   finally 
       { 
        ConvertToPdf(lblSuccess.Text, finalformat); 
       } 
      } 
     } 

Компилятор не допускает ошибок, кроме указанных в заголовке.

ответ

2

Вы уже сохранили ExcelPackage здесь:

Byte[] bin = p.GetAsByteArray(); 

Итак, когда вы позже попытаться сохранить его снова здесь:

p.Save(); 

ExcelPackage уже закрыт. То есть удалите Save() звонок в вашем коде, и вы в порядке.

+1

Вы правы, ошибка исчезла, но теперь я, похоже, сталкиваюсь с новой проблемой. Код, похоже, ничего не делает, компилятор заявляет, что код слишком длинный, без каких-либо действий, поэтому он попал в перерывы ... Ошибка на самом деле не помогает, хотя ... тем временем я ' Я прочитал об этом. – Arvayne

+0

Проблема исправлена! Ошибка вызвана тем, что преобразование в pdf не работает, потому что EPPLUS в PDF не поддерживает тип файла .XLSX !! – Arvayne

 Смежные вопросы

  • Нет связанных вопросов^_^