PHPExcel:在客户端下载Excel文件

12
问题已解决:对于可能遇到此问题的其他用户,请注意PHP文件的编码。如果您使用PHPExcel,则必须是ANSII编码而不是UTF8,否则Excel文件将无法正确下载。添加的头信息(答案1)在我更改了文件本身的编码后解决了这个问题。
我正在使用PHPExcel从MYSQL DB中的表格创建EXCEL,以便用户可以将其下载到自己的计算机上。
下面的代码创建了一个正确的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,则可以正常工作,但这当然是手动更改,我需要一个正常工作的Excel才能让用户使用。

这个错误是什么?

我的代码可行(但将文件下载到服务器):

<?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');


?>

哦天啊,你救了我的命。我已经因为无限的谷歌搜索而头痛不已,但是多亏了你,我没有发疯。 - gyc
4个回答

11

移除以下引用:

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");)之前插入以下代码:

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="filename.xlsx"');
header('Cache-Control: max-age=0');
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');

我现在会尝试。什么是Flash? - Alex
不行,不起作用。Excel 文件中仍然有很多奇怪的符号,而且我的 Excel(2010 版本)警告说该文件格式奇怪。下载到我的电脑上的文件(results)却可以正常使用 :( - Alex
问题在于这个文件保存为UTF8格式,如果我将其编码为ANSI格式,则可以正常工作,但这当然是手动更改,我需要一个正常工作的Excel来让用户使用。 - Alex

0

Alex,我也遇到了同样的问题。 我做了所有的事情,但结果还是一样。 我只是更改了

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

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

并将所有的.xlsx更改为.xls

希望这会有所帮助。


0
  1. 从Github下载PHPExcel-1.8并将其替换为旧的PHPExcel。
  2. 将PHPExcel-1.8重命名为PHPExcel。在我的代码中,我已经包含了require '../library/excel/PHPExcel.php';
  3. 我删除了此文件(PHPExcel.php)中的所有内容,并添加了一行代码require 'PHPExcel/Classes/PHPExcel.php';

(注意:我将PHPExcel上传到了library/excel文件夹中) 完美运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接