mySQL para XLS usando o PHP?

Como posso criar um documento .XLS a partir de uma tabela mySQL usando o PHP?

Experimentei praticamente tudo, sem sucesso.

Basicamente, eu preciso pegar dados de formulário e inseri-lo em um database, o que eu fiz, e então eu preciso recuperar esses dados de tabela e analisá-lo em um arquivo do microsoft excel, que precisa ser salvo automaticamente no servidor web.

 $v ) { // take the key and make label // make it uppper case and replace _ with ' ' xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) ); $col++; } // prepare for the first real data row $col = 0; $row++; $first = false; } // go through the data foreach( $qrow as $k => $v ) { // write it out xlsWriteLabel( $row, $col, $v ); $col++; } // reset col and goto next row $col = 0; $row++; } xlsEOF(); exit(); ?> 

Eu simplesmente não consigo descobrir como integrar fwrite em tudo isso para escrever os dados gerados em um arquivo .xls, como eu faria isso?

Eu preciso que isso funcione com bastante urgência, então qualquer ajuda será muito apreciada. Thanx pessoal.

Se você tiver algum tipo de front end para o seu database (como phpMyAdmin ou SQLyog), você pode exportar a tabela (ou o resultado de qualquer consulta SELECT) para o CSV e abrir isso no Excel.

EDIT após comentários: eu criei um XLS uma vez. Foi um pouco diferente, mas o que eu fiz foi colocar isso no topo do meu PHP (antes de gerar qualquer saída):

 header("Content-type: application/vnd.ms-excel"); header("Content-disposition: attachment; filename=\"name.xls\""); 

E no resto do script, acabei de fazer eco de uma tabela (tabela, tr, td … etc.) A execução deste script proporcionaria ao usuário um download. Eu acho que existem algumas opções diferentes para o atributo Content-disposition (talvez haja um que permita que o script guarde o arquivo).

Eu usei o PEAR Spreadsheet_Excel_Writer muito em meus projetos e isso funciona bem. Ele gera arquivos de nível 5.0 do Excel, no entanto, talvez não seja o suficiente para seus propósitos, se você precisar de mais avançado do que isso, mas gerará um .xls nativo e não apenas um .csv mascarando como .xls.

Se eu for correto, o script que você publicou está funcionando corretamente e cria um arquivo xls correto, e você quer apenas salvar a saída, veja http://php.net/manual/en/book.outcontrol.php . Com ob_get_clean (), você pode obter o arquivo xls criado e escrevê-lo em algum lugar para o servidor.

Talvez, você poderia considerar também outras opções, como salvar seus dados em algum outro formato que o Excel pode ler (.csv, provavelmente pode ler também alguma tabela html / xml).

Eu tentei com ob_get_clean (), mas não funcionou, aqui está o código em que já trabalhei:

 < ?php // DB TABLE Exporter // // How to use: // // Place this file in a safe place, edit the info just below here // browse to the file, enjoy! // CHANGE THIS STUFF FOR WHAT YOU NEED TO DO $dbhost = "-"; $dbuser = "-"; $dbpass = "-"; $dbname = "-"; $dbtable = "-"; // END CHANGING STUFF $cdate = date("Ymd"); // get current date // first thing that we are going to do is make some functions for writing out // and excel file. These functions do some hex writing and to be honest I got // them from some where else but hey it works so I am not going to question it // just reuse // This one makes the beginning of the xls file function xlsBOF() { $output = pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); return; } // This one makes the end of the xls file function xlsEOF() { $output .= pack("ss", 0x0A, 0x00); return; } // this will write text in the cell you specify function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); $output .= pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); $file = fopen("exported.xls","w"); fwrite($file, "$output"); fclose($file); return; } // make the connection an DB query $dbc = mysql_connect( $dbhost , $dbuser , $dbpass ) or die( mysql_error() ); mysql_select_db( $dbname ); $q = "SELECT * FROM ".$dbtable." WHERE date ='$cdate'"; $qr = mysql_query( $q ) or die( mysql_error() ); // Ok now we are going to send some headers so that this // thing that we are going make comes out of browser // as an xls file. // //header("Pragma: public"); //header("Expires: 0"); //header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); //header("Content-Type: application/force-download"); //header("Content-Type: application/octet-stream"); //header("Content-Type: application/download"); //this line is important its makes the file name //header("Content-Disposition: attachment;filename=export_".$dbtable.".xls "); //header("Content-Transfer-Encoding: binary "); // start the file xlsBOF(); // these will be used for keeping things in order. $col = 0; $row = 0; // This tells us that we are on the first row $first = true; while( $qrow = mysql_fetch_assoc( $qr ) ) { // Ok we are on the first row // lets make some headers of sorts if( $first ) { foreach( $qrow as $k => $v ) { // take the key and make label // make it uppper case and replace _ with ' ' xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) ); $col++; } // prepare for the first real data row $col = 0; $row++; $first = false; } // go through the data foreach( $qrow as $k => $v ) { // write it out xlsWriteLabel( $row, $col, $v ); $col++; } // reset col and goto next row $col = 0; $row++; } xlsEOF(); exit(); ?> 

Eu nem sei se isso faz sentido, mas adicionei fwrite às funções xlsBOF, xlsEOF e xlsWriteLabel para tentar e escrever os dados no arquivo exportado.xls, isso poderia funcionar assim?

Tudo está funcionando, aqui é onde a resposta está localizada. 🙂

Salvando um arquivo .xls com fwrite