我想创建工作簿,然后使用EPPlus写入数据 . 当我创建新工作簿时,它可以成功创建 . 但是,当我想将一些数据写入该工作表时,它失败并且错误说
进程无法访问文件'filename',因为它正由另一个进程使用 .
我已经处理了以前的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();
}
2 回答
我简化了您的代码片段以进行测试 . 一切都按预期工作 . 您确定没有其他原因导致文件访问问题,例如病毒扫描程序,备份程序等,因为您也有another question具有相同的基本问题 .
看一下下面的片段,尝试一下,看看这个是否有效 . 如果不是问题不在代码中 .
如前所述,基本代码应该可以正常工作 . 但是,看着你的代码,我感觉你正在使用某种BackgroundWorker(PengisianBaruBW_DoWork名称暗示这一点) .
如果是这样,您可能会遇到从另一个线程访问同一文件(
PengisianBaruBW_DoWork
与PrintScheduleBtn_Click
并行执行) .为了帮助您,您应该添加在哪里(什么行)您收到此错误和调用堆栈 .
[Edit] 基于其他评论,我想到了以下其中一种情况:
1)
PengisianBaruBW_DoWork
被多次调用,有时它恰好与文件一起工作,而PrintScheduleBtn_Click
正在尝试使用同一个文件2)
_DoWork
中的未处理异常可能被吞下并保持文件打开(由于您有一次性上下文,因此非常不可能) .无论哪种方式,在_DoWork的开头放置一个断点,在
PrintScheduleBtn_Click
开头放置一个断点并使用步骤(F10) .