首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSIS从Excel单元格中提取链接以加载到SQL中。

SSIS从Excel单元格中提取链接以加载到SQL中。
EN

Stack Overflow用户
提问于 2019-12-30 19:53:49
回答 2查看 956关注 0票数 3

问题:

我有一个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对象。所以我卡住了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-02 22:30:25

如果您必须正确地更改excel文件,您可以简单地在数据流任务之前添加一个脚本任务,用超链接替换URL列值。

在这个答案中,我将提供一个逐步解决这个问题的解决方案:

创建Excel示例

首先,我使用以下列创建了一些Excel文件:

  • 名字(文本)
  • 姓氏(文本)
  • Age(数字)
  • 照片(超链接)

文件内容如下所示:

创建SSIS包

  1. 首先,您必须添加一个Excel连接管理器,该连接管理器链接到您需要导入的一个Excel文件。连接到Server instance.
  2. You的OLE DB连接管理器必须添加字符串类型的SSIS变量,以便在使用foreach枚举数

时存储Excel文件路径。

  1. 添加了Foreach循环容器,并将其配置为遍历Excel文件,如下所示:

Foreach循环容器中的

  1. 添加脚本任务和数据流任务,如下图所示:

  1. 现在,打开数据流任务,添加Excel源代码和OLE DB目标,并配置它们之间的列映射。
  2. 打开脚本任务配置,选择ExcelFilePath变量(在步骤2中创建)作为只读变量,如下图所示:

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

  • When添加引用目录“,单击COM选项卡,然后搜索,然后从结果中选择对象库,如下所示:

另外,请确保将reference.

  • On添加到脚本的顶部,您应该添加以下行:

使用System.Runtime.InteropServices;

  • In = Microsoft.Office.Interop.Excel;使用Main()函数添加以下行:

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:

参考文献

票数 2
EN

Stack Overflow用户

发布于 2020-01-02 19:23:01

您可能需要做的是一些涉及Excel或宏的黑客行为。实际上,因为您应该避免在SSIS中使用。

您可以使用SSIS中的非标准操作(如使用脚本组件)对excel进行预处理以获取该值。

使用脚本组件导入数据需要遵循以下步骤:

  1. 拖放脚本组件并选择"source“作为脚本选项类型。默认情况下,脚本语言是Microsoft 2008,而我已经在Microsoft 2008中完成了此示例。如果需要的话,请更改这一点。
  2. 在"data type
  3. 脚本“中使用正确的数据类型定义输出列。在IDE中,您应该添加引用:

代码语言:javascript
复制
- Microsoft.Excel 11.0 Object Library

(如果该引用不起作用,请尝试使用Microsoft.Excel 5.0对象库)

最后,编写一些代码:

代码语言:javascript
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59536177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档