C# Excel 查找函数异常

C# Excel Find Function Exception

我正在尝试创建一个 C# 应用程序,它使用 Microsoft.Office.Interop.Excel

访问 Excel 工作表

我能够成功加载工作表并读取数据,但是,当我使用查找函数时,出现异常

Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(sheetName);
Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange;
Excel.Range colRange = xlWorksheet.Columns["A"];
Excel.Range resultRange = colRange.Find(row[2].ToString(), null, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, false, Type.Missing);

(我确定 row[2] 已初始化并成功使用 ToString())

异常看起来像:

Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.dll
   at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
   at Microsoft.Office.Interop.Excel.Range.Find(Object What, Object After, Object LookIn, Object LookAt, Object SearchOrder, XlSearchDirection SearchDirection, Object MatchCase, Object MatchByte, Object SearchFormat)
   at ServiceBOMVATool.MainWindow.EnterModel_Click(Object sender, RoutedEventArgs e) in C:\Users\ta4935\source\repos\ServiceBOMVATool\ServiceBOMVATool\MainWindow.xaml.cs:line 445

有人知道可能出了什么问题吗?预先感谢您的帮助。

您将 null 作为第二个参数传递(对于参数 After)。但是 null 在这里不是有效值。如果您不想传递此参数,请像您对最后一个参数所做的那样使用 Type.Missing

Excel.Range resultRange = colRange.Find(
    row[2].ToString(), 
    Type.Missing, // Null is not allowed here
    Excel.XlFindLookIn.xlValues, 
    Excel.XlLookAt.xlPart, 
    Excel.XlSearchOrder.xlByRows, 
    Excel.XlSearchDirection.xlNext, 
    false, 
    false, 
    Type.Missing);

或者,只需按名称指定要使用的参数。这将自动为所有未指定的参数使用 Type.Missing

// Specifiy parameters by name to leave out some
Excel.Range resultRange = colRange.Find(
    What: row[2].ToString(),
    LookIn: Excel.XlFindLookIn.xlValues,
    LookAt: Excel.XlLookAt.xlPart,
    SearchOrder: Excel.XlSearchOrder.xlByRows,
    SearchDirection: Excel.XlSearchDirection.xlNext,
    MatchCase: false,
    MatchByte: false);