1

我正在使用 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 标记行 string[] wsHdrs = hdrs.ToArray(); 中的 hdrs 变量。消息是:“ExcelRange”不包含“ToArray”的定义,并且最佳扩展方法重载“Enumerable.ToArray(IEnumerable)”需要“IEnumerable”类型的接收器。

我已经玩过上述代码的任意数量的变体,但是,如果我找到了正确的语法,我就不会发布这个问题。

任何帮助,将不胜感激!

4

1 回答 1

2

ExcelRange具有ExcelRangeBase作为声明的基类列表:

public class ExcelRangeBase : ExcelAddress, IExcelCell, IDisposable, IEnumerable<ExcelRangeBase>, IEnumerator<ExcelRangeBase>
{
....
}

因此,您正在尝试使用 Linq 进行隐式IEnumerable<ExcelRangeBase>转换String[],这将不起作用。您需要使用 aSelect来获取Value每个范围对象的属性。由于每个Value属性都是类型Object,你需要调用它的ToString()方法:

string[] wsHdrs = hdrs
    .Select(erb => erb.Value.ToString())
    .ToArray();

以上将为您提供您正在寻找的字符串数组,但请记住,您正在丢失信息,因为Value可能是数字类型和字符串的混合。如果您只对打印他们的内容感兴趣,那么这不是问题。如果您打算以某种方式将它们写回以使其表现出色,那么您将所有内容都作为字符串。

于 2016-11-19T15:04:46.620 回答