You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中无法使用cntRow和cntCln变量的技术求助

解决C# Excel操作类中cntRow和cntCln变量未正确实现的问题

问题根源

  1. 局部变量作用域限制:你在构造函数内定义的cntRow和cntCln是局部变量,仅在构造函数执行期间有效,类的其他方法无法访问。
  2. 静态方法访问实例成员错误:静态方法OpenFile中试图通过Excel.cntRow访问变量,这是把它当成了类的静态成员,但实际需要的是具体Excel实例的行数和列数,静态方法不能直接访问非静态实例成员。

修正步骤

1. 将cntRow和cntCln改为类的实例属性

在Excel类的成员区域声明这两个属性,确保类的所有实例方法和外部都能读取(通过private set限制修改权限,保证数据安全性):

internal class Excel
{
    string path = "";
    _Application excel = new _Excel.Application();
    Workbook wb;
    Worksheet ws;
    // 定义为实例属性,仅内部可修改
    public int cntRow { get; private set; }
    public int cntCln { get; private set; }

    public Excel(string path, int Sheet)
    {
        this.path = path;
        this.wb = excel.Workbooks.Open(path);
        this.ws = wb.Worksheets[Sheet];
        Range usedRange = ws.UsedRange;
        // 给实例属性赋值
        cntRow = usedRange.Rows.Count;
        cntCln = usedRange.Columns.Count;
    }

    // 其他方法...
}

2. 修正静态OpenFile方法的访问逻辑

通过创建的Excel实例访问cntRow和cntCln,同时优化重复调用ReadCell的问题,并添加COM对象释放逻辑(避免Excel进程在后台残留占用资源):

// 读取指定Excel文件的全部内容
public static void OpenFile()
{
    Excel excel = new Excel(@"Testblatt.xlsx", 1);
    
    // 访问实例的cntRow和cntCln
    for (int i = 0; i < excel.cntRow; i++) 
    {
        for (int j = 0; j < excel.cntCln; j++)
        {
            string cellValue = excel.ReadCell(i, j);
            MessageBox.Show(cellValue);
        }
    }

    // 关闭工作簿并释放COM资源
    excel.wb.Close();
    excel.excel.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel.ws);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel.wb);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel.excel);
}

完整修正后的代码

internal class Excel
{
    string path = "";
    _Application excel = new _Excel.Application();
    Workbook wb;
    Worksheet ws;
    public int cntRow { get; private set; }
    public int cntCln { get; private set; }

    public Excel(string path, int Sheet)
    {
        this.path = path;
        this.wb = excel.Workbooks.Open(path);
        this.ws = wb.Worksheets[Sheet];
        Range usedRange = ws.UsedRange;
        cntRow = usedRange.Rows.Count;
        cntCln = usedRange.Columns.Count;
    }

    public string ReadCell(int i, int j)
    {
        i++;
        j++;
        if (ws.Cells[i, j].Value2 != null) 
            return Convert.ToString(ws.Cells[i, j].Value);
        else
            return "";
    }

    // 读取指定Excel文件的全部内容
    public static void OpenFile()
    {
        Excel excel = new Excel(@"Testblatt.xlsx", 1);
        
        for (int i = 0; i < excel.cntRow; i++) 
        {
            for (int j = 0; j < excel.cntCln; j++)
            {
                string cellValue = excel.ReadCell(i, j);
                MessageBox.Show(cellValue);
            }
        }

        excel.wb.Close();
        excel.excel.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excel.ws);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excel.wb);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excel.excel);
    }

    public static void ConView()
    {
        OpenFile();
    }
}

内容的提问来源于stack exchange,提问作者markus54345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:30:47