【问题标题】:Excel add-in c# findExcel 加载项 c# 查找
【发布时间】:2014-03-09 16:13:49
【问题描述】:

我正在使用额外的功能区创建自己的 Excel 搜索和替换功能。我想在 excel 文档中找到某个字符串(不是现有文档,Visual Studio 在我运行应用程序时会自动打开 excel)。问题是他找不到我们在电子表格的编辑框(txtFind)中给出的值。当我创建一个单元对象时,应用程序在我的循环中给出了一个错误。

这是代码:

Excel.Application exc = new Excel.Application();
    if (exc == null)
    {
        Console.WriteLine("ERROR: EXCEL couldn't be started!");
    }

    Workbooks workbooks = exc.Workbooks;
    Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
    Sheets sheets = workbook.Worksheets;
    Worksheet worksheet = (Worksheet)sheets.get_Item(1);
    if (worksheet == null)
    {
        Console.WriteLine("ERROR: worksheet == null");
    }
    for (int i = 1; i < 150; i++)
    {
        for (int j = 1; j < 150; j++)
        {
            var cell = (worksheet.Cells[i, j] as Excel.Range).Value;
            if (cell == txtFind.Text.ToString())
            {
                MessageBox.Show("FOUND");
            }
            else
            {
                cell.FindNext();
            }
        }
    }    

【问题讨论】:

  • 您的应用程序给出的错误是什么?
  • var cell = (worksheet.Cells[i, j] as Excel.Range).Value;在这一行他给出了一个错误,System.NullReferenceException
  • 可能是您的转换as Excel.Range 失败或i,j 范围内没有值。通过保留断点检查您在什么范围内收到此错误。
  • 当我在那一行放了一个断点,应用程序失败了,那么他确实表明变量“cell”的值是空的......

标签: c# excel replace find add-in


【解决方案1】:
  1. 您只搜索前 150 行和 150 列。如果第 151 行有数据怎么办?

  2. 你为什么要做.FindNext?仅当您正在执行Find() 操作时才调用它。与手动搜索所有行和列相比,Find() 操作是您更好的选择。

  3. nullrefexception 的原因很可能是该范围不存在。如果您坚持对范围 (150x150) 进行硬编码,请使用 IF 语句检查该值是否不为空。不过,您最好使用sheet.UsedRange 范围,它会告诉您需要搜索多少工作表。

  4. 上面的代码永远不会找到该行,因为您正在添加一个新的空白表然后搜索它。一张新的空白纸永远不会包含您的价值。

【讨论】:

    【解决方案2】:
    Excel.Application exc = new Excel.Application();
        if (exc == null)
        {
            Console.WriteLine("ERROR: EXCEL couldn't be started!");
        }
    
        Workbooks workbooks = exc.Workbooks;
        Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
        Sheets sheets = workbook.Worksheets;
        Worksheet worksheet = (Worksheet)sheets.get_Item(1);
    
        if (worksheet == null)
        {
            Console.WriteLine("ERROR: worksheet == null");
        }      
        Excel.Range range = worksheet.UsedRange;
        Excel.Range currentFind; 
    
        currentFind = range.Cells.Find(txtFind.Text.ToString(), Type.Missing, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole,
                        Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, false, false);
        if (currentFind != null)
        {
            MessageBox.Show("found");
        }
        else
        {
            MessageBox.Show("not found");
        }
    

    这是我的新代码...... currentFind 仍然有一个空值。当我通过 Visual Studio 运行应用程序时,我用我想要查找的值填充了一些单元格,因此我没有检查现有文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多