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

如何在C#中从其他函数访问Excel读取的列表数据

解决Excel读取列表的跨函数访问问题

你的ReadExcelData函数目前是void类型,内部生成的newData是局部变量,函数执行完毕后就会被销毁,所以其他函数没法访问到这份数据。下面给你三种可行的修改方案:

方案1:让函数返回读取到的列表

直接把函数的返回类型改成List<List<object>>,在函数末尾返回newData,调用时接收返回值即可在其他地方使用。

修改后的代码:

public static List<List<object>> ReadExcelData(string filepath)
{
    List<List<object>> newData = new List<List<object>>();
    try
    {
        Excel.Application excelApp = new Excel.Application();
        Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(filepath);
        Excel._Worksheet excelWorksheet = excelWorkbook.Sheets[1];
        Excel.Range excelRange = excelWorksheet.UsedRange;

        int rowCount = excelRange.Rows.Count;
        int colCount = excelRange.Columns.Count;

        object[,] data = new object[rowCount, colCount];

        // 遍历单元格存入数组
        for (int i = 1; i <= rowCount; i++)
        {
            for (int j = 1; j <= colCount; j++)
            {
                data[i - 1, j - 1] = excelRange.Cells[i, j].Value;
            }
        }

        // 转换为行列结构的列表
        for (int i = 0; i < rowCount; i++)
        {
            List<object> newRow = new List<object>();
            for (int j = 0; j < colCount; j++)
            {
                newRow.Add(data[i, j]);
            }
            newData.Add(newRow);
        }

        excelWorkbook.Close(false);
        excelApp.Quit();
    }
    catch (NXException ex)
    {
        theSession.LogFile.WriteLine("+++ Error Found in 'Main' : " + ex.Message + Environment.NewLine + ex.StackTrace);
    }
    return newData;
}

调用示例:

// 在其他函数中调用并获取数据
var excelData = ReadExcelData("你的文件路径");
// 直接使用excelData,比如遍历输出
foreach(var row in excelData)
{
    foreach(var cell in row)
    {
        Console.WriteLine(cell?.ToString());
    }
}

方案2:用类的静态字段存储数据

在包含ReadExcelData函数的类中定义一个静态的List<List<object>>字段,函数执行时把数据赋值给这个字段,其他函数直接访问该字段即可。

修改示例:

// 类内部定义静态字段
public static class ExcelHelper
{
    public static List<List<object>> ExcelData { get; private set; }

    public static void ReadExcelData(string filepath)
    {
        try
        {
            Excel.Application excelApp = new Excel.Application();
            Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(filepath);
            Excel._Worksheet excelWorksheet = excelWorkbook.Sheets[1];
            Excel.Range excelRange = excelWorksheet.UsedRange;

            int rowCount = excelRange.Rows.Count;
            int colCount = excelRange.Columns.Count;

            object[,] data = new object[rowCount, colCount];

            // 遍历单元格存入数组
            for (int i = 1; i <= rowCount; i++)
            {
                for (int j = 1; j <= colCount; j++)
                {
                    data[i - 1, j - 1] = excelRange.Cells[i, j].Value;
                }
            }

            List<List<object>> newData = new List<List<object>>();
            // 转换为行列结构的列表
            for (int i = 0; i < rowCount; i++)
            {
                List<object> newRow = new List<object>();
                for (int j = 0; j < colCount; j++)
                {
                    newRow.Add(data[i, j]);
                }
                newData.Add(newRow);
            }

            // 赋值给静态字段
            ExcelData = newData;

            excelWorkbook.Close(false);
            excelApp.Quit();
        }
        catch (NXException ex)
        {
            theSession.LogFile.WriteLine("+++ Error Found in 'Main' : " + ex.Message + Environment.NewLine + ex.StackTrace);
        }
    }
}

其他函数访问示例:

// 先调用读取函数
ExcelHelper.ReadExcelData("你的文件路径");
// 直接访问静态字段
var data = ExcelHelper.ExcelData;

方案3:通过out参数传递数据

把newData作为out参数传入函数,函数执行后会将数据填充到这个参数中,调用方可以直接使用。

修改后的代码:

public static void ReadExcelData(string filepath, out List<List<object>> excelData)
{
    excelData = new List<List<object>>();
    try
    {
        Excel.Application excelApp = new Excel.Application();
        Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(filepath);
        Excel._Worksheet excelWorksheet = excelWorkbook.Sheets[1];
        Excel.Range excelRange = excelWorksheet.UsedRange;

        int rowCount = excelRange.Rows.Count;
        int colCount = excelRange.Columns.Count;

        object[,] data = new object[rowCount, colCount];

        // 遍历单元格存入数组
        for (int i = 1; i <= rowCount; i++)
        {
            for (int j = 1; j <= colCount; j++)
            {
                data[i - 1, j - 1] = excelRange.Cells[i, j].Value;
            }
        }

        // 转换为行列结构的列表
        for (int i = 0; i < rowCount; i++)
        {
            List<object> newRow = new List<object>();
            for (int j = 0; j < colCount; j++)
            {
                newRow.Add(data[i, j]);
            }
            excelData.Add(newRow);
        }

        excelWorkbook.Close(false);
        excelApp.Quit();
    }
    catch (NXException ex)
    {
        theSession.LogFile.WriteLine("+++ Error Found in 'Main' : " + ex.Message + Environment.NewLine + ex.StackTrace);
    }
}

调用示例:

// 在其他函数中调用
List<List<object>> excelData;
ReadExcelData("你的文件路径", out excelData);
// 使用excelData

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:44:59