2010-04-12 8 views
14

मुझे ओपन एक्सएमएल एसडीके 2.0 का उपयोग कर Excel 2007 कार्यपुस्तिका में एक वर्कशीट से डेटा पढ़ने की आवश्यकता है। मैंने ऐसा करने के लिए बुनियादी दिशानिर्देशों की तलाश में काफी समय बिताया है, लेकिन मुझे केवल स्प्रेडशीट बनाने में सहायता मिली है।ओपनएक्सएमएल प्रारूप एसडीके का उपयोग करके मैं स्प्रेडशीट से डेटा कैसे पढ़ूं?

मैं वर्कशीट में पंक्तियों को फिर से कैसे चला सकता हूं और फिर इस एसडीके का उपयोग करके प्रत्येक पंक्ति में कोशिकाओं को फिर से सक्रिय कर सकता हूं?

+0

@ ओटाकू, मुझे जांच करने का मौका नहीं मिला है, लेकिन आपके द्वारा दिए गए लिंक पर एक त्वरित नज़र से पता चलता है कि वे काफी मूल्यवान होंगे और संभवतः मेरे प्रश्न का उत्तर दें। धन्यवाद। – ProfK

+0

क्या आपके पास अभी तक इसकी जांच करने का मौका है? अगर मैं किसी और मदद की हो तो मुझे बताएं। –

+0

हां, @ ओटाकू, धन्यवाद। "LINQ का उपयोग करना" लेख बहुत उपयोगी था, हालांकि मैं कुछ भी नहीं कर रहा हूं, यह पंक्तियों और कोशिकाओं को फिर से जोड़ने के अलावा करता है, लेकिन यह दिखाता है कि शीट तक कैसे पहुंचे। – ProfK

उत्तर

11

जिस तरह से मैं यह करता हूं लिंक के साथ है। इस विषय पर एसडीके का उपयोग करने के लिए बस शुद्ध ओपन एक्सएमएल (कोई एसडीके) के साथ जाने के लिए बहुत सारे नमूने हैं। पर एक नज़र डालें:

+0

हे टोड, क्या आप मेरी मदद कर सकते हैं। मुझे निम्नलिखित में कोई समस्या है: http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell अग्रिम धन्यवाद - नाइट –

+0

@NatePet, इस बारे में खेद है, मैं सब नहीं हूं जो एक्सेल से परिचित है, इसलिए शायद मुझे आपके लिए जवाब तलाशने में बहुत लंबा लगेगा। –

27

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

public void ExcelDocTest() 
{ 
    Debug.WriteLine("Running through sheet."); 
    int rowsComplete = 0; 

    using (SpreadsheetDocument spreadsheetDocument = 
        SpreadsheetDocument.Open(@"path\to\Spreadsheet.xlsx", false)) 
    { 
     WorkbookPart workBookPart = spreadsheetDocument.WorkbookPart; 

     foreach (Sheet s in workBookPart.Workbook.Descendants<Sheet>()) 
     { 
      WorksheetPart wsPart = workBookPart.GetPartById(s.Id) as WorksheetPart; 
      Debug.WriteLine("Worksheet {1}:{2} - id({0}) {3}", s.Id, s.SheetId, s.Name, 
       wsPart == null ? "NOT FOUND!" : "found."); 

      if (wsPart == null) 
      { 
       continue; 
      } 

      Row[] rows = wsPart.Worksheet.Descendants<Row>().ToArray(); 

      //assumes the first row contains column names 
      foreach (Row row in wsPart.Worksheet.Descendants<Row>()) 
      { 
       rowsComplete++; 

       bool emptyRow = true; 
       List<object> rowData = new List<object>(); 
       string value; 

       foreach (Cell c in row.Elements<Cell>()) 
       { 
        value = GetCellValue(c); 
        emptyRow = emptyRow && string.IsNullOrWhiteSpace(value); 
        rowData.Add(value); 
       } 

       Debug.WriteLine("Row {0}: {1}", row, 
        emptyRow ? "EMPTY!" : string.Join(", ", rowData)); 
      } 
     } 

    } 
    Debug.WriteLine("Done, processed {0} rows.", rowsComplete); 
} 

public static string GetCellValue(Cell cell) 
{ 
    if (cell == null) 
     return null; 
    if (cell.DataType == null) 
     return cell.InnerText; 

    string value = cell.InnerText; 
    switch (cell.DataType.Value) 
    { 
     case CellValues.SharedString: 
      // For shared strings, look up the value in the shared strings table. 
      // Get worksheet from cell 
      OpenXmlElement parent = cell.Parent; 
      while (parent.Parent != null && parent.Parent != parent 
        && string.Compare(parent.LocalName, "worksheet", true) != 0) 
      { 
       parent = parent.Parent; 
      } 
      if (string.Compare(parent.LocalName, "worksheet", true) != 0) 
      { 
       throw new Exception("Unable to find parent worksheet."); 
      } 

      Worksheet ws = parent as Worksheet; 
      SpreadsheetDocument ssDoc = ws.WorksheetPart.OpenXmlPackage as SpreadsheetDocument; 
      SharedStringTablePart sstPart = ssDoc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); 

      // lookup value in shared string table 
      if (sstPart != null && sstPart.SharedStringTable != null) 
      { 
       value = sstPart.SharedStringTable.ElementAt(int.Parse(value)).InnerText; 
      } 
      break; 

     //this case within a case is copied from msdn. 
     case CellValues.Boolean: 
      switch (value) 
      { 
       case "0": 
        value = "FALSE"; 
        break; 
       default: 
        value = "TRUE"; 
        break; 
      } 
      break; 
    } 
    return value; 
} 

संपादित करें: धन्यवाद @Nitin-Jadhav GetCellValue को सुधार के लिए()।

+0

हाय, क्या आप मेरी मदद कर सकते हैं। मुझे http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell –

+0

के साथ समस्या हो रही है। धन्यवाद। –

+0

बहुत अच्छा उदाहरण, जो वास्तव में काम करता है, धन्यवाद! – berliner

संबंधित मुद्दे