Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um die Werte von Zellen in einem Tabellenkalkulationsdokument programmgesteuert abzurufen. Sie enthält eine Beispielmethode GetCellValue
zur Veranschaulichung dieser Aufgabe.
GetCellValue-Methode
Sie können die GetCellValue
-Methode verwenden, um den Wert einer Zelle in einer Arbeitsmappe abzurufen. Die Methode erfordert die folgenden drei Parameter:
Eine Zeichenfolge, die den Namen des zu überprüfenden Dokuments enthält.
Eine Zeichenfolge, die den Namen des zu überprüfenden Blatts enthält.
Eine Zeichenfolge, die die Zelladresse (z. B. A1, B12) enthält, aus der ein Wert abgerufen wird.
Die Methode gibt den Wert der angegebenen Zelle zurück, wenn sie gefunden werden konnte. Im folgenden Codebeispiel ist die Signatur der Methode dargestellt.
static string GetCellValue(string fileName, string sheetName, string addressName)
Funktionsweise des Codes
Der Code beginnt mit dem Erstellen einer Variablen für den Rückgabewert, und initialisiert sie bei Null.
string? value = null;
Zugreifen auf die Zelle
Als Nächstes öffnet der Code das Dokument mithilfe der Open -Methode, die angibt, dass das Dokument für den schreibgeschützten Zugriff geöffnet sein soll (der letzte false
Parameter). Als Nächstes ruft der Code mithilfe der -Eigenschaft des Dokuments einen Verweis auf den WorkbookPart Arbeitsmappenteil ab.
// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
// Retrieve a reference to the workbook part.
WorkbookPart? wbPart = document.WorkbookPart;
Um die angeforderte Zelle zu suchen, muss der Code zuerst einen Verweis auf das Blatt abrufen, der den Namen enthält. Der Code muss alle Blatttyp-Nachfolger des Arbeitsmappenelements des Arbeitsmappenteils durchsuchen und die Name -Eigenschaft jedes gefundenen Blatts untersuchen. Beachten Sie, dass bei dieser Suche die Beziehungen der Arbeitsmappe durchsucht werden und kein tatsächliches Blatt gefunden wird. Es findet einen Verweis auf einen Sheet, der Informationen wie den Namen und Id das Blatt enthält. Die einfachste Möglichkeit hierfür ist die Verwendung einer LINQ-Abfrage, wie im folgenden Beispiel gezeigt.
// Find the sheet with the supplied name, and then use that
// Sheet object to retrieve a reference to the first worksheet.
Sheet? theSheet = wbPart?.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
// Throw an exception if there is no sheet.
if (theSheet is null || theSheet.Id is null)
{
throw new ArgumentException("sheetName");
}
Beachten Sie, dass die FirstOrDefault Methode entweder den ersten übereinstimmenden Verweis (in diesem Fall ein Blatt) oder einen NULL-Verweis zurückgibt, wenn keine Übereinstimmung gefunden wurde. Der Code sucht nach dem NULL-Verweis und löst eine Ausnahme aus, wenn Sie einen ungültigen Blattnamen übergeben haben. Da Sie nun Informationen über das Blatt haben, muss der Code einen Verweis zu dem entsprechenden Teil des Arbeitsblatts abrufen. Die bereits abgerufenen Blattinformationen stellen eine Id -Eigenschaft bereit, und angesichts dieser Id-Eigenschaft kann der Code einen Verweis auf die entsprechende WorksheetPart abrufen, indem die Arbeitsmappenteilmethode GetPartById aufgerufen wird.
// Retrieve a reference to the worksheet part.
WorksheetPart wsPart = (WorksheetPart)wbPart!.GetPartById(theSheet.Id!);
Genau wie beim Suchen des benannten Blatts verwendet der Code beim Suchen der benannten Zelle die Descendants -Methode und sucht nach der ersten Übereinstimmung, in der die CellReference Eigenschaft dem angegebenen entspricht.
addressName
Parameter. Nach diesem Methodenaufruf enthält die Variable mit dem Namen theCell
entweder einen Verweis auf die Zelle oder einen NULL-Verweis.
// Use its Worksheet property to get a reference to the cell
// whose address matches the address you supplied.
Cell? theCell = wsPart.Worksheet?.Descendants<Cell>()?.Where(c => c.CellReference == addressName).FirstOrDefault();
Abrufen des Werts
An diesem Punkt enthält die Variable mit dem Namen theCell
entweder einen NULL-Verweis oder einen Verweis auf die angeforderte Zelle. Wenn Sie den Open XML-Inhalt (d. h theCell.OuterXml
. ) für die Zelle untersuchen, finden Sie XML wie den folgenden.
<x:c r="A1">
<x:v>12.345000000000001</x:v>
</x:c>
Die InnerText -Eigenschaft enthält den Inhalt für die Zelle, sodass der nächste Codeblock diesen Wert abruft.
// If the cell does not exist, return an empty string.
if (theCell is null || theCell.InnerText.Length < 0)
{
return string.Empty;
}
value = theCell.InnerText;
Nun muss die Beispielmethode den Wert interpretieren. Dabei werden vom Code Zahlen- und Datumswerte sowie Zeichenfolgen und boolesche Werte verarbeitet. Sie können das Beispiel bei Bedarf erweitern. Der Cell Typ stellt eine DataType Eigenschaft bereit, die den Typ der Daten in der Zelle angibt. Der Wert der DataType
-Eigenschaft ist null für numerische Typen und Datumstypen. Sie enthält den Wert CellValues.SharedString
für Zeichenfolgen und CellValues.Boolean
für boolesche Werte. Wenn die DataType
Eigenschaft NULL ist, gibt der Code den Wert der Zelle zurück (es ist ein numerischer Wert). Andernfalls setzt der Code den Vorgang durch Verzweigen anhand des Datentyps fort.
// If the cell represents an integer number, you are done.
// For dates, this code returns the serialized value that
// represents the date. The code handles strings and
// Booleans individually. For shared strings, the code
// looks up the corresponding value in the shared string
// table. For Booleans, the code converts the value into
// the words TRUE or FALSE.
if (theCell.DataType is not null)
{
if (theCell.DataType.Value == CellValues.SharedString)
{
Wenn die DataType
-Eigenschaft enthält CellValues.SharedString
, muss der Code einen Verweis auf die einzelne SharedStringTablePartabrufen.
// For shared strings, look up the value in the
// shared strings table.
var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
Wenn die Zeichenfolgentabelle als Nächstes vorhanden ist (und wenn dies nicht der Fall ist, ist die Arbeitsmappe beschädigt, und der Beispielcode gibt den Index in die Zeichenfolgentabelle anstelle der Zeichenfolge selbst zurück), gibt der Code die InnerText
-Eigenschaft des Elements zurück, das er am angegebenen Index findet (zuerst wird die Value-Eigenschaft in eine ganze Zahl konvertiert).
// If the shared string table is missing, something
// is wrong. Return the index that is in
// the cell. Otherwise, look up the correct text in
// the table.
if (stringTable is not null)
{
value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
}
Wenn die DataType
-Eigenschaft enthält CellValues.Boolean
, konvertiert der Code die im Zellwert gefundene 0 oder 1 in die entsprechende Textzeichenfolge.
switch (value)
{
case "0":
value = "FALSE";
break;
default:
value = "TRUE";
break;
}
Schließlich gibt die Prozedur die Variable value
zurück, die die angeforderten Informationen enthält.
Beispielcode
Im Folgenden finden Sie das vollständige GetCellValue
Codebeispiel in C# und Visual Basic.
static string GetCellValue(string fileName, string sheetName, string addressName)
{
string? value = null;
// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
// Retrieve a reference to the workbook part.
WorkbookPart? wbPart = document.WorkbookPart;
// Find the sheet with the supplied name, and then use that
// Sheet object to retrieve a reference to the first worksheet.
Sheet? theSheet = wbPart?.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
// Throw an exception if there is no sheet.
if (theSheet is null || theSheet.Id is null)
{
throw new ArgumentException("sheetName");
}
// Retrieve a reference to the worksheet part.
WorksheetPart wsPart = (WorksheetPart)wbPart!.GetPartById(theSheet.Id!);
// Use its Worksheet property to get a reference to the cell
// whose address matches the address you supplied.
Cell? theCell = wsPart.Worksheet?.Descendants<Cell>()?.Where(c => c.CellReference == addressName).FirstOrDefault();
// If the cell does not exist, return an empty string.
if (theCell is null || theCell.InnerText.Length < 0)
{
return string.Empty;
}
value = theCell.InnerText;
// If the cell represents an integer number, you are done.
// For dates, this code returns the serialized value that
// represents the date. The code handles strings and
// Booleans individually. For shared strings, the code
// looks up the corresponding value in the shared string
// table. For Booleans, the code converts the value into
// the words TRUE or FALSE.
if (theCell.DataType is not null)
{
if (theCell.DataType.Value == CellValues.SharedString)
{
// For shared strings, look up the value in the
// shared strings table.
var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
// If the shared string table is missing, something
// is wrong. Return the index that is in
// the cell. Otherwise, look up the correct text in
// the table.
if (stringTable is not null)
{
value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
}
}
else if (theCell.DataType.Value == CellValues.Boolean)
{
switch (value)
{
case "0":
value = "FALSE";
break;
default:
value = "TRUE";
break;
}
}
}
}
return value;
}