Hallo allerseits,
ich lese eine Excel-Mappe mit Hilfe des OpenXML-SDK ein. Unter anderem möchte ich die Werte von bestimmten Zellen auslesen. Das funktioniert in etwa so:
using (SpreadsheetDocument document = SpreadsheetDocument.Open(stream, true))
{
Sheet sheet = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().GetFirstChild<Sheet>();
string relationshipId = sheet.Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId);
Worksheet worksheet = worksheetPart.Worksheet;
SheetData sheetdata = worksheet.GetFirstChild<SheetData>();
Row row = sheet.Elements<Row>().Single(r => r.RowIndex == rowIndex);
Cell cell = row.Elements<Cell>().Single(c => string.Compare(c.CellReference.Value, columnName + rowIndex, true) == 0);
string result = cell.CellValue.Text;
}
Excel verwendet aber intern Shared String Tables, daher repräsentiert cell.CellValue.Text
nur einen Index auf die String-Tabelle und cell.DataType
ist CellValues.SharedString
.
Kurz gefragt: Wie finde ich die richtige Shared String Table im Dokument?
Ich verwende wie gesagt den OpenXML-SDK 2.5 (Namespace: DocumentFormat.OpenXml.Spreadsheet), aber EPPlus wäre auch eine mögliche Variante.
Danke schonmal,
Christian
Weeks of programming can save you hours of planning
Ich habe folgenden Code in my alten Projekt gefunden. Das war mein private Projekt und ich habe damit seit Jahre lange nichts zu tun. Ich habe jetzt keine Ahnung über Struktur von OpenXML. 😄. Frag mich lieber nicht wieso der Code so sein muss. 😁
private string GetCellValue(Cell cell)
{
try
{
string value = "";
if (cell.CellFormula != null && cell.CellFormula.Text != "")
{
string formulaText = cell.CellFormula.Text;
if (formulaText.ToUpper() == "TODAY()")
value = DateTime.Now.ToShortDateString();
else
value = cell.CellValue.Text;
}
else
{
value = cell.InnerText;
}
if (cell.DataType != null)
{
switch (cell.DataType.Value)
{
case CellValues.SharedString:
if (sharedStringTable != null)
{
value = ((SharedStringItem)sharedStringTable.ElementAt(int.Parse(value))).InnerText;
}
break;
case CellValues.Boolean:
switch (value)
{
case "0":
value = "FALSE";
break;
default:
value = "TRUE";
break;
}
break;
}
}
return value;
}
catch (Exception ex)
{
throw ex;
}
}
sharedStringTable ist von SharedStringTablePart gesetzt
sharedStringTable = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault().SharedStringTable;