2014-06-04 11 views
7

Ich bin in der ungewöhnlichen Position, zwei verschiedene Vorlagen für einen Excel-Upload zu haben, einen, der "benutzerfreundlich" ist und einen, der maschinell erzeugt wird. Daher sind die Spalten-Datenheader unterschiedlich und es ist schwierig, sie auszurichten.Referenzieren von Spalten in LinqToExcel mit Ordinalposition

Als solche möchte ich auf die Spaltenzuordnungen verweisen, die die Ordinalposition und nicht den 'Namen' der Spalte verwenden. Im Moment habe ich dies:

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"); 

und ich möchte so etwas tun:

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"); 

wo die Buchstaben die Spaltenreferenzen in Excel sind.

Gibt es eine Möglichkeit, dies zu tun?

Antwort

9

sein, wenn Sie die gleiche Reihenfolge ist Sie

 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]); 
+0

Dies ist die, die ich tatsächlich am Ende verwendet, weil es so nah an meinem ursprünglichen Code war. Sie können jedoch keine Indexer mit generischen IEnumerables verwenden. Ich brauchte spaltennamen.ElementAt (1) –

+2

@BillSempf Ich weiß, dass ich zu spät komme, aber um das 'ElementAt()' Problem zu lösen, können Sie immer einen Aufruf von 'ToList()' direkt danach 'GetColumnNames() 'Nein? –

1

Von dem, was ich sehe, haben Sie eine 1 zu 1 Zuordnung zwischen dem menschenfreundlichen Spaltennamen und dem Ordnungsbuchstaben. Mein Vorschlag ist, eine Dictionary<string,string> zu implementieren, wobei der Schlüssel der Name der Spalte und der Wert der Spaltenbuchstabe in Excel ist. Natürlich muss das Wörterbuch nur einmal initialisiert werden, also vielleicht durch ein Singleton oder als statisches Readonly-Objekt.

//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"); 

Dann würde Ihr Anruf

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"]); 
6

Mit der WorksheetNoHeader Methode aufrufen kann, ist, was Sie suchen. Hier ist ein Codebeispiel:

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); 
} 
+0

Genau das habe ich gesucht, danke! –

Verwandte Themen