在 SSIS 中使用 C# 脚本任务使 Excel 超链接可点击
Use C# script task in SSIS to make Excel hyperlink clickable
我有一个 SSIS 包,它通过数据流任务用数据填充现有 excel(模板)。我遇到的问题是我正在动态创建 worksheets 并想从主页添加一个 Hyperlink 到该工作簿中的适当 worksheet。
我在数据流任务中添加了对适当 sheet 的 =Hyperlink 引用,它执行得很好,但是 link(尽管列类型是 'General') 实际上并没有显示为 Hyperlink,直到我实际单击该单元格,然后它看起来不错。
我想我可以使用 C# 脚本任务将列翻转到 'Text',然后再返回到 'General',也许这会使它正确读取,但运气不好。我有什么想法可以模拟双击我列中的每个单元格吗?
这是我目前所拥有的,它适用于将列转换为一般列并将文本换行到另一列中,但我不知道如何使这个公式正确显示为 Hyperlink .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
#endregion
namespace ST_2bdf93d5542441248076f053703d32c9
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
string inputFile = (string)Dts.Variables["RecommendationFileName"].Value;
Excel.Application ExcelApp = new Excel.Application();
Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(inputFile);
ExcelApp.Visible = true;
Excel.Worksheet xlWorkSheetFocus = (Excel.Worksheet)ExcelWorkbook.Worksheets.get_Item(2);
xlWorkSheetFocus.Activate();
xlWorkSheetFocus.Select(Type.Missing);
Excel.Range usedRange = xlWorkSheetFocus.UsedRange;
xlWorkSheetFocus.Columns[5].NumberFormat = ""; //Make column 5 type General
xlWorkSheetFocus.Columns[4].WrapText = true; //Wrap text in column 4
ExcelWorkbook.Save();
GC.Collect();
GC.WaitForPendingFinalizers();
ExcelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(ExcelWorkbook);
ExcelApp.Quit();
Marshal.FinalReleaseComObject(ExcelApp);
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
看起来我找到了一个可行的解决方案,使用文本到列,选择一个不存在的分隔符“@”,并将结果写入相同的 column/cell。猜测可能有更好的方法,但它让我可以点击 link。
xlWorkSheetFocus.get_Range("E6", ("E6" +
xlWorkSheetFocus.UsedRange.Rows.Count)).TextToColumns(Type.Missing,
Microsoft.Office.Interop.Excel.XlTextParsingType.xlDelimited,
Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierNone, true,
Type.Missing, Type.Missing, false, true, Type.Missing,
"@", Type.Missing, Type.Missing, Type.Missing, Type.Missing);
我有一个 SSIS 包,它通过数据流任务用数据填充现有 excel(模板)。我遇到的问题是我正在动态创建 worksheets 并想从主页添加一个 Hyperlink 到该工作簿中的适当 worksheet。
我在数据流任务中添加了对适当 sheet 的 =Hyperlink 引用,它执行得很好,但是 link(尽管列类型是 'General') 实际上并没有显示为 Hyperlink,直到我实际单击该单元格,然后它看起来不错。
我想我可以使用 C# 脚本任务将列翻转到 'Text',然后再返回到 'General',也许这会使它正确读取,但运气不好。我有什么想法可以模拟双击我列中的每个单元格吗?
这是我目前所拥有的,它适用于将列转换为一般列并将文本换行到另一列中,但我不知道如何使这个公式正确显示为 Hyperlink .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
#endregion
namespace ST_2bdf93d5542441248076f053703d32c9
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
string inputFile = (string)Dts.Variables["RecommendationFileName"].Value;
Excel.Application ExcelApp = new Excel.Application();
Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(inputFile);
ExcelApp.Visible = true;
Excel.Worksheet xlWorkSheetFocus = (Excel.Worksheet)ExcelWorkbook.Worksheets.get_Item(2);
xlWorkSheetFocus.Activate();
xlWorkSheetFocus.Select(Type.Missing);
Excel.Range usedRange = xlWorkSheetFocus.UsedRange;
xlWorkSheetFocus.Columns[5].NumberFormat = ""; //Make column 5 type General
xlWorkSheetFocus.Columns[4].WrapText = true; //Wrap text in column 4
ExcelWorkbook.Save();
GC.Collect();
GC.WaitForPendingFinalizers();
ExcelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(ExcelWorkbook);
ExcelApp.Quit();
Marshal.FinalReleaseComObject(ExcelApp);
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
看起来我找到了一个可行的解决方案,使用文本到列,选择一个不存在的分隔符“@”,并将结果写入相同的 column/cell。猜测可能有更好的方法,但它让我可以点击 link。
xlWorkSheetFocus.get_Range("E6", ("E6" +
xlWorkSheetFocus.UsedRange.Rows.Count)).TextToColumns(Type.Missing,
Microsoft.Office.Interop.Excel.XlTextParsingType.xlDelimited,
Microsoft.Office.Interop.Excel.XlTextQualifier.xlTextQualifierNone, true,
Type.Missing, Type.Missing, false, true, Type.Missing,
"@", Type.Missing, Type.Missing, Type.Missing, Type.Missing);