我正在使用EPPlus,似乎无法获得ToArray<>工作方法。我试图在工作表中提取列标题的字符串变量数组。
我的代码......
public static string[] GetWshHeaders(string WbkNm)
{
using (ExcelPackage package = new ExcelPackage(new FileInfo(WbkNm)))
{
ExcelWorksheet wsData = package.Workbook.Worksheets.First();
int noHdrs = wsData.Dimension.Columns;
ExcelRange hdrs = wsData.Cells[1, 1, 1, noHdrs];
string[] wsHdrs = hdrs.ToArray<string>();
return wsHdrs;
}
}
Intellisense标记行字符串[]中的hdrs变量wsHdrs = hdrs.ToArray();.消息是:&#39; ExcelRange&#39;不包含ToArray&#39;的定义和最好的扩展方法重载&#39; Enumerable.ToArray(IEnumerable)&#39;需要一个类型为“IEnumerable”的接收器。
我已经使用了上述代码的任意数量的变体,但是,如果我找到了正确的语法,我就不会发布这个问题。
任何帮助将不胜感激!
答案 0 :(得分:1)
ExcelRange
将ExcelRangeBase
作为基类,声明列表如下:
public class ExcelRangeBase : ExcelAddress, IExcelCell, IDisposable, IEnumerable<ExcelRangeBase>, IEnumerator<ExcelRangeBase>
{
....
}
因此,您尝试使用Linq进行从IEnumerable<ExcelRangeBase>
到String[]
的隐式转换,这将无效。您需要使用Select
来获取每个范围对象的Value
属性。由于每个Value
属性的类型为Object
,因此您需要调用其ToString()
方法:
string[] wsHdrs = hdrs
.Select(erb => erb.Value.ToString())
.ToArray();
上面将为您提供您正在寻找的字符串数组,但请记住,您正在丢失信息,因为Value
可以是数字类型和字符串的混合。如果您只对打印内容感兴趣,则不成问题。如果你打算以某种方式将它们写回来,那么你将把所有东西都当作字符串。