c# - EPPlus 处置不起作用

标签 c# excel epplus

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

The process cannot access the file 'filename' because it is being used by another process.

我已经把之前的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();
                }

最佳答案

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

看看下面的代码片段,尝试一下,看看这个是否有效。如果不是,则问题不在代码中。

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

关于c# - EPPlus 处置不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41322136/

相关文章:

arrays - 如何将 VBA 集合写入 Excel 工作表

c# - (C#) 我能否以编程方式将 XLSX 单元格设置为图片/图像?

c# - 在 C# 中从禁用的 ListView 启用滚动条

javascript - SignalR 更改中心订阅

c# - Cross Thread错误处理形式与Timer

c# - 使用 EPPlus,我正在尝试将 gridview 导出到 Excel 工作表

charts - 时间:2019-05-17 标签:c#chartepplusaxisreverseorder

c# - C# 28 次内联限制是否有解决方法?

c# - ROUNDUP(700.25;-1) 返回 710,我们如何在 C# 中执行此操作

excel - 将列中的文本剪切为 60 个字符 block