दूसरा उत्तर मेटा-उत्तर की तरह लग रहा था। मैं इसके साथ संघर्ष कर रहा हूं क्योंकि 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 को सुधार के लिए()।
@ ओटाकू, मुझे जांच करने का मौका नहीं मिला है, लेकिन आपके द्वारा दिए गए लिंक पर एक त्वरित नज़र से पता चलता है कि वे काफी मूल्यवान होंगे और संभवतः मेरे प्रश्न का उत्तर दें। धन्यवाद। – ProfK
क्या आपके पास अभी तक इसकी जांच करने का मौका है? अगर मैं किसी और मदद की हो तो मुझे बताएं। –
हां, @ ओटाकू, धन्यवाद। "LINQ का उपयोग करना" लेख बहुत उपयोगी था, हालांकि मैं कुछ भी नहीं कर रहा हूं, यह पंक्तियों और कोशिकाओं को फिर से जोड़ने के अलावा करता है, लेकिन यह दिखाता है कि शीट तक कैसे पहुंचे। – ProfK