简体   繁体   English

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

[英]How do I get and compare the contents of a cell in an Excel spreadsheet by name?

I'm trying to compare a cell with a string to replace it if it is equal. 我正在尝试将一个单元格与一个字符串进行比较,如果相等则将其替换。 But when I try to do the code below the 0x800A03EC error occurs. 但是,当我尝试执行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);

How can I do this? 我怎样才能做到这一点?

If you know the cell you want to check, for example A1, you can do it like this: 如果您知道要检查的单元格(例如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;
        }
    }
}

Try this to get at a simple range: 尝试以下步骤:

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

The 0x800A03EC error is a value returned by Excel, which means NAME_NOT_FOUND (see this SA question ). 0x800A03EC错误是Excel返回的值,表示NAME_NOT_FOUND(请参阅此SA问题 )。 Looks like you were passing a parameter that Excel could not find, probably because you were passing a string ("D1"), rather than two integer parameters (4,1). 似乎您传递的是Excel找不到的参数,可能是因为您传递的是字符串(“ D1”),而不是两个整数参数(4,1)。

It's impossible to tell where you are getting the rCol.ToUpper() value, without seeing more of your code. 如果不看更多代码,就不可能告诉您在哪里获取rCol.ToUpper()值。 However, if you are attempting to go through a series of columns and rows to check for an equality condition (that's what it looks like you are attempting), you will quickly run into the pesky problem of how to increment the column value using capital letters (just try it; not much fun!). 但是,如果您尝试遍历一系列列和行以检查是否等于条件(这就是您要尝试的样子),那么您将很快遇到令人讨厌的问题,即如何使用大写字母增加列值(只是尝试;没有什么乐趣!)。

One solution I did in VB recently was to use the native Excel function index, which uses numeric values to get at a particular cell. 我最近在VB中所做的一个解决方案是使用本机Excel函数索引,该索引使用数字值获取特定的单元格。 You would need to cast an object of the type Excel.WorksheetFunction to use that function. 您需要转换类型为Excel.WorksheetFunction的对象才能使用该功能。 But I have since discovered there are easier solutions than using an Excel function: 但是自那以后,我发现有比使用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;
                }
            }
        }
    }
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM