Partager via


Ouvrir un document de feuilles de calcul pour un accès en lecture seule

Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin d’ouvrir un document de feuille de calcul pour un accès en lecture seule par programme.


Quand ouvrir un document en lecture seule

Il arrive parfois que l’on souhaite ouvrir un document afin de l’inspecter ou de récupérer certaines informations, d’une manière qui garantit que ce document demeure inchangé. Dans ces cas-là, il faut ouvrir le document avec un accès en lecture seule. Cette rubrique de procédures décrit plusieurs manières d’ouvrir un document de feuilles de calcul en lecture seule par programme.


Obtenir un objet SpreadsheetDocument

Dans le Kit de développement logiciel (SDK) Open XML, la classe SpreadsheetDocument représente un package de document Excel. Pour créer un document Excel, créez une instance de la classe SpreadsheetDocument et remplissez-la de composants. Au minimum, le document doit avoir un composant classeur qui sert de conteneur pour le document, et au moins un composant feuille de calcul. Le texte est représenté dans le package au format XML à l’aide de balisage SpreadsheetML.

Pour créer l'instance de classe à partir du document, appelez l'une des méthodes de surcharge Open() . Plusieurs méthodes Open sont fournies, chacune avec une signature différente. Les méthodes qui permettent de spécifier si un document est modifiable sont répertoriées dans le tableau suivant.

Ouvrir Rubrique de Référence des bibliothèques de classes Description
Open(String, Boolean) Open(String, Boolean) Créer une instance de la classe SpreadsheetDocument à partir du fichier spécifié
Open(Stream, Boolean) Open(Stream, Boolean Créer une instance de la classe SpreadsheetDocument à partir du flux d’E/S spécifié
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) Créer une instance de la classe SpreadsheetDocument à partir du fichier spécifié
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) Créer une instance de la classe SpreadsheetDocument à partir du flux d’E/S spécifié

Le tableau présenté plus haut dans cette rubrique répertorie uniquement les méthodes Open qui acceptent une valeur booléenne comme second paramètre pour spécifier si un document est modifiable. Pour ouvrir un document pour un accès en lecture seule, spécifiez la valeur False pour ce paramètre.

Notez que deux des méthodes Open créent une instance de la classe SpreadsheetDocument en fonction d’une chaîne fournie comme premier paramètre. Le premier exemple de l'exemple de code utilise cette technique. Il fait appel à la première méthode Open du tableau ci-dessus, avec une signature qui requiert deux paramètres. Le premier paramètre prend une chaîne qui représente le nom du chemin d’accès complet à partir duquel ouvrir le document. Le second paramètre a la valeur true ou false. Cet exemple utilise false et indique que vous souhaitez ouvrir le fichier en lecture seule.

L'exemple de code suivant appelle la méthode Open.

// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))

Les deux autres méthodes Open créent une instance de la classe SpreadsheetDocument en fonction d’un flux d’entrée/sortie. Vous pouvez utiliser cette approche, par exemple, si vous avez une application Microsoft SharePoint Foundation 2010 qui utilise l’entrée/sortie de flux et que vous souhaitez utiliser le Kit de développement logiciel (SDK) Open XML pour travailler avec un document.

L'exemple de code suivant ouvre un document sur la base d'un flux.

// Open a SpreadsheetDocument based on a stream.
Stream stream = File.Open(filePath, FileMode.Open);

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))

Supposons que vous disposez d’une application qui utilise la prise en charge d’Open XML dans l’espace de noms System.IO.Packaging de la bibliothèque de classes .NET Framework, et que vous souhaitez utiliser le Kit de développement logiciel (SDK) Open XML pour travailler avec un package en lecture seule. Alors que le Kit de développement logiciel (SDK) Open XML inclut des surcharges de méthodes qui acceptent un package comme premier paramètre, il n’y en a pas qui prend un booléen comme deuxième paramètre pour indiquer si le document doit être ouvert pour modification.

La méthode recommandée consiste à ouvrir le package en lecture seule avant de créer l’instance de la classe SpreadsheetDocument, comme illustré dans le deuxième exemple de l’exemple de code. L'exemple de code suivant effectue cette opération.

// Open System.IO.Packaging.Package.
Package spreadsheetPackage = Package.Open(filePath, FileMode.Open, FileAccess.Read);

// Open a SpreadsheetDocument based on a package.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage))

Structure de document de base

La structure de base d’un document SpreadsheetML se compose des éléments Sheets et Sheet , qui référencent les feuilles de calcul dans le classeur. Un fichier XML distinct est créé pour chaque élément Worksheet. Par exemple, le document SpreadsheetML pour un classeur contenant deux feuilles de calcul nommées MySheet1 et MySheet2 est situé dans le fichier Workbook.xml, et se présente comme suit.

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <workbook xmlns=https://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships">
        <sheets>
            <sheet name="MySheet1" sheetId="1" r:id="rId1" /> 
            <sheet name="MySheet2" sheetId="2" r:id="rId2" /> 
        </sheets>
    </workbook>

Les fichiers XML de la feuille de calcul contiennent un ou plusieurs éléments de niveau bloc, tels que SheetData. sheetData représente le tableau de cellules et contient un ou plusieurs éléments Row (ligne). Un élément Row contient un ou plusieurs éléments Cell (cellule). Chaque cellule contient un élément CellValue qui représente la valeur de la cellule. Par exemple, le SpreadsheetML de la première feuille de calcul d’un classeur, qui possède uniquement la valeur 100 dans la cellule A1, se trouve dans le fichier Sheet1.xml et ressemble à ce qui suit.

    <?xml version="1.0" encoding="UTF-8" ?> 
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <sheetData>
            <row r="1">
                <c r="A1">
                    <v>100</v> 
                </c>
            </row>
        </sheetData>
    </worksheet>

À l’aide du Kit de développement logiciel (SDK) Open XML, vous pouvez créer une structure de document et du contenu qui utilisent des classes fortement typées qui correspondent à des éléments SpreadsheetML. Vous pouvez trouver ces classes dans l'espace de noms DocumentFormat.OpenXML.Spreadsheet. La table suivante répertorie les noms des classes qui correspondent aux éléments workbook, sheets, sheet, worksheet et sheetData.

Élément SpreadsheetML Classe du Kit de développement logiciel (SDK) Open XML Description
classeur DocumentFormat.OpenXml.Spreadsheet.Workbook Élément racine de la partie principale du document.
sheets DocumentFormat.OpenXml.Spreadsheet.Sheets Conteneur des structures de niveau bloc comme les éléments de feuille, fileVersion et autres spécifiés par la norme ISO/IEC 29500.
sheet DocumentFormat.OpenXml.Spreadsheet.Sheet Feuille qui pointe vers un fichier de définition de feuille.
feuille de calcul DocumentFormat.OpenXml.Spreadsheet.Worksheet Fichier de définition de feuille qui contient les données de la feuille.
sheetData DocumentFormat.OpenXml.Spreadsheet.SheetData Tableau de cellules, regroupées par lignes.
row DocumentFormat.OpenXml.Spreadsheet.Row Ligne dans le tableau de cellules.
c DocumentFormat.OpenXml.Spreadsheet.Cell Cellule d'une ligne.
v DocumentFormat.OpenXml.Spreadsheet.CellValue Valeur d'une cellule.

Exemple de code

Voici un exemple de code complet en C# et Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using System.IO;
using System.IO.Packaging;

static void OpenSpreadsheetDocumentReadonly(string filePath)
{
    // Open a SpreadsheetDocument based on a file path.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }

    // Open a SpreadsheetDocument based on a stream.
    Stream stream = File.Open(filePath, FileMode.Open);

    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }

    // Open System.IO.Packaging.Package.
    Package spreadsheetPackage = Package.Open(filePath, FileMode.Open, FileAccess.Read);

    // Open a SpreadsheetDocument based on a package.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }
}

Voir aussi