【问题标题】:How to declare a Worksheet using a Script Task?如何使用脚本任务声明工作表?
【发布时间】:2019-02-01 15:23:38
【问题描述】:

我正在尝试声明一个 Worksheet 来处理 .xlsx 文件的单元格,但是当我声明 Worksheet 对象时我的 C# 脚本失败:

Microsoft.Office.Interop.Excel.Application xlApp = new 
Microsoft.Office.Interop.Excel.Application();

Workbook excelBook = xlApp.Workbooks.Open(fileFullPath);

MySheet = (Excel.Worksheet)excelBook.Worksheets[Data_Sheet];

我已经尝试了所有这些陈述:

MySheet workSheet = (Worksheet)excelBook.Application.Sheets[1];  
MySheet = (Excel.Worksheet)excelBook.Worksheets[1];

均匀

Worksheet MySheet = new Worksheet();
MySheet = excelBook.Worksheets[Data_Sheet];

我在 SSIS 包的脚本任务中使用此代码,但它没有显示错误消息,我只有错误窗口告诉我包含的脚本有错误编译。

感谢您的帮助。

【问题讨论】:

    标签: c# excel ssis etl script-task


    【解决方案1】:

    我真的不明白您是要添加新工作表还是只是编辑当前工作表。对于这两种情况我都会给出一些建议:

    (1) 编辑现有工作表

    如果您要编辑现有工作表,请尝试以下方法之一:

    (a) 使用 _Worksheet 代替 Worksheet

    Excel._Worksheet xlWorksheet = (Excel._Worksheet)xlWorkbook.Sheets[1];
    

    例如:

    Excel.Application xlApp = new Excel.Application();
    Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"file.xlsx");
    Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
    Excel.Range xlRange = xlWorksheet.UsedRange;
    

    欲了解更多信息,请查看以下链接:

    (b) 互操作库版本

    检查您正在使用的 Office.Interop DLL 是否与机器上安装的 officeversion 相关。

    (c) 权限和保护问题

    检查工作簿不是ReadOnly还是受保护,可以参考下面的SO问题:

    (d) 隐藏工作表问题

    还要确保工作簿不包含隐藏或临时工作表,尝试遍历工作簿中的所有工作表并调试代码以查看发生了什么。


    (2) 添加新工作表

    如果您希望将新工作表添加到现有工作簿中,您可以:

    (a) 通过脚本任务添加

    你可以使用类似的代码:

    Excel._Worksheet newWorksheet;
    newWorksheet = (Excel._Worksheet)ThisWorkbook.Worksheets.Add();
    

    更多信息,您可以查看以下链接:

    (b) 使用执行 SQL 任务

    首先你必须创建一个Excel Connection Manager,然后添加一个Execute SQL Task,选择Excel Connection并编写一个CREATE Statement,例如:

    CREATE TABLE
    `Excel Destination` (
    
        `PromotionKey` INTEGER,
        `PromotionAlternateKey` INTEGER,
        `EnglishPromotionName` NVARCHAR(255),
        `SpanishPromotionName` NVARCHAR(255),
        `FrenchPromotionName` NVARCHAR(255),
        `DiscountPct` DOUBLE PRECISION,
        `EnglishPromotionType` NVARCHAR(50),
        `SpanishPromotionType` NVARCHAR(50),
        `FrenchPromotionType` NVARCHAR(50),
        `EnglishPromotionCategory` NVARCHAR(50),
        `SpanishPromotionCategory` NVARCHAR(50),
        `FrenchPromotionCategory` NVARCHAR(50),
        `StartDate` DATETIME,
        `EndDate` DATETIME,
        `MinQty` INTEGER,
        `MaxQty` INTEGER
    
    )
    

    更多信息,您可以查看以下链接:

    【讨论】:

    • 感谢您的宝贵回答。实际上,我正在尝试编辑现有的工作表,在查看并尝试了所有声明之后,我在上面的链接之一中找到了这个,它是唯一对我有用的:Worksheet xlSheets = excelBook.Sheets[1] as Excel.Worksheet;,我不知道乳清,我已经检查了您提到的所有要点: DLL : Assembly Microsoft.Office.Interop.Excel C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop .Excel.dll,工作簿不是只读的。
    • 但我仍然遇到范围和单元格的问题。我正在尝试使用:Range rng = xlSheets.Cells[RowIndex, ColumnIndex] as Excel.Range; rng.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);,但这会产生异常而没有编译错误。你能帮我吗?
    • 实际上,当我将 Cells[RowIndex, ColumnIndex] 替换为 Cells[1, 1] 时,它可以工作。但我需要从我之前在脚本中处理的变量中获取索引:int RowIndex = 0; int ColumnIndex = 0; ColumnIndex = ColumnData.Table.Columns[ColumnDataCellsValue].Ordinal; RowIndex = dtDataRows.Rows.IndexOf(rowDataID);。感谢您的帮助
    • 单元格行列索引不是从零开始的,所以不能从0开始,必须从1开始循环 -> int RowIndex = 1; int ColumnIndex = 1; ColumnIndex = ColumnData.Table.Columns[ColumnDataCellsValue].Ordinal + 1; RowIndex = dtDataRows.Rows.IndexOf(rowDataID) + 1;
    • 在今天之前我无法尝试这个,它就像一个魅力。我真的非常感谢您的宝贵帮助和明确的答案。
    【解决方案2】:

    Office 互操作/对象模型 API 基于在应用程序上下文中运行的 Office 代码。它期望在交互式(即非服务器)应用程序的 UI 线程上运行。

    Considerations for server-side Automation of Office

    如果你真的让这个工作,它会在最不方便的时候失败。

    如果您需要在服务器上操作 Office 文档,请使用服务器端适当的 API,例如 OpenXML

    【讨论】:

    • 感谢您的回答,实际上我需要根据 RowIndex 和 ColumnIndex 更改单元格的颜色,这就是我使用 Office Interop 的原因。其余脚本工作正常,我可以正确获取列值,但是当尝试突出显示数据集的单元格时,有人建议我使用 Office Interop,因为根据他所说,无法从数据集中更改单元格的颜色:'object CellToHigh = dsDataCell.Tables[Data_Sheet].Rows[RowIndex][ColumnIndex];'不使用 OpenXML 还有其他解决方案吗?因为使用这个解决方案对我来说看起来很复杂。
    • 在服务器上运行 Excel 没有任何好处。我曾经在 Microsoft 支持部门工作,那篇知识库文章可能是我最常发送给客户的一篇。
    • 我的问题将通过安装 Open XML SDK 2.5 得到解决?并将 DocumentFormat.OPENXML 添加到引用中?请问这是解决方案还是我有?仅供参考,我在同一个包中的先前脚本任务中使用 Office Interop 来检索电子表格名称,并且效果很好。
    • 我要说的是,在服务器上使用 Office 互操作可能有效,也可能无效。它可能会工作一段时间,然后莫名其妙地失败。 Microsoft 不支持它,并且您获得的有关使其工作的任何建议都可能是错误的。是的,OpenXML SDK 是一个非常棒的工具(但是,如果你走这条路,请确保下载 OpenXML Productivity Tool 并习惯它可以为你做的事情)。还有其他 Office 文件 API(虽然我想不出它们的名字 - 挖掘堆栈溢出,查看 [Excel] 标签
    • 否则,你能给我一个服务器端自动化的替代解决方案吗?微软页面上不清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2020-04-14
    • 2020-09-29
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多