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 M Y H: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. Имеет некоторую
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 get it
$objSheet = $objPHPExcel->getActiveSheet();
// rename the sheet
$objSheet->setTitle('Task Results');
// let 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');
?>
Ответы
Ответ 1
Удалите следующее включение:
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();
Это сработало для меня. Надеюсь, что это поможет.
Ответ 2
Это должно работать, попробуйте изменить свой код следующим образом:
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');
Ответ 3
Алекс, у меня была такая же проблема. Я сделал все, но результат снова был таким же. Я просто изменил
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
к
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
и изменил все .xlsx
на .xls
.
Надеюсь, это поможет.
Ответ 4
Но мы получаем неподдерживаемый текст