问题:
我有一个SSIS包,它循环遍历100+ Excel文件并读取数据,然后将内容复制到。在这些Excel文件中,这一列具有超链接。列文本本身类似于DSH 4,但是在Excel中单击它会打开一个包含一些图像的文件夹。如何复制本列中的底层链接而不是单元格中的实际文本?
到目前为止我尝试过什么:
我没有真正尝试过任何东西,因为我在SSIS中没有找到任何关于如何做到这一点的资源。手动向Excel文件中添加列是不可能的,因为有100多个文件。我找到的唯一资源是在this SO Question中,但这并不表示在不手动操作Excel文件的情况下执行此操作的过程。
我想要的:
在我的ForEach循环容器中,我有一个数据流任务,它获取Excel并将其推入SQL。包含超链接的列称为PhotoReference (因为这些超链接打开了包含照片的文件夹)。我希望这个PhotoReference列复制到单元格的底层超链接,并将其添加到SQL列中。
例如,我希望PhotoReference列包含以下内容:
www.companyname.box.com/asjdfbgkjb134kjbsdafo2bm21n4bk
如果我能够做到这一点,我的Power报告运行在这些底层数据上,可能包含一个可点击的文本,它将直接打开图像。
任何帮助都将不胜感激。
更新:
我尝试了两种不同的方法从我的专栏中提取超链接,但每种方法都有各自的问题:
方法1:我向我的ForEach容器中添加了一个脚本任务组件,当我遍历每个Microsoft.Office.Interop.Excel.Hyperlinks文件时,使用Microsoft.Office.Interop.Excel.Hyperlinks程序集从我的Excel列中获取超链接。但是,我不知道以后该怎么办。我想唯一要做的就是用我提取的超链接覆盖Excel列的内容,但是我真的不想以任何方式改变我的Excel文件。
方法2:我在我的Excel源和SQL目标之间的数据流任务中添加了一个脚本组件对象。在此方法中,由于自动生成的Input0_ProcessInputRow方法具有类型为Input0Buffer的参数Row,所以我无法取得这样的结果。我无法将任何Microsoft.Office.Interop.Excel属性应用于我的Input0Buffer对象。所以我卡住了。
发布于 2020-01-02 22:30:25
如果您必须正确地更改excel文件,您可以简单地在数据流任务之前添加一个脚本任务,用超链接替换URL列值。
在这个答案中,我将提供一个逐步解决这个问题的解决方案:
创建Excel示例
首先,我使用以下列创建了一些Excel文件:
文件内容如下所示:

创建SSIS包
时存储Excel文件路径。



Foreach循环容器中的


现在,打开脚本编辑器,在“解决方案资源管理器”窗口中,右键单击“references”图标,然后单击"Add Reference..."

另外,请确保将reference.
使用System.Runtime.InteropServices;
Dts.Variables"User::ExcelFilePath".Value.ToString();Excel.Application = Excel.Application();string originalPath = Excel.Workbook工作簿= excel.Workbooks.Open(originalPath);Excel.Worksheet工作表= (Excel.Worksheet)workbook.Worksheets1;Excel.Range usedRange = worksheet.UsedRange;int intURLColidx = 0;excel.Visible = false;excel.DisplayAlerts = false;for (int i= 1;i <= usedRange.Columns.Count);( i++) { if ((worksheet.Cells1,i as Excel.Range).Value != null & (string)(worksheet.Cells1,i as Excel.Range).Value == "Photo") { intURLColidx = i;打断;} for (int i= 2;i <= usedRange.Rows.Count;( i++) { if ((worksheet.Cellsi,intURLColidx as Excel.Range).Hyperlinks.Count > 0) { (worksheet.Cellsi,intURLColidx as Excel.Range).Value2 = (worksheet.Cellsi,intURLColidx as intURLColidx}workbook.Save) workbook.Save();Marshal.FinalReleaseComObject(工作表);workbook.Close(Type.Missing,Type.Missing,Type.Missing);workbook.Save(工作簿);();(Excel);(int)ScriptResults.Success; = Dts.TaskResult
在上面的行中,我们首先搜索包含超链接的列索引(在本例中列名为"Photo",然后检查每一行是否超链接地址为空,我们将用这个超级链接地址替换列值)
最后,确保使用expressions:将连接管理器配置为从创建的变量值(步骤2)读取文件路径。

实验
运行包后,如果我们打开一个Excel文件,我们将看到单元格值被替换为URL:

如下图所示,数据成功导入到Server:

参考文献
发布于 2020-01-02 19:23:01
您可能需要做的是一些涉及Excel或宏的黑客行为。实际上,因为您应该避免在SSIS中使用。
您可以使用SSIS中的非标准操作(如使用脚本组件)对excel进行预处理以获取该值。
使用脚本组件导入数据需要遵循以下步骤:
- Microsoft.Excel 11.0 Object Library
(如果该引用不起作用,请尝试使用Microsoft.Excel 5.0对象库)
最后,编写一些代码:
Imports Microsoft.Office.Interop.Excel
Public Overrides Sub getHyperlink()
Dim oExcel As Object = CreateObject("Excel.Application")
Dim FileName As String
FileName = Variables.FileName
Dim oBook As Object = oExcel.Workbooks.Open(FileName)
Dim oSheet As Object = oBook.Worksheets(1)
Output0Buffer.AddRow()
// change A1 with your correct col & row
Output0Buffer.Address = cell.range("A1").Hyperlinks(1).Address & "#" & cell.range("A1").Hyperlinks(1).SubAddress
End Sub
(请记住,这是一段可能无法运行的代码,只是为了举例说明)
您可以在C#中看到代码:C# Script in SSIS Script Task to convert Excel Column in "Text" Format to "General"
脚本方法的唯一问题是需要安装Excel运行时。
更多关于脚本组件的信息:https://www.tutorialgateway.org/ssis-script-component-as-transformation/
https://stackoverflow.com/questions/59536177
复制相似问题