Patch per PhpSpreadsheet, no ai valori in notazione scientifica

PhpSpreadsheet è, a mio avviso, la migliore libreria PHP per creare, leggere e modificare file Excel e CSV. Solo un piccolo problema: non ho capito se si tratta realmente di un bug, ma quando una cella contiene un valore numerico molto alto (es. 182342737354689352) la libreria restituisce l’equivalente valore in notazione scientifica (1.82342737E17), tra l’altro perdendo pure in precisione. Il problema si verifica anche utilizzando il formato CSV che di sua natura non codifica il tipo di dato per le colonne.

Per ovviare al problema ho realizzato una piccola patch che forza la libreria a considerare tutte le celle come testuali, ritornando sempre un valore stringa, indipendentemente dal tipo cella. Per applicare la patch è sufficiente sostituire il file Cell.php originale con quello alternativo.

Link patch ->PhpSpreadsheet-1.8.2-stringsonly-patch

 

MySuperLabel – Software online per la creazione di etichette

Negozi al dettaglio, negozi all’ingrosso e commercianti online hanno bisogno di stampare etichette per i propri prodotti, per il proprio magazzino o per le proprie spedizioni. Parliamo di questo genere di etichette:

O più in generale etichette di qualsiasi forma e dimensione:

Esistono in commercio numerosi programmi più o meno adatti allo scopo ma hanno la svantaggio di dover essere installati su PC e di funzionare solo con stampanti speciali che vanno sia acquistate a parte sia ricaricate con particolari rotoli ricarica.

Molte aziende preferiscono quindi utilizzare i comuni fogli adesivi A4 per stampare le proprie etichette. I fogli adesivi sono molto pratici ed economici, e non richiedono nessuna attrezzatura particolare (solo la propria stampante da ufficio, laser o getto d’inchiostro) e permettono la creazione di molte etichette in quantità. I fogli adesivi si comprano in cartoleria o online ed esistono in una moltitudine di formati diversi, adatti a tutte le esigenze:

Il problema principale però è come creare queste etichette. Si può utilizzare Word o Excel, ma disegnare i codici a barre è complicato (servono font particolari), i margini delle etichette non risultano quasi mai esatti e soprattutto occorre inserire a mano tutti i campi delle etichette (nomi prodotto, descrizioni, prezzi, indirizzi, nomi etc…) o quantomeno fare copia-incolla dei dati da un foglio Excel preesistente.

MySuperLabel

MySuperLabel è un piccolo software online che ho deciso di realizzare per ovviare a questo problema. Il software si utilizza tramite un normale browser (Chrome, Safari e IE11+) e funziona in questo modo: si carica il foglio Excel che contiene i dati dei propri prodotti (può essere tranquillamente un listino prezzi o un database aziendale dei prodotti) e il software genererà automaticamente il PDF pronto per la stampa su etichette adesive. Il software permette di definire la posizione degli elementi nell’etichetta (nome prodotto, descrizione, codici a barre, prezzi etc..), i margini del foglio e di definire da quali colonne del file Excel prendere i dati. In questo modo non è necessario creare un foglio Excel apposito per generare le proprie etichette ma semplicemente si possono utilizzare i fogli Excel di listino o altri fogli Excel pre-esistenti; basta selezionare le colonne opportune dal quale il software preleverà i dati.

Per creare il PDF basta semplicemente caricare il foglio Excel in questa sezione di upload:

Dopo alcuni istanti verrà generato il file PDF pronto per la stampa. Basta quindi scaricare il PDF e stamparlo con la propria stampante:

Da notare che il PDF ha i tutti margini correttamente impostati a seconda del formato etichette con il quale vogliamo stampare. I margini vengono definiti in una apposita sezione del software. I codici a barre sono generati automaticamente dal codice prodotto (o da qualsiasi altro campo Excel si voglia). Scarica qui un PDF di esempio per vedere con mano il risultato.

Caratteristiche principali di MySuperLabel

Elenco qui alcune delle caratteristiche principali, maggiori informazioni si trovano sulla pagina principale del sito https://www.mysuperlabel.com

  • Possibilità di generare codici a barre automaticamente
  • Funziona con qualsiasi tipo di etichette A4 adesive
  • Sono supportati tutti i codici a barre più famosi (EAN13, CODE39, CODE128, Farmaceutici, etc…)
  • Immagini e loghi aziendali su etichetta, anche più di uno
  • E’ possibile generare fino a 1000 etichette alla volta
  • Nessun software da installare
  • Nessuna attrezzatura particolare richiesta
  • Funziona tramite un normale browser internet
  • E’ possibile creare le proprie etichette anche fuori dall’ufficio e portare il PDF alla stampante

Quali tipi di etichette è possibile creare?

Sostanzialmente qualsiasi etichetta per prezzare articoli da negozio oppure etichette per la logistica di magazzino. Ma anche etichette per spedizioni e semplici cartellini informativi da esposizione.

Campi dell’etichetta

L’etichetta viene costruita a partire dai “mattoni base” messi a disposizione dal software. Questi elementi base si dividono in elementi fissi oppure elementi variabili che prendono il proprio valore da una colonna del foglio Excel. Ecco l’elenco:

  • Testi fissi
  • Testi da Excel
  • Prezzi da Excel
  • Codici a barre fissi
  • Codici a barre da Excel
  • Semplici forme geometriche (linee e rettangoli)
  • Colore sfondo etichetta fisso
  • Colore sfondo etichetta da Excel (tramite codice colore numerico)
  • Immagini e loghi aziendali (a colori o bianco/nero)

Prezzi e versioni

La versione base è completamente gratuita, basta registrarsi con la propria email. Le versioni a pagamento permettono di accedere a tutte le funzionalità avanzate e di creare un numero illimitato di modelli etichetta.

Per qualsiasi altra informazioni contattatemi a info@mysuperlabel.com

 

 

Lettura e generazione fogli Excel/CSV con PHP

Molti dei progetti web/app ai quali ho lavorato e sto attualmente lavorando, richiedono l’upload di fogli Excel e CSV per l’immissione di grandi quantità di dati nel database. Altre volte invece è necessario generare dei report o degli export in formato Excel o CSV, come download o allegati ad email automatiche.

Una libreria che consiglio, estremamente semplice da utilizzare, è PHPSpreadSheet:

https://github.com/PHPOffice/PhpSpreadsheet

La libreria è scritta interamente in PHP, linguaggio che ormai è presente in praticamente tutti gli host web (ad esempio, se avete WordPress, avete sicuramente PHP). Se PHP non è presente è sempre possibile aggiungerlo come servizio extra.

Installazione

Installare la libreria è semplice, basta creare una cartella vuota nello spazio web e copiare il build dell’ultima release. Compilare la libreria richiede composer, ma è sempre possibile utilizzare questa comoda scorciatoia

Scaricato lo zip del build, estraetelo nella cartella vuota che avete creato e voilà, la libreria è “installata”.

Esempio: creazione di file xlsx

Vediamo un semplicissimo esempio che tocca tutte le funzionalità base della libreria. Immaginiamo di avere la libreria installata nella cartella “test”.

require 'test/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;


$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue("A1", "Ciao mondo!");
$writer = new Xlsx($spreadsheet);
$writer->save('prova.xlsx');

Questo semplice programma crea un nuovo file Excel (prova.xlxs) nella cartella corrente (sul server ovviamente) e inserisce la scritta “Ciao mondo!” nella cella A1 del foglio. Tutto qui. setCellValue() è sostanzialmente l’unica API da utilizzare per inserire valori nelle varie celle. Tramite appositi loop potrete ad esempio leggere una riga dal database e creare la riga corrispondente nel foglio Excel e cosi via a creare una tabella completa dei dati.

Se indirizzare le celle con i nomi classici “A1”, “A2”, “C3” etc.. risultasse scomodo, è sempre possible indicizzare tramite due indici numerici separati, uno per la riga e uno per la colonna:

setCellValueByColumnAndRow(1, 5,"Ciao Mondo!");

E’ possibile inoltre impostare font, carattere e allargare/restringere le celle a piacimento, la documentazione contiene tutti gli esempi necessari.

Esempio: lettura di un file xlsx caricato in upload

In questo caso vogliamo leggere un file Excel caricato dall’utente e riversare i dati nel database (o fare delle elaborazioni).

require 'test/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;


$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("prova.xlsx");

In questo caso leggiamo un file (prova.xlsx) già presente nella directory corrente. Il file può essere un upload utente oppure un file generato precedentemente, non ha importanza.

Per leggere una cella, utilizziamo la funzione getCellByColumnAndRow():

$sheet = $spreadsheet->getActiveSheet();
$value = $sheet->getCellByColumnAndRow(2, 3);

che restituisce il contenuto della cella B3. Gli indici partono da 1, quindi A1 è (1,1).

Download diretto del file Excel

Magari preferiamo far partire immediatamente il download nel browser dell’utente non appena la libreria ha creato il file Excel, senza passare da un file temporaneo memorizzato sul server. Molto semplicemente, possiamo impostare gli header PHP per il download e scrivere il foglio Excel nel file speciale php://output. Questo file è un’area di memoria piuttosto che un file vero e proprio: la libreria creerà il foglio Excel in memoria che poi verrà passato in download al browser dell’utente.

$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="prova.xlsx"');
header("Content-Transfer-Encoding: binary");
$writer = new Xlsx($spreadsheet);
$writer->save("php://output");
die();

Il nome del file in download è impostato nell’header content-dispositon filename (nome file: “prova.xlsx”).

Altre funzionalità

Quello che abbiamo visto è veramente il minimo sindacale per creare e leggere file Excel e CSV con PHP. La libreria mette a disposizione moltissime altre feature tra le quali:

  • il supporto per file Excel 2003, CSV, file spreadsheet Mac
  • accesso alle tab
  • calcolo e creazione formule

Per una lista completa delle funzionalità vi rimando alla documentazione e alla pagina ufficiale del progetto:

https://github.com/PHPOffice/PhpSpreadsheet
https://phpspreadsheet.readthedocs.io/en/develop/