Fractionner des fichiers Excel en plusieurs fichiers
Introduction
Il existe de nombreux scénarios concrets dans lesquels un développeur doit diviser un fichier Excel unique en plusieurs fichiers plus petits. Par exemple, un classeur peut contenir une feuille de calcul par service, et chaque responsable de service ne doit recevoir que sa propre feuille. Dans d’autres cas, vous pouvez souhaiter extraire un tableau ou un bloc de données particulier d’une feuille de calcul et l’envoyer comme fichier autonome par e-mail, sans exposer le reste du classeur. Les grands classeurs consolidés peuvent également devoir être divisés en éléments plus petits pour faciliter leur manipulation, accélérer le chargement ou permettre un traitement en aval par d’autres systèmes.
Aspose.Cells propose deux approches flexibles pour cette tâche. La première approche parcourt chaque feuille de calcul du classeur source et copie son contenu dans une nouvelle instance de Workbook, en enregistrant chacune d’elles dans un fichier séparé. La seconde approche se concentre sur une plage de cellules spécifique au sein d’une feuille de calcul et copie uniquement cette plage dans un nouveau classeur. Dans les deux cas, le flux général est le même : charger le classeur source à l’aide de la classe Workbook, accéder aux données pertinentes via les objets Worksheet et Cells, transférer le contenu vers un Workbook de destination, puis enregistrer la destination sur le disque.
Fractionner un fichier Excel en copiant chaque feuille de calcul dans un nouveau classeur
Aperçu de l’approche
Dans cette approche, le classeur source est ouvert une seule fois, puis pour chaque Worksheet de sa collection Worksheets, un nouveau Workbook de destination est créé. Le contenu de la feuille de calcul source est ensuite copié dans la première feuille de calcul du classeur de destination, et le classeur de destination est enregistré en tant que fichier dont le nom est dérivé du nom de la feuille de calcul source. Le résultat est un fichier de sortie par feuille de calcul, chaque fichier de sortie contenant les données d’une seule feuille source.
Cette méthode est le choix approprié lorsque chaque feuille de calcul de votre classeur source représente une unité d’information logiquement indépendante (telle qu’un service, une région, un mois ou une gamme de produits) et que vous souhaitez livrer ou traiter chaque unité de manière indépendante.
Étapes
Les étapes suivantes décrivent comment fractionner un fichier Excel en copiant chaque feuille de calcul dans un nouveau classeur :
- Ouvrez le fichier Excel source en instanciant un objet
Workbooket en passant le chemin du fichier à son constructeur. - Parcourez la collection
Workbook.Worksheetsà l’aide d’une boucleforouforEachafin que chaqueWorksheetdu fichier source soit traité. - À l’intérieur de la boucle, créez une nouvelle instance
Workbookde destination (un classeur vide) pour la feuille de calcul en cours. - Ajoutez une nouvelle
Worksheetau classeur de destination (ou utilisez la première feuille de calcul par défaut) et attribuez-lui un nom significatif, idéalement identique à la propriétéNamede la feuille de calcul source. - Copiez le contenu de la feuille de calcul source dans la feuille de calcul de destination. Cela peut être fait en parcourant les cellules de la collection
Cellsde la feuille de calcul source et en écrivant leurs valeurs dans les cellules correspondantes de la feuille de calcul de destination, ou en utilisant la méthodeCells.copypour transférer une plage entière en une seule fois. - Construisez un chemin de fichier de sortie qui incorpore le nom de la feuille de calcul source (par exemple,
dataDir + worksheet.Name + ".xls") afin que chaque fichier généré ait un nom unique. - Appelez la méthode
Workbook.savedu classeur de destination pour écrire le fichier sur le disque. - Répétez les étapes 3 à 7 pour la feuille de calcul suivante jusqu’à ce que toutes les feuilles de calcul aient été traitées.
Exemple de code
const AsposeCells = require("aspose.cells");
const dataDir = "data/";
const workbook = new AsposeCells.Workbook(dataDir + "book1.xls");
for (let i = 0; i < workbook.getWorksheets().getCount(); i++) {
const sourceSheet = workbook.getWorksheets().get(i);
const sheetName = sourceSheet.getName();
const destWorkbook = new AsposeCells.Workbook();
const destIndex = destWorkbook.getWorksheets().add();
const destSheet = destWorkbook.getWorksheets().get(destIndex);
destSheet.setName(sheetName);
destSheet.copy(sourceSheet);
const destFile = dataDir + sheetName + ".xls";
destWorkbook.save(destFile, AsposeCells.SaveFormat.Excel97To2003);
}
Le résultat attendu est un ensemble de nouveaux fichiers dans le répertoire de données, un fichier par feuille de calcul du classeur source. Chaque fichier est nommé d’après la feuille source correspondante, et le fichier contient les données (et éventuellement la mise en forme) de cette feuille unique.
Fractionner un fichier Excel en copiant une plage dans un nouveau classeur
Aperçu de l’approche
Parfois, les données que vous devez fractionner ne correspondent pas à une feuille de calcul entière, mais plutôt à une région rectangulaire spécifique d’une feuille de calcul, telle que A1:D10 ou une plage nommée qui représente un tableau particulier. Dans ces cas, copier des feuilles de calcul entières est inutile, et une approche plus précise est requise : identifier la plage source, copier uniquement cette plage dans un nouveau classeur, puis enregistrer le nouveau fichier.
Cette approche est idéale lorsque vous souhaitez extraire un seul tableau, bloc de rapport ou zone de données d’une feuille de calcul plus grande tout en supprimant tout contenu non lié. Elle est également utile pour exporter des régions sélectionnées par l’utilisateur d’une feuille en tant que fichiers autonomes.
Étapes
Les étapes suivantes décrivent comment fractionner un fichier Excel en copiant une plage spécifique dans un nouveau classeur :
- Ouvrez le fichier Excel source en instanciant un objet
Workbookavec le chemin du fichier. - Récupérez la
Worksheetcible qui contient la plage que vous souhaitez copier, soit par index (par exemple, la première feuille), soit par nom dans la collectionWorksheets. - Identifiez la plage à copier. Il peut s’agir d’une plage de cellules codée en dur telle que
A1:C10, ou d’une plage nommée obtenue via la collectionWorksheet.Cells, ou d’une plage créée viaWorksheet.Cells.createRange. - Créez une nouvelle instance
Workbookde destination. - Accédez à la première
Worksheetdu classeur de destination (la feuille par défaut). - Copiez la plage source dans la feuille de calcul de destination, généralement en commençant par la cellule
A1. La méthodeCells.copysur la collectionCellsde destination peut être utilisée pour copier une plage entière, ou vous pouvez parcourir les cellules de la plage source et écrire leurs valeurs dans les cellules de destination avecputValue. DesCopyOptionsfacultatives peuvent être fournies pour contrôler ce qui est transféré (valeurs uniquement, valeurs et styles, formules, etc.). - Enregistrez le classeur de destination dans un nouveau chemin de fichier sur le disque à l’aide de la méthode
Workbook.save.
Exemple de code
const AsposeCells = require("aspose.cells");
// Définir le répertoire de données et les chemins de fichiers
const dataDir = "data/";
const sourcePath = dataDir + "book1.xls";
const outputPath = dataDir + "outputrange.xls";
// Ouvrir le fichier Excel source
const sourceWorkbook = new AsposeCells.Workbook(sourcePath);
// Obtenir la première feuille de calcul du classeur source
const sourceWorksheet = sourceWorkbook.getWorksheets().get(0);
// Définir la plage de cellules source A1:C10 (10 lignes, 3 colonnes commençant à la ligne 0, colonne 0)
const sourceRange = sourceWorksheet.getCells().createRange(0, 0, 10, 3);
// Créer un nouveau classeur de destination
const destWorkbook = new AsposeCells.Workbook();
// Accéder à la première feuille de calcul dans le classeur de destination
const destWorksheet = destWorkbook.getWorksheets().get(0);
// Créer la plage de destination à A1 avec les mêmes dimensions que la plage source
const destRange = destWorksheet.getCells().createRange(0, 0, 10, 3);
// Copier la plage source vers la plage de destination
destRange.copy(sourceRange);
// Enregistrer le classeur de destination dans un nouveau fichier .xls
destWorkbook.save(outputPath, AsposeCells.SaveFormat.Excel97To2003);
Le résultat attendu est un nouveau fichier unique dans le répertoire de données qui contient uniquement les valeurs (et éventuellement la mise en forme) de la plage spécifiée extraite du classeur source. Le fichier de destination n’a aucune relation avec d’autres données du fichier source ; il contient uniquement la plage extraite, commençant à la cellule A1 de sa première feuille de calcul.