Récupérer un dictionnaire de toutes les plages nommées dans un document de feuille de calcul
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin de récupérer par programmation un dictionnaire qui contient les noms et les plages de tous les noms définis dans un classeur Microsoft Excel. Il contient un exemple de méthode GetDefinedNames pour illustrer cette tâche.
GetDefinedNames, méthode
La méthode GetDefinedNames accepte un paramètre unique qui indique le nom du document à partir duquel récupérer les noms définis. La méthode retourne un Dictionary<TKey,TValue> instance qui contient des informations sur les noms définis dans le classeur spécifié, qui peut être vide s’il n’y a pas de noms définis.
Fonctionnement du code
Le code ouvre le document de feuille de calcul à l’aide de la méthode Open , ce qui indique que le document doit être ouvert pour un accès en lecture seule avec le paramètre false final. Étant donné que le classeur est ouvert, le code utilise la propriété WorkbookPart pour accéder au composant classeur main. Le code stocke cette référence dans une variable nommée wbPart.
// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
// Retrieve a reference to the workbook part.
var wbPart = document.WorkbookPart;
Récupération des noms définis
Compte tenu de la partie classeur, l’étape suivante est simple. Le code utilise la propriété Workbook du composant classeur pour récupérer une référence au contenu du classeur, puis récupère la collection DefinedNames fournie par le Kit de développement logiciel (SDK) Open XML. Cette propriété retourne une collection de tous les noms définis contenus dans le classeur. Si la propriété retourne une valeur non null, le code effectue ensuite une itération au sein de la collection, en récupérant des informations sur chaque partie nommée et en ajoutant le nom de clé) et la valeur (description de la plage) au dictionnaire pour chaque nom défini.
// Retrieve a reference to the defined names collection.
DefinedNames? definedNames = wbPart?.Workbook?.DefinedNames;
// If there are defined names, add them to the dictionary.
if (definedNames is not null)
{
foreach (DefinedName dn in definedNames)
{
if (dn?.Name?.Value is not null && dn?.Text is not null)
{
returnValue.Add(dn.Name.Value, dn.Text);
}
}
}
Exemple de code
Voici l’exemple de code GetDefinedNames complet en C# et Visual Basic.
static Dictionary<String, String>GetDefinedNames(String fileName)
{
// Given a workbook name, return a dictionary of defined names.
// The pairs include the range name and a string representing the range.
var returnValue = new Dictionary<String, String>();
// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
// Retrieve a reference to the workbook part.
var wbPart = document.WorkbookPart;
// Retrieve a reference to the defined names collection.
DefinedNames? definedNames = wbPart?.Workbook?.DefinedNames;
// If there are defined names, add them to the dictionary.
if (definedNames is not null)
{
foreach (DefinedName dn in definedNames)
{
if (dn?.Name?.Value is not null && dn?.Text is not null)
{
returnValue.Add(dn.Name.Value, dn.Text);
}
}
}
}
return returnValue;
}