【问题标题】:EPPlus Dispose Doesn't WorkEPPlus Dispose 不起作用
【发布时间】:2016-12-25 14:53:45
【问题描述】:

我想创建工作簿,然后使用 EPPlus 写入数据。当我创建新工作簿时,它可以成功创建。但是当我想向该工作表写入一些数据时,它失败并且错误提示

进程无法访问文件“文件名”,因为它正在 被另一个进程使用。

我已经处理了以前的 ExcelPackage,但是当我写入数据时仍然显示错误。

//Create new Workbook
private void PengisianBaruBW_DoWork(object sender, DoWorkEventArgs e)
{
    this.Invoke(new MethodInvoker(delegate
    {
        SetPengisianBtn.Enabled = false;
    }));

    FileInfo filePath = new FileInfo("D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx");

    if (File.Exists(filePath.ToString()))
    {
        File.Delete(filePath.ToString());
    }

    using (ExcelPackage pck = new ExcelPackage(filePath))
    {
        var schedule = pck.Workbook.Worksheets.Add("Schedule");
        var cart = pck.Workbook.Worksheets.Add("Cartridge");
        var unsche = pck.Workbook.Worksheets.Add("Unschedule");
        var rekap = pck.Workbook.Worksheets.Add("Rekap");

        //My Code here

        pck.SaveAs(filePath);
        pck.Dispose(); //I have disposed ExcelPakcage here

    }
}


//Write Data to Excel File
private void PrintScheduleBtn_Click(object sender, EventArgs e)
{
    if (StaffATB.Text != "" && HelperTeamATB.Text != "" && StaffBTB.Text != "" && HelperTeamBTB.Text != "" && StaffCTB.Text != "" && HelperTeamCTB.Text != "" && StaffDTB.Text != "" && HelperTeamDTB.Text != "")
    {
        DialogResult dialogResult = MessageBox.Show("Apakah Anda yakin ingin menyimpan jadwal pengisian ?", "", MessageBoxButtons.YesNo);


        if (dialogResult == DialogResult.Yes)
        {
            FileInfo file = new FileInfo("D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx");

            using (ExcelPackage pck = new ExcelPackage(file)) //error here
            {
                var rekap = pck.Workbook.Worksheets["Rekap"];
                var data = pck.Workbook.Worksheets["Data"];

                //my code to write data here

                pck.SaveAs(file);
                pck.Dispose();

            }
        }
    }
    else
    {
        MessageBox.Show("Silakan isi PIC terlebih dahulu !");
    }
}

我已添加此代码来检查我的 excel 文件是否处于活动状态。但是错误仍然存​​在。我设置了断点,我看到流值为 null,表示我的 excel 文件已关闭。但是为什么错误仍然存​​在?谁能帮帮我?

string file = "D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx";
                var path = Path.Combine(Path.GetTempPath(), "D:\\Data Pengisian SLA Surabaya\\" + day + "_" + date + ".xlsx");
                var tempfile = new FileInfo(path);

                FileStream stream = null;

                try
                {
                    stream = tempfile.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
                }
                catch (IOException)
                {

                }
                finally
                {
                    if (stream != null)
                        stream.Close();
                }

【问题讨论】:

  • 当您单击打印计划按钮时,您确定创建已完成吗?因为您在后台线程上创建。将实例包装在 using 语句中时,无需调用 Dispose。

标签: c# excel epplus


【解决方案1】:

我简化了您的 sn-p 以进行测试。一切正常。您确定没有其他原因导致文件访问问题,例如病毒扫描程序、备份程序等,因为您的 another question 也有同样的基本问题。

看看下面的sn-p,试试看这个是否有效。如果不是,问题不在代码中。

FileInfo filePath = new FileInfo("ExcelDemo.xlsx");

if (File.Exists(filePath.ToString()))
{
    File.Delete(filePath.ToString());
}

using (ExcelPackage pck = new ExcelPackage(filePath))
{
    var schedule = pck.Workbook.Worksheets.Add("Schedule");
    var cart = pck.Workbook.Worksheets.Add("Cartridge");
    var unsche = pck.Workbook.Worksheets.Add("Unschedule");
    var rekap = pck.Workbook.Worksheets.Add("Rekap");

    pck.SaveAs(filePath);
}

using (ExcelPackage pck = new ExcelPackage(filePath))
{
    var rekap = pck.Workbook.Worksheets["Rekap"];
    var schedule = pck.Workbook.Worksheets["Schedule"];

    rekap.Cells[4, 1].Value = "Added data";
    schedule.Cells[4, 1].Value = "Added data";

    pck.SaveAs(filePath);
}

【讨论】:

  • 我尝试过使用上面的代码,但它是一样的。 ExcelPackage pck = PrintScheduleBtn_Click 中的新 ExcelPackage(file) 中始终出错。你能帮助我吗 ?我被卡住了
  • 我认为问题不在于代码,而在于服务器本身,就像我之前在回答中提到的那样,它可能是版权问题、病毒扫描程序、只读文件等。跨度>
【解决方案2】:

如前所述,基本代码应该可以正常工作。但是,查看您的代码,我感觉您正在使用某种BackgroundWorker(PengisianBaruBW_DoWork 名称暗示了这一点)。

如果是这样,您可能会遇到从另一个线程访问同一文件的情况(PengisianBaruBW_DoWorkPrintScheduleBtn_Click 并行执行)。

为了帮助你更多,你应该添加你在哪里(哪一行)收到这个错误和调用堆栈。

[编辑] 基于额外的 cmets,我想到了以下场景之一:

1) PengisianBaruBW_DoWork 被多次调用,有时它恰好在处理文件,而 PrintScheduleBtn_Click 正在尝试处理同一个文件

2) _DoWork 中未处理的异常可能会被吞没并让文件保持打开状态(因为您有一次性上下文,所以不太可能)。

无论哪种方式,在 _DoWork 的开头放置一个断点,在 PrintScheduleBtn_Click 的开头放置一个断点,然后使用 step over (F10)。

【讨论】:

  • 我尝试在错误行设置断点。我检查 pck 并且它的值为空。你能帮帮我吗?
  • 我在使用 PrintScheduleBtn_Click 的 (ExcelPackage pck = new ExcelPackage(file)) 时出错。即使我在上一个过程(PengisianBaruBW_DoWork)中处理了 ExcelPackage,它也是一样的。我的代码出错了。它说我的 excel 文件正在被另一个程序使用
【解决方案3】:

我知道这是一个旧帖子,但它从未得到解决。我遇到了同样的问题,但我想我找到了解决方案(至少它解锁了我的 excel 文件):

        excelPackage.Dispose();
        excelPackage = null;
        GC.Collect();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多