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_DoWork
与PrintScheduleBtn_Click
并行执行)。
为了更好地帮助您,您应该添加哪里(哪行)您收到此错误和调用堆栈。
[编辑]基于额外的意见,我想到了这些情况之一:
1) PengisianBaruBW_DoWork
被调用了很多次,有时恰好与文件一起工作,而PrintScheduleBtn_Click
正在尝试使用同一个文件
2) _DoWork
一个未处理的exception可能会被吞噬并将文件打开(由于您拥有一次性上下文,因此极不可能)。
无论哪种方式,在_DoWork的开始和PrintScheduleBtn_Click的开始处放一个断点,并使用步骤(F10)。