Aroueterra
Aroueterra

Reputation: 379

Writing to Excel: Cannot access closed stream with EPPLUS

I've looked around, and for the most part I see examples for more complex problems than my own.

So, I've been suggested to use EPPLUS as opposed to EXCEL INTEROP because of the performance improvement. This is my first time using it, and the first time I've encountered memory streams, so I'm not exactly sure what's wrong here. I'm trying to write to an Excel file and convert that excel file into a PDF. To do this, I installed through NUGET the following:

  1. EPPLUS
  2. EPPLUSExcel

This is my code:

       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;

For each row in a DataGridView, perform write to Excel, then convert to 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
                {

Here is where I expect something to be wrong:

                    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);
                }

Separate method to convert to PDF, utilizing EPPLUSEXCEL and SpireXLS.

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

The compiler is not throwing any errors except the one mentioned in the title.

Upvotes: 0

Views: 1807

Answers (1)

goTo-devNull
goTo-devNull

Reputation: 9372

You already saved the ExcelPackage here:

Byte[] bin = p.GetAsByteArray();

So when you later try and save it again here:

p.Save();

the ExcelPackage is already closed. I.e. remove the Save() call in your code and you're good.

Upvotes: 2

Related Questions