2010-03-16 5 views
5

मेरे पास एक एक्सेल स्प्रैडशीट है जो नेटवर्क शेयर ड्राइव पर बैठेगी। इसे मेरे विनफॉर्म सी # 3.0 एप्लिकेशन द्वारा एक्सेस किया जाना चाहिए (कई उपयोगकर्ता ऐप का उपयोग कर सकते हैं और एक ही समय में इस स्प्रेडशीट को मार सकते हैं)। एक वर्कशीट पर बहुत सारे डेटा हैं। यह डेटा उन क्षेत्रों में विभाजित है जिन्हें मैंने श्रेणी के रूप में नामित किया है। मुझे व्यक्तिगत रूप से इन श्रेणियों तक पहुंचने में सक्षम होना चाहिए, प्रत्येक श्रेणी को डेटासेट के रूप में वापस करने की आवश्यकता है, और उसके बाद इसे ग्रिड में बांधें।एक्सेल रेंज को ADO.NET डेटासेट या डेटाटेबल, आदि में कनवर्ट करें

मुझे ऐसे उदाहरण मिले हैं जो ओएलई का उपयोग करते हैं और इन्हें काम करने के लिए मिला है। हालांकि, मैंने इस विधि का उपयोग करने के बारे में कुछ चेतावनियां देखी हैं, साथ ही काम पर हम माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल का उपयोग मानक के रूप में अब तक कर रहे हैं। जब तक मुझे नहीं करना है, मैं वास्तव में इससे भटकना नहीं चाहता हूं। जहां तक ​​मुझे पता है, हमारे उपयोगकर्ता Office 2003 का उपयोग करेंगे।

मैं सीमा मैं निम्नलिखित कोड के साथ की जरूरत है प्राप्त कर सकते हैं:

MyDataRange = (Microsoft.Office.Interop.Excel.Range) 
    MyWorkSheet.get_Range("MyExcelRange", Type.Missing); 

OLE तरह से अच्छा के रूप में यह मेरी पहली पंक्ति लेने के लिए और स्तंभों के रूप में करना होता था। मेरी श्रेणियां (12 कुल) कॉलम की संख्या में एक-दूसरे से अलग-अलग हिस्से के लिए हैं। पता नहीं था कि यह जानकारी किसी भी सिफारिश को प्रभावित करेगी या नहीं।

क्या इंटरऑप का उपयोग करने और वापस लौटने की रेंज को डेटासेट में वापस लाने का कोई तरीका है?

उत्तर

2

मैं निर्मित एक समारोह के बारे में पता नहीं है, लेकिन यह यह अपने आप को लिखने के लिए मुश्किल नहीं होना चाहिए। स्यूडोकोड:

DataTable MakeTableFromRange(Range range) 
{ 
    table = new DataTable 
    for every column in range 
    { 
     add new column to table 
    } 
    for every row in range 
    { 
     add new datarow to table 
     for every column in range 
     { 
     table.cells[column, row].value = range[column, row].value 
     } 
    } 
    return table 
} 
+0

मैं सभी प्रतिक्रियाओं की सराहना करता हूं। चूंकि मुझे अंतर्निहित कुछ भी नहीं मिला, इसलिए मैं आगे बढ़ गया और बस सीमा के माध्यम से घुमाया और एक टिकाऊ ऑन-द-फ्लाई बनाया। यहां सूचीबद्ध सभी सुझाव वास्तव में काम करेंगे, यह सिर्फ इतना है कि मैं ओएलईडीबी का उपयोग नहीं करना चाहता था और मैं इस बिंदु पर तीसरी पार्टी लाइब्रेरी नहीं ला सकता हूं। आपके तेज प्रतिक्रियाओं के लिए धन्यवाद। बहुत सराहना की। – user295197

+0

यह छद्म कोड है ... –

0

एक्सेल 2003 एक्सएलएस फ़ाइलों को पढ़ने/लिखने के लिए NPOI पर एक नज़र डालना उचित है। एनपीओआई एक जीवन बचतकर्ता है।

मुझे लगता है कि आपको अपनी रेंज को फिर से चालू करना होगा और डेटाटेबल को अपने डेटाटेबल में डालना होगा।

StackOverflow पर यह सवाल अधिक संसाधन उपलब्ध कराता है:

Create Excel (.XLS and .XLSX) file from C#

+0

मैं भविष्य की परियोजनाओं के लिए यह ध्यान में रखना होगा। अभी तक मैं अपने आवेदन में एक नई पुस्तकालय पेश नहीं कर सकता। – user295197

2

मैं किस प्रकार का डेटा आप एक एक्सेल डेटा के लिए have.But इस लिंक http://www.freeimagehosting.net/image.php?f8d4ef4173.png में दिखाया गया है की तरह पता नहीं है, तो आप डेटा तालिका में लोड करने के लिए निम्नलिखित कोड का उपयोग कर सकते हैं।

private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     {   
      DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$"); 
      dataGridView1.DataSource = sheetTable; 
     } 
     catch (Exception Ex) 
     { 
      MessageBox.Show(Ex.Message, ""); 
     } 
    }   

    private OleDbConnection returnConnection(string fileName) 
    { 
     return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""); 
    } 

    private DataTable loadSingleSheet(string fileName, string sheetName) 
    {   
     DataTable sheetData = new DataTable(); 
     using (OleDbConnection conn = this.returnConnection(fileName)) 
     { 
      conn.Open(); 
      // retrieve the data using data adapter 
      OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); 
      sheetAdapter.Fill(sheetData); 
     }       
     return sheetData; 
    } 
+2

कोड की सराहना करें और ओएलडीडीबी निश्चित रूप से इसे आसान बनाता है, लेकिन मुझे अब एक्सेल इंटरऑप के साथ रहना होगा। – user295197

0

यह विधि अच्छी तरह से काम नहीं करती है जब एक्सेल स्प्रेड शीट में एक ही कॉलम में टेक्स्ट और संख्या दोनों होते हैं। उदाहरण के लिए, यदि Range("A3")=Hello और Range("A7")=5 तो यह केवल नमस्ते और Range("A7") के लिए मूल्य पढ़ता DBNULL

private void Form1_Load(object sender, EventArgs e) 
{ 
    try 
    {   
     DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$"); 
     dataGridView1.DataSource = sheetTable; 
    } 
    catch (Exception Ex) 
    { 
     MessageBox.Show(Ex.Message, ""); 
    } 
}   

private OleDbConnection returnConnection(string fileName) 
{ 
    return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""); 
} 

private DataTable loadSingleSheet(string fileName, string sheetName) 
{   
    DataTable sheetData = new DataTable(); 
    using (OleDbConnection conn = this.returnConnection(fileName)) 
    { 
     conn.Open(); 
     // retrieve the data using data adapter 
     OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); 
     sheetAdapter.Fill(sheetData); 
    }       
    return sheetData; 
संबंधित मुद्दे