Analyser et lire un document de feuille de calcul volumineux
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office pour lire par programmation un fichier Excel volumineux. Pour plus d’informations sur la structure de base d’un document SpreadsheetML , consultez Structure d’un document SpreadsheetML.
Remarque
Vous voulez développer des solutions qui étendent l’expérience Office sur plusieurs plateformes ? Découvrez le nouveau modèle de compléments Office. Les compléments Office ont un encombrement réduit par rapport aux compléments et solutions VSTO. Vous pouvez les créer à l’aide de pratiquement n’importe quelle technologie de programmation web, telle que HTML5, JavaScript, CSS3 et XML.
Méthodes d’analyse des fichiers Open XML
Le Kit de développement logiciel (SDK) Open XML fournit deux méthodes pour analyser des fichiers Open XML. Vous pouvez utiliser le modèle objet de document (DOM) de kit de développement ou les fonctionnalités de lecture et d'écriture d'API Simple pour XML (SAX). Le DOM de kit de développement est conçu pour faciliter l’interrogation et l’analyse des fichiers Open XML à l’aide des classes fortement typées. Toutefois, l’approche DOM exige le chargement de parties Open XML entières dans la mémoire, ce qui peut entraîner une exception de mémoire insuffisante lorsque vous utilisez des fichiers très volumineux. Avec la méthode SAX, vous pouvez utiliser OpenXMLReader pour lire le code XML de chaque élément du fichier, sans avoir à charger le fichier complet dans la mémoire. Envisagez l'utilisation de l'approche SAX lorsque vous avez besoin de gérer des fichiers très volumineux.
Le segment de code suivant est utilisé pour lire un fichier Excel très volumineux avec l'approche DOM.
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
string? text;
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
text = c?.CellValue?.Text;
Console.Write(text + " ");
}
}
Le segment de code suivant effectue une tâche identique à celle de l'exemple précédent (lecture d'un fichier Excel très volumineux), mais utilise l'approche SAX. Il s'agit de l'approche recommandée pour la lecture de fichiers très volumineux.
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
string text;
while (reader.Read())
{
if (reader.ElementType == typeof(CellValue))
{
text = reader.GetText();
Console.Write(text + " ");
}
}
Exemple de code
Vous pouvez imaginer un scénario dans lequel vous travaillez pour une société financière qui gère des feuilles de calcul Excel très volumineuses. Ces feuilles de calcul sont mises à jour quotidiennement par les analystes et peuvent facilement dépasser des centaines de mégaoctets. Vous avez besoin d'une solution pour lire et extraire les données pertinentes de chaque feuille de calcul. L'exemple de code suivant contient deux méthodes qui correspondent aux deux approches, DOM et SAX. La dernière technique permet d'éviter des exceptions de mémoire lors de l'utilisation de fichiers très volumineux. Pour les tester, vous pouvez les appeler dans votre code l'une après l'autre ou appeler chaque méthode séparément en commentant l'appel de la méthode que vous voulez exclure.
// Comment one of the following lines to test the method separately.
ReadExcelFileDOM(args[0]); // DOM
ReadExcelFileSAX(args[0]); // SAX
Voici un exemple de code complet en C# et Visual Basic.
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Linq;
// The DOM approach.
// Note that the code below works only for cells that contain numeric values.
//
static void ReadExcelFileDOM(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
string? text;
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
text = c?.CellValue?.Text;
Console.Write(text + " ");
}
}
Console.WriteLine();
Console.ReadKey();
}
}
// The SAX approach.
static void ReadExcelFileSAX(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
string text;
while (reader.Read())
{
if (reader.ElementType == typeof(CellValue))
{
text = reader.GetText();
Console.Write(text + " ");
}
}
Console.WriteLine();
Console.ReadKey();
}
}