使用顺序位置引用LinqToExcel中的列

本文关键字:LinqToExcel 引用 顺序 位置 | 更新日期: 2023-09-27 18:06:59

我处于一个不寻常的位置,有两个不同的Excel上传模板,一个是"人类友好"的,一个是机器生成的。因此,列数据标题是不同的,很难对齐它们。

因此,我希望使用顺序位置而不是列的"名称"来引用列映射。目前我有这个:
var excel = new ExcelQueryFactory(excelFileName);
excel.AddMapping<Student>(x => x.FirstName, "First Name");
excel.AddMapping<Student>(x => x.LastName, "Last Name");
excel.AddMapping<Student>(x => x.LastFour, "Last 4 Student ID");
excel.AddMapping<Student>(x => x.LastDate, "Last Date");

,我想这样做:

var excel = new ExcelQueryFactory(excelFileName);
excel.AddMapping<Student>(x => x.FirstName, "A");
excel.AddMapping<Student>(x => x.LastName, "C");
excel.AddMapping<Student>(x => x.LastFour, "G");
excel.AddMapping<Student>(x => x.LastDate, "H");

,其中字母是Excel中的列引用。

有办法做到这一点吗?

使用顺序位置引用LinqToExcel中的列

如果您的订单是相同的,您可以调用

        var columnnames= excel.GetColumnNames("worksheetName");
        excel.AddMapping<Student>(x => x.FirstName, columnnames[0]);
        excel.AddMapping<Student>(x => x.FirstName, columnnames[1]);
        excel.AddMapping<Student>(x => x.LastFour, columnnames[2]);

使用WorksheetNoHeader方法是您正在寻找的。下面是一个代码示例:

var students = new List<Student>();
var excel = new ExcelQueryFactory("excelFileName");
var rows = excel.WorksheetNoHeader().ToList();
//Skip the first row since it's the header
for (int rowIndex = 1; i < rows.Count; rowIndex++)
{
  var row = rows[rowIndex];
  var student = new Student();
  // row[0] refers to the value in the first column of the row
  student.FirstName = row[0];
  student.LastName = row[1];
  student.LastFour = row[2];
  student.LastDate = row[3];
  students.Add(student);
}

从我所看到的,您在人类友好的列名和序数字母之间有一个1对1的映射。我的建议是尝试实现Dictionary<string,string>,其中键是列的名称,值是Excel中的列字母。当然,字典只需要初始化一次,因此可以通过单例初始化,也可以作为静态只读对象初始化。

//Initialize dictionary
Dictionary<string,string> columnHeaders=new Dictionary<string,string>();
columnHeaders.Add("First Name", "A");
columnHeaders.Add("Last Name", "C");
columnHeaders.Add("Last 4 Student ID", "G");
columnHeaders.Add("Last Date", "H");

那么你的呼叫将是

var excel = new ExcelQueryFactory(excelFileName);
excel.AddMapping<Student>(x => x.FirstName, columnHeaders["First Name"]);
excel.AddMapping<Student>(x => x.LastName, columnHeaders["Last Name"]);
excel.AddMapping<Student>(x => x.LastFour, columnHeaders["Last 4 Student ID"]);
excel.AddMapping<Student>(x => x.LastDate, columnHeaders["Last Date"]);