Un modo semplice per trasferire dati tabulari da PHP a Excel. Esporta dati da PHP a Excel Esporta tabella php a Excel

.
Il metodo presentato in quella nota è infatti molto semplice, ma potrebbe non essere sempre conveniente.
Esistono molti altri modi per trasferire dati tabulari da PHP a Excel, descriverò quello che mi è sembrato il più semplice e funzionale. Va notato in particolare che non sto parlando di generare un file xls, ma solo di suggerire all'utente di aprire i dati ricevuti utilizzando Excel in modo che gli utenti senza esperienza nella programmazione non si accorgano della falsificazione.

Quindi, la prima cosa che devi fare è inserire nella nostra pagina un collegamento a uno script che generi le seguenti intestazioni:
intestazione("Pragma: pubblico");
header("Scadenza: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Controllo cache: privato", false);
header("Tipo contenuto: application/x-msexcel");
header("Disposizione contenuto: allegato; nomefile=\"" . iconv("UTF-8", "CP1251", $oggetto->getFileName()) . "\";");
header("Codifica trasferimento contenuto: binario");
header("Lunghezza contenuto: " . $oggetto->getFileSize());

$oggetto è un oggetto sferico nel vuoto, che ogni lettore può realizzare come preferisce. Lo scopo dei getter getFileName() e getFileSize() è chiaro dai loro nomi. Vale la pena evidenziare qui una sfumatura non ovvia (grazie per avermelo ricordato): getFileName() può ovviamente restituire qualsiasi nome di file, ma se si desidera che il browser offra l'apertura del contenuto ricevuto in Excel, l'estensione del file dovrebbe essere xls.
Non ho ancora detto nulla di nuovo, tutto questo però è stato inventato prima di me, come verrà descritto di seguito.
Come è stato giustamente notato nei commenti all'articolo, Excel funziona molto più velocemente con XML. Ma il vantaggio più importante, forse, non è la velocità, ma capacità molto più ampie. Non andrò più in profondità nelle erbacce, ma fornirò solo un semplice esempio e un collegamento a descrizione dettagliata tutti i tag.

Pertanto, dopo aver generato le intestazioni, dobbiamo fornire i dati effettivi all'utente. Di solito avvolgo la generazione della tabella in un metodo separato:
echo $oggetto->getContent();

E genero la tabella usando Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/per ogni)(foreach from=$data.content item=row) (foreach da=$riga elemento=col) ($col)(/per ogni)(/per ogni)

Come puoi vedere dal codice, l'array $data viene passato al modello, contenente due array: la riga del titolo della tabella e i dati stessi.
Vale la pena notare che utilizzare un motore di template solo per generare XML è piuttosto costoso e XML può essere ottenuto in molti altri modi. Nel mio caso particolare, la generazione di XML è solo un piccolo vantaggio in un progetto di grandi dimensioni in cui un motore di template è indispensabile.

Come esempio ho dato la tabella più semplice, se lo si desidera è possibile manipolare molti più attributi. Ciò è particolarmente utile considerando che per l'implementazione non sono necessarie librerie di terze parti.
Il metodo descritto funziona su un progetto da diversi anni e nessun singolo utente ha ancora sospettato che i dati che apre non siano un documento di MS Office.

Puoi leggere ulteriori informazioni sulla struttura XML utilizzata in MS Excel in

(dati ottenuti dal database mysql) per avere successo. Sto usando Zend Framework. Devo apportare alcune modifiche ai miei dati prima di esportarli in Excel. In effetti, ho effettivamente bisogno di creare un libro cassa mensile.

Ho letto molti documenti ma mi sono ritrovato nel caos. Non so davvero come iniziare. Ho davvero bisogno della PERA? Devo caricare qualche libreria di classi? Non è vero? modo semplice fare questo?

grazie in anticipo

Ti suggerisco di utilizzare la libreria PHPExcel. È davvero potente, supporta più formati, può eseguire la formattazione visiva ed è facile da usare.

Puoi saperne di più sulla loro pagina web: http://phpexcel.codeplex.com/, (PHPExcel è già stato spostato su https://github.com/PHPOffice/PHPExcel)

Esempio di utilizzo:

$objPHPExcel = nuovo PHPExcel(); /** È possibile impostare molte proprietà */ $objPHPExcel->getProperties()->setCreator("La mia azienda") ->setLastModifiedBy("John Doe") ->setTitle("Rapporto annuale") ->setSubject("Sales ") ->setDescription("Report annuale sulle vendite di John Doe") ->setCategory("Finanza"); /** Scegli uno dei fogli */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Imposta semplicemente il valore della cella */ $activeSheet->setCellValue("A1", "plural");

Puoi fare molto di più, ovviamente, leggendo file excel, impostando stili visivi, creando grafici, espressioni e molto altro.

Ho scritto un report sulla variazione dell'inventario di 94 righe in cui prendo dati da MySQL (6kb + record per tabella), creo matrice multidimensionale dai dati MySQL, estratti da diverse tabelle e quindi scaricati tutto in una riga e generato .xls in questo modo:

Non sono necessarie estensioni.

L'unico avvertimento è che non ho ancora capito come sputare file .xls senza Excel, segnalando che i dati potrebbero essere corrotti - e non ho provato a eseguire formattazioni o qualcosa di più complesso del semplice "esportare" i dati, File/dati ok ovviamente, ma genera un avviso da Excel.

EDIT: dovrei notare che "setup" e "dump" si riferiscono a quanto segue: daniweb.com

Puoi usare la libreria phpexcel. Ti permette di scrivere e leggere da formati diversi file di fogli di calcolo

per l'integrazione di zend puoi avvalerti dell'aiuto del seguente collegamento.

Puoi utilizzare CSV per creare un formato importabile per Excel. Questo è il modo più semplice per farlo.

Il CSV si presenta così:

"il contenuto della mia prima cella", "il contenuto della mia seconda cella", "il contenuto della mia terza cella" "seconda riga, contenuto della prima cella", "ecc", "ecc

Ogni riga rappresenta una riga di Excel, in mezzo alla quale inserisci il contenuto della cella virgolette doppie e separarli con virgole. Fai attenzione se hai alcuni dei tuoi dati, potrebbero danneggiare il tuo CSV e creare nuove righe indesiderate.

Con un po' di Google troveresti questo: http://www.the-art-of-web.com/php/dataexport/

Preparazione dei dati

$dati = array(array("nome" => "Maria", "cognome" => "Johnson", "età" => 25), array("nome" => "Amanda", "cognome" => " Miller", "età" => 18), array("nome" => "James", "cognome" => "Marrone", "età" => 31), array("nome" => "Patricia", "cognome" => "Williams", "età" => 7), array("nome" => "Michael", "cognome" => "Davis", "età" => 43), array("nome" => "Sarah", "cognome" => "Miller", "età" => 24), array("nome" => "Patrick", "cognome" => "Miller", "età" => 27) );

Il primo passo è quello di emettere i dati in formato delimitato da tabulazioni (è possibile utilizzare anche CSV, ma è un po' più complicato). Per fare ciò utilizziamo il seguente codice:

Impostiamo il tipo di contenuto su testo/semplice in modo che il risultato possa essere visualizzato più facilmente nel browser. Altrimenti, poiché non è presente alcuna formattazione HTML, l'output apparirà come una singola riga di testo.

La prima riga di output sarà costituita dalle intestazioni delle colonne (in questo caso vengono utilizzati i nomi dei campi). I valori sono separati da tabulazioni \t e righe con interruzioni di riga \n. Il risultato dovrebbe assomigliare a questo:

Nome cognome età Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

C'è un punto debole in questo codice che potrebbe non essere immediatamente evidente. Cosa succede se uno dei campi da restituire contiene già uno o più caratteri di tabulazione o, peggio, nuova linea? Ciò attiverà l'intero processo poiché facciamo affidamento su questi simboli per indicare colonne e interruzioni di riga.

La soluzione è "sfuggire" ai caratteri di tabulazione. In questo caso, sostituiremo le tabulazioni con il letterale \t e le interruzioni di riga con il letterale \n in modo che non influiscano sulla formattazione:

Ora, prima che venga ripetuta l'eco di ogni riga, tutti i caratteri di tabulazione vengono sostituiti con "\t" in modo che le nostre colonne non si interrompano. Inoltre, eventuali interruzioni di riga all'interno dei dati vengono sostituite con "\n".

Per molti, quando si lavora con PHP insieme a MySQL esiste la necessità di esportare i dati dal database al formato xls, in modo che le persone che necessitano di questi dati li elaborino Programma Excel oppure era semplicemente conveniente per gli utenti visualizzare questi dati. Recentemente ho avuto una tale esigenza e oggi vi dirò come è possibile implementare questa questione.

Dirò subito che questo metodo è abbastanza semplice, ma i dati vengono caricati normalmente.

Per cominciare, darò un esempio del file xls finale in Excel, il caricamento sarà simile a questo:

In altre parole, non verranno caricate immagini o stili, ma solo le intestazioni delle colonne e i dati stessi.

Prima di arrivare esattamente a questa opzione di caricamento, ho provato a caricare in formato CSV, ma si è rivelato un po 'goffo, poi ho provato a disegnare una tabella e salvarla con l'estensione xls, si è rivelata anche una sorta di sciocchezza , il metodo che ora descriverò mi si è adattato perfettamente, e ora lo condividerò con voi.

Per cominciare ti do tutto il codice, che ho commentato il più possibile, puoi selezionarlo e salvarlo con estensione php e prova, ma non dimenticare di specificare le impostazioni di connessione al database.

Esporta dati da MySQL a Excel in PHP

E per farti capire quali dati sto caricando, darò un esempio di una semplice tabella nel database ( Ho il suo nome test):

Tabella di prova:

id nome di battesimo nome
1 Ivanov Ivan
2 Petrov Pietro
2 Petrov2 Pietro2
xlsData = pack("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0);

) // Se la funzione numerica RecNumber($riga, $col, $valore)( $this->xlsData .= pack("sssss", 0x0203, 14, $riga, $col, 0x00); $this->xlsData . = pack("d", $value); return; //Se la funzione di testo RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack (" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value return ) // Inserisci una funzione numerica InsertNumber($value)(; if ($ questo->contaCol == $questo->totaleCol) ( $questo->contaCol = 0; $questo->contaRiga++; ) $questo->NumeroRec($questo->contaRiga, $questo->contaCol, $ valore); $this->countCol++; return; ) // Inserisci la funzione di testo InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this- >countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; // Vai alla funzione di nuova riga GoNewLine())( $this-> countCol = 0 ; $this->countRow++; return; ) //Fine della funzione dati EndData() ( $this->xlsData .= pack("ss", 0x0A, 0x00); ritorno; ) // Salva la funzione file SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Invia la funzione file SendFile())( $this->EndData(); intestazione ("Ultima modifica: " . gmdate("D,d M YH:i:s") . " GMT"); intestazione ("Cache-Control: no-store, no-cache, must-revalidate"); header ("Pragma: no-cache"); header("Tipo contenuto: application/x-msexcel"); header("Disposizione contenuto: allegato; nomefile=$questo->nomefile.xls"); ->xlsData ; ) ) ) if(isset($_GET["id"])) ( //filtra i dati $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))) ; $filename = "File_with_id_".$id; // imposta il nome del file $excel = new ExportToExcel( // crea un'istanza della classe $sql="SELECT * FROM test.test dove id = $id"); //interroga il database $rez= mysql_query($sql); $excel->InsertText("Identificatore"); $excel->InsertText("Cognome"); excel->GoNewLine(); riga=mysql_fetch_assoc($rez))( $excel->InsertNumber($riga["id"]);$excel->InsertText($riga["nome"]); $excel->Inserisci testo($riga["nome"]);$excel->GoNewLine(); ) $excel->SalvaFile($nomefile);.

Per verificare la funzionalità di questo codice, tenendo conto del fatto che hai configurato una connessione al database e creato una tabella simile, puoi inviare la seguente richiesta:

Http://tuo_sito/nome_file. php?id=2

E dovresti scaricare due righe con id uguale a 2.

E ora chiunque a cui consenti di caricare dati può facilmente esportarli sul proprio file computer locale Attraverso interfaccia web. Questo metodo è conveniente sia per gli utenti aziendali, se stai sviluppando un'applicazione per la tua organizzazione, sia per gli utenti del tuo sito Web su Internet. Speranza, questo metodo Ti ho aiutato. Buona fortuna!

.
Il metodo presentato in quella nota è infatti molto semplice, ma potrebbe non essere sempre conveniente.
Esistono molti altri modi per trasferire dati tabulari da PHP a Excel, descriverò quello che mi è sembrato il più semplice e funzionale. Va notato in particolare che non sto parlando di generare un file xls, ma solo di suggerire all'utente di aprire i dati ricevuti utilizzando Excel in modo che gli utenti senza esperienza nella programmazione non si accorgano della falsificazione.

Quindi, la prima cosa che devi fare è inserire nella nostra pagina un collegamento a uno script che generi le seguenti intestazioni:
intestazione("Pragma: pubblico");
header("Scadenza: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Controllo cache: privato", false);
header("Tipo contenuto: application/x-msexcel");
header("Disposizione contenuto: allegato; nomefile=\"" . iconv("UTF-8", "CP1251", $oggetto->getFileName()) . "\";");
header("Codifica trasferimento contenuto: binario");
header("Lunghezza contenuto: " . $oggetto->getFileSize());

$oggetto è un oggetto sferico nel vuoto, che ogni lettore può realizzare come preferisce. Lo scopo dei getter getFileName() e getFileSize() è chiaro dai loro nomi. Vale la pena evidenziare qui una sfumatura non ovvia (grazie a savostin per avermelo ricordato): getFileName() può ovviamente restituire qualsiasi nome di file, ma se vuoi che il browser offra l'apertura del contenuto ricevuto in Excel, allora il file l'estensione dovrebbe essere xls.
Non ho ancora detto nulla di nuovo, tutto questo però è stato inventato prima di me, come verrà descritto di seguito.
Come è stato giustamente notato nei commenti al post sulla generazione xls in PHP, Excel funziona molto più velocemente con XML. Ma il vantaggio più importante, forse, non è la velocità, ma capacità molto più ampie. Non entrerò più in dettaglio, ma fornirò solo un semplice esempio e un collegamento a una descrizione dettagliata di tutti i tag.

Pertanto, dopo aver generato le intestazioni, dobbiamo fornire i dati effettivi all'utente. Di solito avvolgo la generazione della tabella in un metodo separato:
echo $oggetto->getContent();

E genero la tabella usando Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/per ogni)(foreach from=$data.content item=row) (foreach da=$riga elemento=col) ($col)(/per ogni)(/per ogni)

Come puoi vedere dal codice, l'array $data viene passato al modello, contenente due array: la riga del titolo della tabella e i dati stessi.
Vale la pena notare che utilizzare un motore di template solo per generare XML è piuttosto costoso e XML può essere ottenuto in molti altri modi. Nel mio caso particolare, la generazione di XML è solo un piccolo vantaggio in un progetto di grandi dimensioni in cui un motore di template è indispensabile.

Ad esempio, ho fornito una tabella semplice; se lo desideri, puoi manipolare un numero molto maggiore di attributi. Ciò è particolarmente utile considerando che per l'implementazione non sono necessarie librerie di terze parti.
Il metodo descritto funziona su un progetto da diversi anni e nessun singolo utente ha ancora sospettato che i dati che apre non siano un documento di MS Office.

Puoi leggere ulteriori informazioni sulla struttura XML utilizzata in MS Excel in