如何在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
相关产品推荐
相关产品推荐

