Divisione di file Excel in più file
Introduzione
Esistono molti scenari reali in cui uno sviluppatore ha bisogno di suddividere un singolo file Excel in diversi file più piccoli. Ad esempio, una cartella di lavoro può contenere un foglio di lavoro per dipartimento, e ogni responsabile di dipartimento ha bisogno di ricevere solo il proprio foglio. In altri casi, potresti voler estrarre una particolare tabella o blocco di dati da un foglio di lavoro e inviarlo come file autonomo via email, senza esporre il resto della cartella di lavoro. Anche cartelle di lavoro consolidate di grandi dimensioni potrebbero dover essere divise in pezzi più piccoli per una gestione più semplice, un caricamento più rapido, o per l’elaborazione a valle da parte di altri sistemi.
Aspose.Cells fornisce due approcci flessibili per questo compito. Il primo approccio scorre ogni foglio di lavoro nella cartella di lavoro sorgente e ne copia il contenuto in una nuova istanza di Workbook, salvando ciascuno come file separato. Il secondo approccio si concentra su uno specifico intervallo di celle all’interno di un foglio di lavoro e copia solo quell’intervallo in una nuova cartella di lavoro. In entrambi i casi, il flusso generale è lo stesso: caricare la cartella di lavoro sorgente utilizzando la classe Workbook, accedere ai dati rilevanti tramite gli oggetti Worksheet e Cells, trasferire il contenuto in una Workbook di destinazione, e quindi salvare la destinazione su disco.
Divisione di un file Excel copiando ogni foglio di lavoro in una nuova cartella di lavoro
Panoramica dell’approccio
In questo approccio, la cartella di lavoro sorgente viene aperta una volta, e quindi per ogni Worksheet nella sua collezione Worksheets, viene creata una nuova Workbook di destinazione. Il contenuto del foglio di lavoro sorgente viene quindi copiato nel primo foglio di lavoro della cartella di lavoro di destinazione, e la cartella di lavoro di destinazione viene salvata come un file il cui nome è derivato dal nome del foglio di lavoro sorgente. Il risultato è un file di output per foglio di lavoro, con ciascun file di output che contiene i dati di un singolo foglio sorgente.
Questo metodo è la scelta giusta quando ogni foglio di lavoro nella tua cartella di lavoro sorgente rappresenta un’unità di informazione logicamente indipendente (come un dipartimento, una regione, un mese o una linea di prodotto) e si desidera consegnare o elaborare ciascuna unità separatamente.
Passaggi
I seguenti passaggi descrivono come dividere un file Excel copiando ogni foglio di lavoro in una nuova cartella di lavoro:
- Apri il file Excel sorgente istanziando un oggetto
Workbooke passando il percorso del file al suo costruttore. - Scorri la collezione
Workbook.Worksheetsutilizzando un cicloforoforeachin modo che ogniWorksheetnel file sorgente venga elaborato. - All’interno del ciclo, crea una nuova istanza di
Workbookdi destinazione (una cartella di lavoro vuota) per il foglio di lavoro corrente. - Aggiungi un nuovo
Worksheetalla cartella di lavoro di destinazione (o utilizza il primo foglio di lavoro predefinito) e assegnagli un nome significativo, idealmente lo stesso della proprietàNamedel foglio di lavoro sorgente. - Copia il contenuto del foglio di lavoro sorgente nel foglio di lavoro di destinazione. Questo può essere fatto scorrendo le celle della collezione
Cellsdel foglio di lavoro sorgente e scrivendo i loro valori nelle celle corrispondenti del foglio di lavoro di destinazione, oppure utilizzando il metodoCells.copyper trasferire un intero intervallo in una volta. - Costruisci un percorso del file di output che incorpori il nome del foglio di lavoro sorgente (ad esempio,
dataDir + worksheet.Name + ".xls") in modo che ciascun file generato abbia un nome univoco. - Chiama il metodo
Workbook.savedi destinazione per scrivere il file su disco. - Ripeti i passaggi da 3 a 7 per il foglio di lavoro successivo fino a quando tutti i fogli di lavoro sono stati elaborati.
Esempio di codice
import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, Worksheet, Cells, Range, SaveFormat
dataDir = "data/"
workbook = Workbook(dataDir + "book1.xls")
for i in range(workbook.getWorksheets().getCount()):
sourceSheet = workbook.getWorksheets().get(i)
sheetName = sourceSheet.getName()
destWorkbook = Workbook()
destIndex = destWorkbook.getWorksheets().add()
destSheet = destWorkbook.getWorksheets().get(destIndex)
destSheet.setName(sheetName)
destSheet.copy(sourceSheet)
destFile = dataDir + sheetName + ".xls"
destWorkbook.save(destFile, SaveFormat.Excel97To2003)
jpype.shutdownJVM()
Il risultato atteso è un insieme di nuovi file nella directory dei dati, un file per foglio di lavoro dalla cartella di lavoro sorgente. Ciascun file è denominato in base al foglio sorgente corrispondente, e il file contiene i dati (e facoltativamente la formattazione) di quel singolo foglio.
Divisione di un file Excel copiando un intervallo in una nuova cartella di lavoro
Panoramica dell’approccio
A volte i dati che devi dividere non corrispondono a un intero foglio di lavoro ma piuttosto a una specifica regione rettangolare di un foglio di lavoro, come A1:D10 o un intervallo denominato che rappresenta una particolare tabella. In questi casi, copiare interi fogli di lavoro è uno spreco, e si richiede un approccio più preciso: identificare l’intervallo sorgente, copiare solo quell’intervallo in una nuova cartella di lavoro, e salvare il nuovo file.
Questo approccio è ideale quando si desidera estrarre una singola tabella, blocco di report o area di dati da un foglio di lavoro più grande scartando tutto il contenuto non correlato. È anche utile per esportare regioni selezionate dall’utente di un foglio come file autonomi.
Passaggi
I seguenti passaggi descrivono come dividere un file Excel copiando uno specifico intervallo in una nuova cartella di lavoro:
- Apri il file Excel sorgente istanziando un oggetto
Workbookcon il percorso del file. - Recupera il
Worksheetdi destinazione che contiene l’intervallo che vuoi copiare, sia per indice (ad esempio, il primo foglio) sia per nome dalla collezioneWorksheets. - Identifica l’intervallo da copiare. Questo può essere un intervallo di celle hardcoded come
A1:C10, o un intervallo denominato ottenuto tramite la collezioneWorksheet.Cells, o un intervallo creato tramiteWorksheet.Cells.createRange. - Crea una nuova istanza di
Workbookdi destinazione. - Accedi al primo
Worksheetdella cartella di lavoro di destinazione (il foglio predefinito). - Copia l’intervallo sorgente nel foglio di lavoro di destinazione, tipicamente partendo dalla cella
A1. Il metodoCells.copysulla collezioneCellsdi destinazione può essere utilizzato per copiare un intero intervallo, oppure puoi scorrere le celle dell’intervallo sorgente e scrivere i loro valori nelle celle di destinazione conputValue. Opzionalmente possono essere fornitiCopyOptionsper controllare cosa viene trasferito (solo valori, valori e stili, formule, e così via). - Salva la cartella di lavoro di destinazione in un nuovo percorso file su disco utilizzando il metodo
Workbook.save.
Esempio di codice
import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, Worksheet, Cells, Range, SaveFormat
# Definire la directory dei dati e i percorsi dei file
dataDir = "data/"
sourcePath = dataDir + "book1.xls"
outputPath = dataDir + "outputrange.xls"
# Aprire il file Excel di origine
sourceWorkbook = Workbook(sourcePath)
# Ottenere il primo foglio di lavoro dalla cartella di lavoro di origine
sourceWorksheet = sourceWorkbook.getWorksheets().get(0)
# Definire l'intervallo di celle di origine A1:C10 (10 righe, 3 colonne a partire da riga 0, colonna 0)
sourceRange = sourceWorksheet.getCells().createRange(0, 0, 10, 3)
# Creare una nuova cartella di lavoro di destinazione
destWorkbook = Workbook()
# Accedere al primo foglio di lavoro nella cartella di lavoro di destinazione
destWorksheet = destWorkbook.getWorksheets().get(0)
# Creare l'intervallo di destinazione in A1 con le stesse dimensioni dell'intervallo di origine
destRange = destWorksheet.getCells().createRange(0, 0, 10, 3)
# Copiare l'intervallo di origine nell'intervallo di destinazione
destRange.copy(sourceRange)
# Salvare la cartella di lavoro di destinazione in un nuovo file .xls
destWorkbook.save(outputPath, SaveFormat.Excel97To2003)
jpype.shutdownJVM()
Il risultato atteso è un singolo nuovo file nella directory dei dati che contiene solo i valori (e facoltativamente la formattazione) dell’intervallo specificato estratto dalla cartella di lavoro sorgente. Il file di destinazione non ha alcuna relazione con altri dati nel file sorgente; contiene solo l’intervallo estratto, a partire dalla cella A1 del suo primo foglio di lavoro.