Partager via


Ouvrir un document de feuilles de calcul à partir d’un flux

Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office pour ouvrir un document de feuille de calcul à partir d’un flux par programmation.


Quand effectuer une ouverture à partir d’un flux

Si vous avez une application, telle que Microsoft SharePoint Foundation 2010, qui fonctionne avec des documents à l’aide de l’entrée/sortie de flux, et que vous souhaitez utiliser le Kit de développement logiciel (SDK) Open XML pour travailler avec l’un des documents, cela est conçu pour être facile à faire. Cela est particulièrement vrai si le document existe et que vous pouvez l’ouvrir à l’aide du Kit de développement logiciel (SDK) Open XML. Mais supposez que le document est un flux ouvert au point dans votre code où vous devez utiliser le kit SDK pour travailler dessus ? Il s’agit du scénario discuté dans cette rubrique. L’exemple de méthode dans l’exemple de code accepte un flux ouvert en tant que paramètre, puis ajoute du texte au document derrière le flux à l’aide du Kit de développement logiciel (SDK) Open XML.


Objet SpreadsheetDocument

La structure de base d’un document SpreadsheetML se compose des Sheets éléments et Sheet , qui font référence aux feuilles de calcul dans .Workbook Un fichier XML distinct est créé pour chaque 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="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://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 feuille de calcul contiennent un ou plusieurs éléments de niveau bloc tels que SheetData. sheetData représente la table de cellules et contient un ou plusieurs Row éléments. Un row contient un ou plusieurs Cell éléments. Chaque cellule contient un CellValue élément 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 trouverez ces classes dans l’espace de DocumentFormat.OpenXML.Spreadsheet noms . Le tableau suivant répertorie les noms de classes des classes qui correspondent aux workbookéléments , sheets, sheet, worksheetet sheetData .

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

Génération du balisage SpreadsheetML pour l’ajout d’une feuille de calcul

Lorsque vous avez accès au corps du composant de document main, vous ajoutez une feuille de calcul en appelant AddNewPart la méthode pour créer un nouveau WorksheetPart. L’exemple de code suivant ajoute le nouveau WorksheetPart.


// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());


Exemple de code

Dans cet exemple, la OpenAndAddToSpreadsheetStream méthode peut être utilisée pour ouvrir un document de feuille de calcul à partir d’un flux déjà ouvert et y ajouter du texte. Voici un exemple de code complet en C# et Visual Basic.

using (FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.ReadWrite))
{
    OpenAndAddToSpreadsheetStream(fileStream);
}

Notez que la OpenAddAndAddToSpreadsheetStream méthode ne ferme pas le flux qui lui est passé. Le code appelant doit le faire manuellement ou avec une using instruction .

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

static void OpenAndAddToSpreadsheetStream(Stream stream)
{
    // Open a SpreadsheetDocument based on a stream.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, true))
    {

        if (spreadsheetDocument is not null)
        {
            // Get or create the WorkbookPart
            WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();


            // Add a new worksheet.
            WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            newWorksheetPart.Worksheet = new Worksheet(new SheetData());


            Workbook workbook = workbookPart.Workbook ?? new Workbook();

            if (workbookPart.Workbook is null)
            {
                workbookPart.Workbook = workbook;
            }

            Sheets sheets = workbook.GetFirstChild<Sheets>() ?? workbook.AppendChild(new Sheets());
            string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);

            // Get a unique ID for the new worksheet.
            uint sheetId = 1;

            if (sheets.Elements<Sheet>().Count() > 0)
            {
                sheetId = (sheets.Elements<Sheet>().Select(s => s.SheetId?.Value).Max() + 1) ?? (uint)sheets.Elements<Sheet>().Count() + 1;
            }

            // Give the new worksheet a name.
            string sheetName = "Sheet" + sheetId;

            // Append the new worksheet and associate it with the workbook.
            Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
            sheets.Append(sheet);
        }
    }
}


Voir aussi