如何使用SSIS脚本任务删除Excel目标中的第二行(SQL Server 2012)
没问题,我来一步步帮你搞定这个需求!
解决SSIS中通过C#脚本任务删除Excel第二行的问题
一、前期准备:创建SSIS变量
首先得创建两个SSIS变量来存储Excel的路径和文件名,这样代码更灵活,后续修改起来也方便:
- 右键SSIS包的
变量面板 → 新建变量- 变量名:
ExcelFilePath,类型选String,值填你的Excel文件所在文件夹路径(比如C:\SSIS_Output\) - 变量名:
ExcelFileName,类型选String,值填你的Excel文件名(比如ExportedData.xlsx)
- 变量名:
二、配置脚本任务的变量映射
接下来要把这两个变量传递到脚本任务里,让C#代码能读取到:
- 拖一个
脚本任务到SSIS控制流面板,双击打开编辑器 - 在
脚本选项卡中,点击ReadOnlyVariables旁边的省略号按钮 - 在弹出的对话框里,找到你刚创建的
ExcelFilePath和ExcelFileName,添加进去后点击确定 - 确认脚本语言选择的是
Microsoft Visual C#,然后点击编辑脚本进入代码编辑界面
三、C#代码实现删除第二行
在脚本编辑器里,把默认的Main方法代码替换成下面的内容,我加了详细注释,方便你理解:
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; // 需要引用Office Interop组件 namespace ST_xxxxxx // 这里的命名空间是自动生成的,不用修改 { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { try { // 从SSIS变量中读取路径和文件名,拼接成完整文件路径 string folderPath = Dts.Variables["ExcelFilePath"].Value.ToString(); string fileName = Dts.Variables["ExcelFileName"].Value.ToString(); string fullExcelPath = System.IO.Path.Combine(folderPath, fileName); // 初始化Excel应用对象,后台运行不显示窗口 Application excelApp = new Application(); excelApp.Visible = false; excelApp.DisplayAlerts = false; // 关闭保存提示等弹窗 // 打开目标Excel文件 Workbook targetWorkbook = excelApp.Workbooks.Open(fullExcelPath); // 操作第一个工作表,如果是其他表,可改成工作表名称,比如targetWorkbook.Worksheets("DataSheet") Worksheet targetSheet = targetWorkbook.Worksheets[1]; // 删除第二行(注意Excel的行索引从1开始计数) targetSheet.Rows[2].Delete(); // 保存修改并关闭文件 targetWorkbook.Save(); targetWorkbook.Close(); excelApp.Quit(); // 释放COM对象,避免Excel进程在后台残留占用资源 System.Runtime.InteropServices.Marshal.ReleaseComObject(targetSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(targetWorkbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); // 告诉SSIS任务执行成功 Dts.TaskResult = (int)ScriptResults.Success; } catch (Exception ex) { // 出错时弹出错误提示,也可以改成写入SSIS日志 MessageBox.Show("执行出错:" + ex.Message); Dts.TaskResult = (int)ScriptResults.Failure; } } enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; } }
四、关键注意事项
- Office Interop组件引用:如果编辑器里找不到
Microsoft.Office.Interop.Excel,右键脚本项目的引用→添加引用,找到对应组件添加即可(需要你的机器上安装了Office或者Office Interop组件) - 进程残留问题:一定要记得释放COM对象,不然Excel进程会在后台一直运行,占用系统资源
- 工作表选择:如果你的数据不在第一个工作表,把
targetWorkbook.Worksheets[1]改成对应的工作表名称,比如targetWorkbook.Worksheets("业务数据表") - 权限问题:确保SSIS的运行账户有Excel文件所在文件夹的读写权限
- 版本兼容:要保证SSIS运行环境安装的Office版本和Interop组件版本匹配,避免兼容性报错
另外,你用虚拟行解决超长字符报错的思路是对的,删除虚拟行后就能得到正常的数据集啦!
内容的提问来源于stack exchange,提问作者Serdia
相关产品推荐
相关产品推荐

