使用SSIS删除Excel中的单个工作表
由于一些并发问题,我不得不创建一个包含多个工作表的工作簿。在执行结束时,一些工作表将有数据,而一些工作表则没有数据。我使用执行SQL任务创建工作表 我正在尝试循环浏览工作簿并删除不超过一行的工作表。换句话说,如果行计数不大于1,则删除该工作表。任何关于这个问题的建议都将不胜感激。如果你需要我的问题的更多细节,请告诉我。先谢谢你 编辑 以下是我从MSDN获得的脚本任务。我将其修改为可以进入excel工作表并对行进行计数,现在我要做的就是当计数=1时,然后删除该工作表。有人能帮我吗使用SSIS删除Excel中的单个工作表,excel,ssis,Excel,Ssis,由于一些并发问题,我不得不创建一个包含多个工作表的工作簿。在执行结束时,一些工作表将有数据,而一些工作表则没有数据。我使用执行SQL任务创建工作表 我正在尝试循环浏览工作簿并删除不超过一行的工作表。换句话说,如果行计数不大于1,则删除该工作表。任何关于这个问题的建议都将不胜感激。如果你需要我的问题的更多细节,请告诉我。先谢谢你 编辑 以下是我从MSDN获得的脚本任务。我将其修改为可以进入excel工作表并对行进行计数,现在我要做的就是当计数=1时,然后删除该工作表。有人能帮我吗 using Sy
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台不同的机器上 遗憾的是,您无法使用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文件中,并替换原始文件。但是,如果这样做,将丢失任何公式或格式。我从未尝试过在SSIS包中添加或删除工作表,但如果必须这样做,我的第一个想法将是使用脚本任务(甚至是外部脚本)。然后问题就变成了,这就是我现在正在努力的方向。我希望把它完全建立起来,并把它写在博客上,以便在同样的情况下帮助其他人。总是有固定数量的纸张吗?或者这是动态的?是的。它将永远是固定的。我不会有任何公式或任何东西在表上。这只是非常简单的数据。我会测试你的代码并尽快回复你。非常感谢你的回复。我尝试了你的代码,它运行得很好。但问题是,它不会删除工作表本身,它只是清除其中的任何数据。我在执行SQL任务中注意到了相同的行为,在这里我发出了DROP TABLE命令。这是一个已知的行为,我读到很多人有同样的问题。啊,我的坏!没有读到你的警告就直接跳到代码。无论如何谢谢你的帮助。