我正在使用EPPLUS从数据库表生成Excel文件,但创建的文件将保持只读模式,直到停止整个SSIS进程。我需要在稍后的过程中移动文件,这将始终失败,并在SSIS中显示以下消息:
[文件系统任务]错误:出现以下错误消息:"进程无法访问该文件,因为它正在被使用通过另一个过程。".
当我尝试在excel中打开文件时,我得到了"使用中的文件"
book1.xlsx已锁定以进行编辑由"其他用户"创建。打开"只读"或单击"通知"以只读方式打开,并在文档不再使用时收到通知。我希望你能帮助我。
这是我的代码:
public void Main()
{
try
{
String FilePath = Dts.Variables["$Package::DestinationFileName"].Value.ToString();
String TableName = Dts.Variables["$Package::SourceTableName"].Value.ToString();
String ConnStr = Dts.Variables["$Project::ConnStr_DataWarehouse"].Value.ToString();
//SqlConnection Conn = (SqlConnection)(Dts.Connections["DW"].AcquireConnection(Dts.Transaction) as SqlConnection);
using (SqlConnection Conn = new SqlConnection(ConnStr))
{
String Sql = "SELECT * FROM " + TableName;
if (File.Exists(FilePath))
{
try { File.Delete(FilePath); }
catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); Dts.TaskResult = (int)ScriptResults.Failure; }
}
using (DataTable dt = new DataTable())
{
using (SqlCommand cmd = new SqlCommand(Sql, Conn))
{
Conn.Open();
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dt);
FileInfo newFile = new FileInfo(FilePath);
using (ExcelPackage p = new ExcelPackage(newFile))
{
using (ExcelWorksheet ws = p.Workbook.Worksheets.Add("RejectetionReport"))
{
ws.Cells["A1"].LoadFromDataTable(dt, true);
p.Save();
}
}
}
Conn.Close();
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
我使用的是EPPLUS 4.0.5,我计划将其更新到4.1,但发布说明并没有涵盖这个问题。
编辑:我已经升级到4.1,但问题仍然存在。
我发现了这个问题。EPPLUS库中存在一个错误,它在处理包之前没有处理流。我已经在fork DebugPackageDispose 下提交了一个修复拉请求
希望这将很快被整合。