PHP – Estrarre immagini da un excel già creato con PHPExcel

Se avete bisogno di estrarre delle immagini presenti in un file Excel, troverete un ottimo appoggio nella classe PHPExcel, che si occupa per l’appunto di gestire questo tipo di file attraverso il linguaggio PHP: creazione, gestione, estrapolazione di dati.

In questo articolo vedremo come estrarre delle immagini da un file con estensione .xls o .xlsx, senza entrare troppo nei dettagli della classe, che di per sé permette operazioni ben più complesse.

Scaricate innanzitutto la classe PHPExcel da questo indirizzo. Nello stesso sito troverete una pagina di discussione (in inglese) e una di documentazione – che al momento in cui scrivo non è funzionante; ma la potete trovare inclusa nel file da scaricare.

Scompattate lo zip all’interno del sito e create un file index.php nella stessa cartella: sarà il file su cui andremo a lavorare. Qui prendo come ipotesi che la cartella della classe abbia il nome “phpexcel”: in caso di diversa denominazione, vanno ovviamente apportate le dovute modifiche allo script.

Download script

Metodi per estrarre immagini da un file Excel

Nel nostro file php includiamo la classe in questo modo:

1
2
include("phpexcel/Classes/PHPExcel.php"); //inclusione della classe
error_reporting(E_ALL); //visualizzazione degli errori attiva, utile per il controllo dei bug

Adesso non ci resta che creare lo script per estrapolare le eventuali immagini interne.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$reader = new PHPExcel_Reader_Excel2007(); //creiamo l'oggetto, valido per file di Excel 2007

$PHPExcel = $reader->load('index.xlsx');
$worksheet = $PHPExcel->getActiveSheet();

// estrae le immagini e le salva
foreach ($worksheet->getDrawingCollection() as $i => $drawing) {
    $filename = $drawing->getPath();
    $imagesize = getimagesize($filename);

    switch($imagesize[2]){

		case 1:
			$image = imagecreatefromgif($filename);
			imagegif($image, "$i.gif");
			break;

		case 2:
			$image = imagecreatefromjpeg($filename);
			imagejpeg($image, "$i.jpeg");
			break; 

		case 3:
			$image = imagecreatefrompng($filename);
			imagepng($image, "$i.png");
			break;

		default:
			continue 2;

    }
	echo $drawing->getCoordinates()."<br /><br />";
}

Le immagini saranno salvate nella stessa cartella dove siamo con un numero progressivo nel nome.
L’ultima echo è una mia aggiunta: mostra infatti le coordinate (la cella di Excel) in cui l’immagine si trovava e la stampa a video.

Note e uso per versioni di Excel precedenti alla 2007

Alcune annotazioni necessarie:
– da quanto ho potuto verificare, lo script ricerca le coordinate dell’immagine prendendo l’angolo in alto a sinistra. In pratica, se l’angolo in alto a sinistra dell’immagine è nella cella A2, mentre gran parte del corpo dell’immagine è in A3, le coordinate risultanti saranno A2.
– nel caso in cui il vostro file Excel sia più vecchio della versione 2007 oppure sia stato creato con versioni di Calc di Open Office o altri programmi gratuiti, occorre usare una classe differente: dovete spulciare nalla cartella Reader dello zip e scegliere il richiamo più adatto. In alternativa potete convertire il vostro file in formato Excel2007, attraverso questo script (da richiamare prima di quello soprastante e in una pagina php a parte):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
include("phpexcel/Classes/PHPExcel.php"); //inclusione della classe
error_reporting(E_ALL); //visualizzazione degli errori attiva, utile per il controllo dei bug
set_time_limit(0); //necessario per creare l'excel, in caso di tempi di attesa troppo lunghi

$objPHPExcel = new PHPExcel();

// legge da Excel5 (.xls)
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load("nomefile.xls");

// esporta in Excel2007 (.xlsx)
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));

// esporta in Excel5 (.xls)
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));
Etichette:, ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *