【问题标题】:Delete a single sheet in Excel using SSIS使用 SSIS 在 Excel 中删除单个工作表
【发布时间】:2012-12-20 16:07:50
【问题描述】:

由于一些并发问题,我不得不创建一个包含多个工作表的工作簿。在执行结束时,有些工作表会有数据,而有些则没有。我使用执行 SQL 任务创建工作表。

我正在尝试遍历工作簿并删除不超过一行的工作表。换句话说,如果行数不大于 1,则删除工作表。对此问题的任何指针将不胜感激。如果您需要有关我的问题的更多详细信息,请告诉我。提前谢谢你。

编辑

以下是我从 MSDN 获得的脚本任务。我将其修改为可以访问 excel 工作表并计算行数,现在我要做的就是当 count = 1 时删除工作表。有人可以帮我吗?

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;

namespace ST_c346c80b4e6747688383c47a9f3e6f78.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion



            public void Main()
        {
            string count = "";
            string fileToTest;
            string tableToTest;
            string connectionString;

            fileToTest = Dts.Variables["ExcelFile"].Value.ToString();
            tableToTest = Dts.Variables["ExcelTable"].Value.ToString();

            Dts.Variables["ExcelTableExists"].Value = false;

                connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                "Data Source=" + fileToTest + ";Extended Properties=Excel 8.0";
                string SQL = "SELECT COUNT (*) FROM [" + tableToTest + "$]";
                using (OleDbConnection conn = new OleDbConnection(connectionString))
                {
                    conn.Open();
                    using (OleDbCommand cmd = new OleDbCommand(SQL, conn))
                    {
                        using (OleDbDataReader reader = cmd.ExecuteReader())
                        {
                            reader.Read();
                            count = reader[0].ToString();
                            //if (count = 1)

                        }
                    }
                    conn.Close();
                }
                //return count;
            }

       }
}

编辑

经过进一步调查,我发现我需要添加 excel 互操作程序集才能使其正常工作。我没有那个选项,因为这个解决方案将被移植到 140 台不同的机器上。

【问题讨论】:

  • 我从未尝试在 SSIS 包中添加或删除工作表,但如果我必须这样做,我的第一个想法是使用脚本任务(甚至是外部脚本)。那么问题就变成了,how to delete a worksheet from .NET?
  • 这是我目前正在努力的方向。我希望完全设置它并在博客上介绍它以帮助处于相同情况的其他人。
  • 总是有固定的张数吗?还是这是动态的?
  • 是的。它将永远是固定的。

标签: excel ssis


【解决方案1】:

遗憾的是,您无法使用 OLEDB 删除 Excel 中的工作表,最好的办法是使用 DROP Table 命令清除其中的数据

connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                     "Data Source=" + fileToTest + 
                     ";Mode=ReadWrite;Extended Properties=Excel 8.0";

string SQL = "SELECT COUNT(*) FROM [" + tableToTest + "$]";

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    using (OleDbCommand CountCmd = new OleDbCommand(SQL, conn))
    {
        int RecordCount = (int)CountCmd.ExecuteScalar();

        if (RecordCount == 1)
        {
            SQL = "DROP TABLE [" + tableToTest + "$]";
            using (OleDbCommand DropCmd = new OleDbCommand(SQL, conn))
            {
                DropCmd.ExecuteNonQuery();
            }
        }
    }
    conn.Close();
}

注意:使用Mode=ReadWrite。您可以包含/排除HDR=Yes/No,但如果您想要对工作簿进行读/写访问,则不得包含IMEX=1

顺便说一句:不需要使用 OleDbDataReader 来读取单个标量结果,而是使用 ExecuteScalar()。

使用 OleDB 解决此问题的唯一方法是将要保留的数据复制到新的 Excel 文件中并替换原始文件。但是,如果您这样做,您将丢失任何公式或格式。

【讨论】:

  • 我不会在表格上写任何公式或任何东西。它只是非常简单的数据。我会测试您的代码并尽快回复您。非常感谢您的回复。
  • 我试过你的代码,它运行良好。但问题是,它不会删除工作表本身,它只是清除其中的任何数据。我在执行 DROP TABLE 命令的执行 SQL 任务中注意到了相同的行为。这是一种已知的行为,我读过很多人都有同样的问题。
  • 啊,我的错!没有阅读您的警告就直接跳到代码。无论如何感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多