Я должен создать скрипт, который принимает таблицу mySQL, и экспортирует его в формат .XLS, а затем сохраняет этот файл в указанную папку на веб-хосте.
Я получил его работу, но теперь я не могу заставить его автоматически сохранять файл в папку без запроса пользователя.
Он должен запускаться каждый день в определенное время, поэтому он может сохранить предыдущие дни в файле .XLS на веб-хосте.
Вот код:
<?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() { echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); return; } // This one makes the end of the xls file function xlsEOF() { echo pack("ss", 0x0A, 0x00); return; } // this will write text in the cell you specify function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); echo $Value; 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(); ?>
Я попытался использовать, fwrite, чтобы выполнить это, но, похоже, это не очень хорошо, я также удалил информацию заголовка, но ничего не получилось.
Вот оригинальный код, как я его нашел, любая помощь будет принята с благодарностью. 🙂
Thanx заранее. 🙂
Во-первых, поскольку вы сохраняете это на диске через cron, вы должны удалить все вызовы header (), как вы подозревали. Чтобы переписать как можно меньше кода, я бы рекомендовал использовать буферизацию вывода ( http://www.php.net/manual/en/ref.outcontrol.php ). Чтобы выполнить это, поместите вызов ob_start () перед началом вывода файла:
ob_start(); // start the file xlsBOF();
После завершения вывода закройте выходной буфер, запишите его содержимое и напишите в файл:
xlsEOF(); // $filename should be set to some writeable location file_put_contents($filename, ob_get_clean());
Вот окончательный код, он работает как шарм.
<?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 $cdate = date("Ymd"); $dbhost = "-"; $dbuser = "-"; $dbpass = "-"; $dbname = "-"; $dbtable = "-"; $filename = "exported_on_$cdate.xls"; // END CHANGING STUFF // 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() { echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); return; } // This one makes the end of the xls file function xlsEOF() { echo pack("ss", 0x0A, 0x00); return; } // this will write text in the cell you specify function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); echo $Value; 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() ); //start the object ob_start(); // 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(); //write the contents of the object to a file file_put_contents($filename, ob_get_clean()); ?>
Thanx для всех помогите парням !!!
Это xls или xsl формат файла? Я смутился.
Во-первых: вам нужно настроить стили шрифтов, использовать несколько вкладок, использовать формулы? Если да, попробуйте пойти на библиотеку excel, такую как phpwriteexcel.
В противном случае достаточно простого файла csv (значение, разделенное запятой, очень легко созданное из массивов, отлично читаемое с помощью Excel и других программных таблиц).
Затем, чтобы сохранить его автоматически, не запрашивая: перейдите к запланированной задаче task / cron, вызвав ваш скрипт.