如何在C#中将数组复制到Excel Range?代码失效问题排查
在C#中将数组复制到Excel Range的正确方法及问题分析
问题原因
你提供的代码中每个单元格显示相同值,核心原因是Excel对象模型对一维数组的赋值逻辑:
当你给一个多行单列的纵向Range赋值一维数组时,Excel会默认将一维数组视为一行的数据,只会把数组的第一个元素重复填充到Range的所有单元格中——因为一维数组在Excel里默认是行方向的,和你要填充的列方向不匹配。
另外代码里的flow.count是小写的c,C#是大小写敏感语言,正确写法应为flow.Count,这也是潜在的语法错误。
解决方法
方法一:将一维数组转为列方向的二维数组
Excel的Range接受二维数组时,会严格按照「行×列」的对应关系填充单元格。对于单列场景,我们需要构造一个[元素个数, 1]结构的二维数组:
Workbook workbook; Worksheet worksheet; List<double> flow = new List<double>(); // 此处填充flow列表的逻辑省略 workbook = excel.Workbooks.Open(filename); worksheet = workbook.Worksheets.Add(); // 构造二维数组(行数=flow元素数,列数=1) double[,] flow2DArray = new double[flow.Count, 1]; for (int i = 0; i < flow.Count; i++) { flow2DArray[i, 0] = flow[i]; } // 赋值到目标Range worksheet.Range[$"A1:A{flow.Count}"].Value = flow2DArray;
方法二:用Transpose转置一维数组
利用Excel内置的Transpose方法,将行方向的一维数组转成列方向的数组,直接匹配纵向Range:
Workbook workbook; Worksheet worksheet; List<double> flow = new List<double>(); // 此处填充flow列表的逻辑省略 workbook = excel.Workbooks.Open(filename); worksheet = workbook.Worksheets.Add(); // 转置数组后赋值 worksheet.Range[$"A1:A{flow.Count}"].Value = excel.WorksheetFunction.Transpose(flow.ToArray());
内容的提问来源于stack exchange,提问作者Paul Muaddib
相关产品推荐
相关产品推荐

