Laden...

Arbeiten mit Shared String Tables in Excel

Erstellt von MrSparkle vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.964 Views
MrSparkle Themenstarter:in
5.658 Beiträge seit 2006
vor 9 Jahren
Arbeiten mit Shared String Tables in Excel

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

R
100 Beiträge seit 2009
vor 9 Jahren

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;