2014-06-04 4 views
7

का उपयोग कर लिंकटोएक्ससेल में कॉलम का संदर्भ देना, मैं एक्सेल अपलोड के लिए दो अलग-अलग टेम्पलेट्स रखने की असामान्य स्थिति में हूं, जो कि 'मानव मित्रवत' है और जो मशीन उत्पन्न होता है। इस प्रकार, कॉलम डेटा हेडर अलग हैं और उन्हें संरेखित करना मुश्किल है।टर्मिनल स्थिति

इस प्रकार, मैं कॉलम के 'नाम' की बजाय क्रमिक स्थिति का उपयोग करके कॉलम मैपिंग का संदर्भ देना चाहता हूं। वर्तमान में मैं इस है:

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 में स्तंभ संदर्भ हैं।

क्या ऐसा करने का कोई तरीका है?

उत्तर

9

यदि आप आदेश एक ही है आप

 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

यह वही है जो मैं वास्तव में उपयोग कर समाप्त हुआ क्योंकि यह मेरे मूल कोड के बहुत करीब था। यद्यपि आप जेनेरिक आईनेमरेबल्स के साथ इंडेक्सर्स का उपयोग नहीं कर सकते हैं। मुझे कॉलमनाम का उपयोग करने की आवश्यकता है। एलीमेंटएट (1) –

+2

@ बिलस्पेप मुझे पता है कि मैं देर से आ रहा हूं, लेकिन 'एलिमेंट एट()' मुद्दा को हल करने के लिए आप हमेशा 'getLolumnNames()' के बाद 'toList()' पर कॉल कर सकते हैं। ', नहीं? –

1

जो मैं देखता हूं उससे, आपके पास मानव-अनुकूल कॉलम नाम और सामान्य पत्र के बीच 1 से 1 मैपिंग है। मेरा सुझाव Dictionary<string,string> को लागू करने का प्रयास करना है, जहां कुंजी कॉलम का नाम है और मान एक्सेल में कॉलम अक्षर है। बेशक, शब्दकोश को केवल एक बार शुरू किया जाना चाहिए, तो हो सकता है कि एक सिंगलटन के माध्यम से, या स्थिर रीडोनली ऑब्जेक्ट के रूप में।

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

कॉल कर सकते हैं का उपयोग करना 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); 
} 
+0

वही है जो मैं खोज रहा था, धन्यवाद! –