【问题标题】:Files are always Read-only when Using EPPLUS to generate Excel file from Database table使用 EPPLUS 从数据库表生成 Excel 文件时文件始终为只读
【发布时间】:2016-07-22 10:43:52
【问题描述】:

我正在使用 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.codeplex.com/workitem/14919
  • 查看您的代码和 epplus 文档看起来您正在做您需要做的事情,但也许 epplus 有一个错误,即 using {} 块没有正确处理对象。您可以尝试处置自己并消除使用....
  • 我显然已经尝试手动处理所有一次性对象。我将尝试将对象设置为 null 并查看...
  • 设置 null 也不行。对我来说,这听起来像是处置 EPPLUS 对象的错误。但我仍在寻找解决方法......

标签: ssis epplus ssis-2012 epplus-4


【解决方案1】:

我发现了问题。 EPPLUS 库中有一个错误,它在处理包之前没有处理流。 我已经在 fork DebugPackageDispose 下提交了一个修复拉取请求

希望这将很快集成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多