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 comprend les éléments Sheets et Sheet faisant référence aux feuilles de calcul dans le classeur. Un fichier XML distinct est créé pour chaque feuille de calcul. Par exemple, le document SpreadsheetML d’un classeur qui possède deux feuilles de calcul nommées MySheet1 et MySheet2 se trouve dans le fichier Workbook.xml et est illustré dans l’exemple de code suivant.
<?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 est illustré dans l'exemple de code suivant.
<?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. |
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 la méthode AddNewPart<T>(String, String) pour créer une feuille de calcul. L’exemple de code suivant ajoute le nouveau WorksheetPart.
// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
newWorksheetPart.Worksheet.Save();
Exemple de code
Dans cet exemple, la méthode OpenAndAddToSpreadsheetStream permet d’ouvrir un document de feuille de calcul à partir d’un flux déjà ouvert, et d’y ajouter du texte. Voici un exemple de code complet en C# et Visual Basic.
var fileStream = File.Open(args[0], FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
OpenAndAddToSpreadsheetStream(fileStream);
Notez que la méthode OpenAddAndAddToSpreadsheetStream ne ferme pas le flux qui lui est passé. Cette opération doit être effectuée par le code appelant.
Voici l’exemple de code complet en C# et en Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.IO;
using System.Linq;
static void OpenAndAddToSpreadsheetStream(Stream stream)
{
// Open a SpreadsheetDocument based on a stream.
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());
newWorksheetPart.Worksheet.Save();
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);
workbookPart.Workbook.Save();
// Dispose the document handle.
spreadsheetDocument.Dispose();
}
}