在 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);