如何按名称获取和比较Excel电子表格中单元格的内容?

时间:2014-12-01 15:14:09

标签: c# excel office-interop

我正在尝试将一个单元格与一个字符串进行比较,以便在它相等时替换它。但是当我尝试执行下面的代码时,会发生0x800A03EC错误。

                int cont = 0;
                string cell;
                do
                {
                    cont++;
                    cell = rCol.ToUpper() + cont.ToString(); // = "D1"
                    string cellData = ((Excel.Range)sheet.Cells[cell]).Value2.ToString();

                    if (cellData == from)
                    {
                        sheet.Cells[cell] = to;
                    }
                } while (sheet.Cells[cell] == null);

我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果你知道要检查的单元格,例如A1,你可以这样做:

using System;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            // create app
            var excelApp = new Excel.Application();
            // open workbook
            var workbook = excelApp.Workbooks.Open(
                @"C:\Users\Home\Documents\Book1.xlsx",
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);
            // open sheet
            var sheet = (Excel.Worksheet)workbook.Sheets[1];

            // create some variables
            var from = "Pete";
            var to = "Dave";
            // compare cell A1 [1,1] with 'from'
            if (string.Equals(sheet.Cells[1,1].Value, from))
            {
                sheet.Cells[1, 1].Value = to;
            }

            // save the workbook
            workbook.Save();
            // close the workbook and release resources
            workbook.Close(true, workbook.Path);
            Marshal.ReleaseComObject(workbook);
            workbook = null;
        }
    }
}

答案 1 :(得分:0)

尝试这样做以获得一个简单的范围:

int row = 1;
string col = "D";        
string text = sheet.get_Range(col + row.ToString()).Value;

0x800A03EC错误是Excel返回的值,表示NAME_NOT_FOUND(请参阅this SA question)。看起来你传递了一个Excel无法找到的参数,可能是因为你传递了一个字符串(“D1”),而不是两个整数参数(4,1)。

在不看到更多代码的情况下,无法确定获取rCol.ToUpper()值的位置。但是,如果您尝试通过一系列列和行来检查相等条件(这就是您正在尝试的那样),您将很快遇到如何使用大写字母增加列值的棘手问题(试试吧;没那么有趣!)。

我最近在VB中做的一个解决方案是使用本机Excel函数索引,该索引使用数值来获取特定单元格。您需要转换Excel.WorksheetFunction类型的对象才能使用该函数。但我发现有比使用Excel函数更简单的解决方案:

using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

namespace exceltest
{
class Program
{

    static void Main(string[] args)
    {
        Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel.Workbook workbook = xl.Workbooks.Open(@"C:\test.xlsx");
        Microsoft.Office.Interop.Excel.Worksheet sheet = workbook.Sheets[1];
        xl.Visible = true;

        //use this if you want to use native Excel functions (such as index)
        Microsoft.Office.Interop.Excel.WorksheetFunction wsFunc = xl.WorksheetFunction;

        int maxNum = 100; // set maximum number of rows/columns to search

        string from = "blah";
        string to = "blum";

        //this is pretty slow, since it has to interact with 10,000 cells in Excel
        // just one example of how to access and set cell values           
        for (int col = 1; col <= maxNum; col++)
        {
            for (int row = 1; row <= maxNum; row ++)
            {
                Range cell = (Range)sheet.Cells[row, col];
                if ((string)cell.Value == from) //cast to string to avoid null reference exceptions
                {
                    cell.Value = to;
                }
            }
        }
    }
}

}