使用 EPPLUS 从数据库 table 生成 Excel 文件时,文件总是只读的
Files are always Read-only when Using EPPLUS to generate Excel file from Database table
我正在使用 EPPLUS 从数据库 table 生成 Excel 文件,但创建的文件保持只读模式,直到整个 SSIS 进程停止。
我需要在稍后的过程中移动文件,这将始终失败,并在 SSIS 中显示以下消息:
[File System Task] Error: An error occurred with the following error
message: "The process cannot access the file because it is being used
by another process.".
当我尝试打开 excel 中的文件时,我得到了 "File in Use"
book1.xlsx is locked for editing
by 'another user'.
Open 'Read-Only' or click 'Notify' to open read-only and receive notification when the document is no longer in use.
I hope you'll be able to help me.
这是我的代码:
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
下提交了一个 pull request 修复
希望能尽快整合。
我正在使用 EPPLUS 从数据库 table 生成 Excel 文件,但创建的文件保持只读模式,直到整个 SSIS 进程停止。 我需要在稍后的过程中移动文件,这将始终失败,并在 SSIS 中显示以下消息:
[File System Task] Error: An error occurred with the following error message: "The process cannot access the file because it is being used by another process.".
当我尝试打开 excel 中的文件时,我得到了 "File in Use"
book1.xlsx is locked for editing by 'another user'. Open 'Read-Only' or click 'Notify' to open read-only and receive notification when the document is no longer in use. I hope you'll be able to help me.
这是我的代码:
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
下提交了一个 pull request 修复希望能尽快整合。