EPPlus处置不起作用

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

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

我已经放置了以前的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文件是否处于活动状态。 但错误仍然存​​在。 我设置断点,我看到stream值为空,表明我的Excel文件是closures的。 但为什么错误仍然存​​在? 谁能帮我 ?

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

我简化了您的testing代码。 这一切都应该如此。 你确定没有其他原因的文件访问问题,如病毒扫描仪,备份程序等,因为你也有同样的基本问题的另一个问题。

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

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

如前所述,基本代码应该工作得很好。 然而,看你的代码,我觉得你正在使用某种BackgroundWorker (PengisianBaruBW_DoWork名字暗示这一点)。

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

为了更好地帮助您,您应该添加哪里(哪行)您收到此错误和调用堆栈。

[编辑]基于额外的意见,我想到了这些情况之一:

1) PengisianBaruBW_DoWork被调用了很多次,有时恰好与文件一起工作,而PrintScheduleBtn_Click正在尝试使用同一个文件

2) _DoWork一个未处理的exception可能会被吞噬并将文件打开(由于您拥有一次性上下文,因此极不可能)。

无论哪种方式,在_DoWork的开始和PrintScheduleBtn_Click的开始处放一个断点,并使用步骤(F10)。