0

我正在尝试使用 C# 读取单个 excel 单元格 (A3),但是由于下面提到的错误,此代码失败。我正在使用 SSIS 脚本任务。请帮我 !!!谢谢

/*
   Microsoft SQL Server Integration Services Script Task
   Write scripts using Microsoft Visual C# 2008.
   The ScriptMain is the entry point class of the script.
*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel; //use the reference in your code

namespace ST_72bc640805c54a799cae807cc596a894.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        /*
        The execution engine calls this method when the task executes.
        To access the object model, use the Dts property. Connections, variables, events,
        and logging features are available as members of the Dts property as shown in the following examples.

        To reference a variable, call Dts.Variables["MyCaseSensitiveVariableName"].Value;
        To post a log entry, call Dts.Log("This is my log text", 999, null);
        To fire an event, call Dts.Events.FireInformation(99, "test", "hit the help message", "", 0, true);

        To use the connections collection use something like the following:
        ConnectionManager cm = Dts.Connections.Add("OLEDB");
        cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";

        Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.

        To open Help, press F1.
    */
        public void Main()
        {
            object _row = 3;
            object _column = 1;
            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
            excelApp.Visible = false;
            excelApp.ScreenUpdating = false;
            excelApp.DisplayAlerts = false;
            Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(@"C:\\ETL Process\\Sample.xlsx", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

             Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets;
            string currentSheet = "Sheet1";
            Microsoft.Office.Interop.Excel.Worksheet excelWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item(currentSheet);
            Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.UsedRange;
            string sValue = (range.Cells[_row, _column] as Microsoft.Office.Interop.Excel.Range).Value2.ToString();
            MessageBox.Show(sValue); 
            //sValue has your value
        }
    }
}

这是错误

错误:System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Office.Interop.Excel,版本=12.0.0.0,文化=中性,PublicKeyToken=71e9bce111e9429c”或其依赖项之一。该系统找不到指定的文件。文件名:ST_72bc640805c54a799cae807cc596a894.csproj.ScriptMain.Main() 处的文件名:“Microsoft.Office.Interop.Excel,版本=12.0.0.0,文化=中性,PublicKeyToken=71e9bce111e9429c”

警告:程序集绑定日志记录已关闭。要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1。注意:与程序集绑定失败日志记录相关的一些性能损失。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。

--- 内部异常堆栈跟踪结束 --- System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr , Binder binder, Object[] parameters, CultureInfoculture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture)
在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine 的 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)。执行脚本()

我什至将此添加到系统 http://msdn.microsoft.com/en-us/library/kh3965hw%28VS.80%29.aspx

4

1 回答 1

2

您的代码正在使用程序集Microsoft.Office.Interop.Excel。当您安装了 MS Office 时,您的本地计算机可以使用此功能。

您现在已将代码部署到服务器。此服务器未安装 Office。上述程序集不是核心 .NET 运行时的一部分。当你的包试图运行时,它会抛出,Could not load file or assembly 'Microsoft.Office.Interop.Excel'因为你没有提供它需要的资源。

如果您选择在服务器上安装 Office,请注意这种方法会产生许可成本,并且该服务器适用的补丁数量会增加。这可能会导致更长的停机时间/中断,这可能取决于您的 SLA。

如果您认为“它只是一个或两个 DLL,我可以将它们从我的机器复制到服务器”,即使设法将它们全部复制并运行,您已经有效地安装了 Office,并且上述许可将适用你应该接受审计吗?

否则,您唯一的其他办法是重新编码您的包以不使用该程序集。

于 2013-07-31T01:16:00.363 回答