Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用脚本任务声明工作表?_C#_Excel_Ssis_Etl_Script Task - Fatal编程技术网

C# 如何使用脚本任务声明工作表?

C# 如何使用脚本任务声明工作表?,c#,excel,ssis,etl,script-task,C#,Excel,Ssis,Etl,Script Task,我试图声明一个工作表来处理.xlsx文件的单元格,但当我声明工作表对象时,我的C#脚本失败: Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); Workbook excelBook = xlApp.Workbooks.Open(fileFullPath); MySheet = (Excel.Worksheet)excelBook.Works

我试图声明一个工作表来处理.xlsx文件的单元格,但当我声明工作表对象时,我的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];
甚至

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


感谢您的帮助。

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

请参见

如果你真的成功了,它会在最不方便的时候失败

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

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

(1) 编辑现有工作表 如果要编辑现有工作表,请尝试以下操作之一:

(a) 使用工作表而不是工作表 例如:

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

)
有关详细信息,请查看以下链接:

(b) 互操作库版本 检查您使用的Office.Interop DLL是否与计算机上安装的officeversion相关

(c) 权限和保护问题 检查工作簿是否为只读或受保护,您可以参考以下问题:

(d) 隐藏工作表问题 还要确保工作簿不包含隐藏或临时工作表,尝试循环工作簿中的所有工作表,并调试代码以查看发生了什么


(2) 添加新工作表 如果要将新工作表添加到现有工作簿中,可以:

(a) 通过脚本任务添加它 您可以使用类似的代码:

Excel._Worksheet newWorksheet;
newWorksheet = (Excel._Worksheet)ThisWorkbook.Worksheets.Add();
有关详细信息,您可以查看以下链接:

(b) 使用执行SQL任务 首先,您必须创建一个
Excel连接管理器
,然后添加一个执行SQL任务,选择Excel连接并编写一个
create
语句,例如:

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

)
有关详细信息,您可以查看以下链接:


感谢您的回答,实际上我需要根据行索引和列索引更改单元格的颜色,这就是我使用Office Interop的原因。其余脚本工作正常,我可以正确获取列值,但当试图突出显示数据集的单元格时,有人建议我使用Office Interop,因为根据他所说的,无法从数据集中更改单元格的颜色:“object CellToHigh=dsDataCell.Tables[Data_Sheet].Rows[RowIndex][ColumnIndex];”有没有其他不使用OpenXML的解决方案?因为在我看来,使用这个解决方案很复杂。在服务器上运行Excel没有任何好处。我以前在Microsoft支持部门工作,那篇KB文章可能是我最常向客户发送的文章。我的问题将通过安装Open XML SDK 2.5得到解决?以及将DocumentFormat.OPENXML添加到引用中?请问这是解决方案还是我有?仅供参考,我在同一软件包中的上一个scripttask中使用Office Interop来检索电子表格名称,它工作得很好。我要说的是,在服务器上使用Office Interop可能会工作,也可能不会工作。它可能会工作一段时间,然后莫名其妙地失败。微软不支持它,你得到的任何关于如何使它工作的建议都可能是错误的。是的,OpenXMLSDK是一个非常重要的工具(但是,如果你走这条路,一定要下载OpenXML生产力工具,并习惯它能为你做什么)。还有其他Office文件API(尽管我想不起它们的名称-仔细研究堆栈溢出,查看
[Excel]
tag否则,您能给我一个服务器端自动化的替代解决方案吗?Microsoft页面上不清楚。谢谢您宝贵的回答。事实上,我正在尝试编辑现有的工作表,在查看并尝试了所有声明后,我在上面的一个链接中找到了此工作表,它是唯一适合我的工作表:
工作表xlSheets=excelBook.Sheets[1]作为Excel.Worksheet;
,我不知道whey,我检查了你提到的所有要点:DLL:Assembly Microsoft.Office.Interop.Excel C:\Windows\Assembly\GAC\u MSIL\Microsoft.Office.Interop.Excel\15.0.0.0\u71e9bce111e9429c\Microsoft.Office.Interop.Excel.DLL,工作簿不是只读的。但我仍然对范围和单元格有问题。我正在尝试使用:
Range rng=xlSheets.Cells[RowIndex,ColumnIndex]作为Excel.Range;rng.Font.Color=System.Drawing.colortransplator.ToOle(System.Drawing.Color.Red);
但是这会生成异常而不会产生编译错误。您能帮我一下吗?实际上,当我替换
Cells[RowIndex,ColumnIndex]时它会工作
by
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 columndex=1;columndex=ColumnData.Table.Columns[columndacellsvalue].Ordinal+1;RowIndex=dtDataRows.Rows.IndexOf(rowDataID)+1;
在今天之前我无法尝试此功能,它非常有效。我非常感谢您宝贵的帮助和清晰的答案。