写入Excel:无法使用EPPLUS访问封闭流

时间:2017-02-08 09:07:34

标签: c# excel winforms datagridview epplus

我环顾四周,在大多数情况下,我看到了比我自己更复杂的问题的例子。

因此,由于性能的提高,我建议使用EPPLUS而不是EXCEL INTEROP。这是我第一次使用它,而且我第一次遇到内存流,所以我不确定这里有什么问题。 我试图写入Excel文件并将该Excel文件转换为PDF。为此,我通过NUGET安装了以下内容:

  1. EPPLUS
  2. EPPLUSExcel
  3. 这是我的代码:

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

    使用EPPLUSEXCEL和SpireXLS转换为PDF的单独方法。

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

    除了标题中提到的错误之外,编译器不会抛出任何错误。

1 个答案:

答案 0 :(得分:2)

您已在此处保存ExcelPackage

Byte[] bin = p.GetAsByteArray();

因此,当您稍后再尝试将其保存在此处时:

p.Save();

ExcelPackage已经关闭。即删除代码中的Save()电话,您就可以了。