PHPExcel: загрузить файл Excel на стороне клиента

Проблема была решена: для других пользователей, которые могут иметь эту проблему, – обратите внимание на кодировку файла PHP. Если вы используете PHPExcel, это должна быть ANSII-кодировка, а не UTF8, иначе EXCEL будет загружаться коррумпированно. Заголовки, которые были добавлены (ответ 1), решили проблему после того, как я изменил кодировку самого файла.

Я использую PHPExcel для создания EXCEL из таблицы в базе данных MYSQL, поэтому пользователь может загрузить ее на свой компьютер.

В приведенном ниже коде создается правильный файл Excel, но проблема в том, что он загружается на мой сервер. Я прочитал в руководстве PHPExcel, что мне нужно добавить заголовки:

header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$name.'.xls"'); header('Cache-Control: max-age=0'); header('Cache-Control: max-age=1'); header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header ('Last-Modified: '.gmdate('D, d MYH:i:s').' GMT'); // always modified header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header ('Pragma: public'); // HTTP/1.0 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); 

Но если я это сделаю, скачанный файл: 1. Имеет некоторые jibrish внутри 2. Говорит, что Excel должен исправить это, потому что файл не очень хорош. Проблема в том, что этот файл сохраняется как UTF8, и если я кодирую его как ANSI, тогда он работает исправно, но, конечно, это ручное изменение, и мне нужно работать исправно, чтобы достичь пользователей.

Что такое ошибка?

Мой код, который работает (но загружает файл на сервер):

 <?php include 'connection.php'; include 'checkUser.php'; //Getting all the needed information from the DB $task_id=$_GET['id']; $query2 = "SELECT * FROM projects WHERE ProjectID=$task_id"; $data2 = mysqli_query($con, $query2); $row = mysqli_fetch_array($data2); $project_type = $row['ProjectType']; $project_name = $row['ProjectName']; switch ($project_type){ case 2: $NumberOfRows=22; $project = "slivedetails"; break; case 3: $NumberOfRows=30; $project = "plivedetails"; break; default: $NumberOfRows=0; $project = "none"; } //column names if ($project="slivedetails"){ $ColumnNames = mysqli_query($con,"SHOW COLUMNS FROM slivedetails") or die("mysql error"); } else if ($project="plivedetails"){ $ColumnNames = mysqli_query($con, "SHOW COLUMNS FROM plivedetails") or die("mysql error"); } $query = "SELECT * FROM $project WHERE TaskID=$task_id"; $data = mysqli_query($con, $query); $num_rows = mysqli_num_rows($data); /** Include PHPExcel */ require_once 'PHPExcel_1.7.9_doc/Classes/PHPExcel.php'; require_once 'PHPExcel_1.7.9_doc/Classes/PHPExcel/IOFactory.php'; // create new PHPExcel object $objPHPExcel = new PHPExcel(); $objPHPExcel = new PHPExcel(); // writer already created the first sheet for us, let's get it $objSheet = $objPHPExcel->getActiveSheet(); // rename the sheet $objSheet->setTitle('Task Results'); // let's bold and size the header font and write the header // as you can see, we can specify a range of cells, like here: cells from A1 to A4 $objSheet->getStyle('A1:AD1')->getFont()->setBold(true)->setSize(12); $char = 65; // write header] for ($i=1;$i<=$NumberOfRows;$i++){ $col_name = mysqli_fetch_array($ColumnNames); $objSheet->getCell(chr($char).'1')->setValue($col_name['Field']); $char++; } // Now we need to get the data from the DB. While we have a row in the result: $rowIterator=2; //our row number. We begin from 2 because the first one is the title. while ($RowInfo = mysqli_fetch_array($data)){ //We will fill the information based on the amount of columns: $char = 65; //we set the first char as column A for ($i=0;$i<$NumberOfRows;$i++){ $objSheet->getCell(chr($char).$rowIterator)->setValue($RowInfo[$i]); $char++; } $rowIterator++; } // autosize the columns $char = 65; for ($i=1;$i<=$NumberOfRows;$i++){ $objSheet->getColumnDimension(chr($char))->setAutoSize(true); $char++; } // create the writer $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('results.xlsx'); ?> 

Удалите следующее включение:

 require_once 'PHPExcel_1.7.9_doc/Classes/PHPExcel/IOFactory.php'; 

Вы дважды объявили объект. Удалите один из них:

 // create new PHPExcel object $objPHPExcel = new PHPExcel(); 

Вставьте следующие заголовки непосредственно перед созданием Writer:

 header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header("Content-Disposition: attachment; filename=\"results.xlsx\""); header("Cache-Control: max-age=0"); 

Вместо следующего (что фактически сохраняет файл на сервере):

 $objWriter->save('results.xlsx'); 

Вставьте следующее (которое создаст загружаемый файл):

 $objWriter->save("php://output"); 

Это должно решить текст тарабарщины. Если вы все еще получаете такой текст, вставьте следующий код перед последней строкой ( $objWriter->save("php://output"); ):

 ob_clean(); 

Это сработало для меня. Надеюсь, поможет.

Это должно работать, попробуйте изменить свой код следующим образом:

 header("Content-Type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=my_excel_filename.xls"); header("Pragma: no-cache"); header("Expires: 0"); flush(); require_once 'PHPExcel.php'; $objPHPExcel = new PHPExcel(); // here fill data to your Excel sheet $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); 

Алекс, у меня была такая же проблема. Я сделал все, но результат снова был таким же. Я просто изменил $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

в

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

и изменил все .xlsx на .xls .

Надеюсь, это поможет.