【问题标题】:PHPExcel output to browser not workingPHPExcel输出到浏览器不起作用
【发布时间】:2014-12-09 04:18:50
【问题描述】:

我并不是真正的 PHP 专家,因为我过去的经验主要面向系统工程方面。 当我想将我的 XLSX 文件输出到浏览器时,我遇到了 PHPExcel 的问题,它给了我这个错误“无法修改标头信息 - 标头已在第 1 行发送”。

这是我的代码示例

$host="localhost";
$uname="lol";
$pass="lol123";
$database = "lol12345"; 
$table="MemReport";
$table1="CPUReport";
$table2="TrafficReport";
$table3="HDDReport";


// create a file pointer connected to the output stream
$output = fopen('Memory.csv', 'w+');
$output1 = fopen('CPU.csv', 'w+');
$output2 = fopen('Traffic.csv', 'w+');
$output3 = fopen('HDD.csv', 'w+');

// output the column headings
fputcsv($output, array('HostName','Date','Time','Percent','TholdDescription'));
fputcsv($output1, array('HostName','Date','Time','Percent','TholdDescription'));
fputcsv($output2, array('HostName','Date','Time','Percent','TholdDescription'));
fputcsv($output3, array('HostName','Date','Time','Percent','TholdDescription'));

// fetch the data
mysql_connect($host, $uname, $pass);
mysql_select_db($database);
echo mysql_error(); 

$rows = mysql_query("SELECT * FROM $table order by date ASC, Time ASC");
echo mysql_error(); 
$rows1 = mysql_query("SELECT * FROM $table1 order by date ASC, Time ASC");
echo mysql_error(); 
$rows2 = mysql_query("SELECT * FROM $table2 order by date ASC, Time ASC");
echo mysql_error();
$rows3 = mysql_query("SELECT * FROM $table3 order by date ASC, Time ASC");
echo mysql_error(); 
// loop over the rows, outputting them
while ($row = mysql_fetch_assoc($rows)) 
fputcsv($output, $row);
while ($row1 = mysql_fetch_assoc($rows1))   
fputcsv($output1, $row1);
while ($row2 = mysql_fetch_assoc($rows2))
fputcsv($output2, $row2);
while ($row3 = mysql_fetch_assoc($rows3))
fputcsv($output3, $row3);


include '/tmp/Classes/PHPExcel/IOFactory.php';


$inputFileType = 'CSV';
$inputFileNames = array('HDD.csv','Traffic.csv','CPU.csv','Memory.csv');
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$inputFileName = array_shift($inputFileNames);
$objPHPExcel = $objReader->load($inputFileName);

$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));
foreach($inputFileNames as $sheet => $inputFileName) {
    $objReader->setSheetIndex($sheet+1);
    $objReader->loadIntoExisting($inputFileName,$objPHPExcel);
    $objReader->loadIntoExisting($inputFileName,$objPHPExcel);
    $objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));

}

$loadedSheetNames = $objPHPExcel->getSheetNames();
foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);

$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
//var_dump($sheetData);
//var_dump($sheetData);

$myfile = "Report.xlsx";
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

header("内容配置:附件;文件名=$myfile"); header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');


}

感谢您的帮助,我的大部分代码已被复制和粘贴,然后据我所知进行了编辑,我也能够通过电子邮件发送 xlsx 文件,但发送下载时遇到问题。 我不介意从目录中读取文件以供下载。

问候,

【问题讨论】:

  • 只要确保在脚本的 header() 函数之前没有回显任何内容。注释掉您回显某些内容的行,并尝试删除文件开头的空格或空行。
  • 感谢您的回答,所以即使是错误的回声也是不允许的?
  • 一般来说,你甚至不能回显一个空格,因为你会用那个空格过早地发送标题。
  • 没有空格或制表符,没有错误消息,没有换行符,没有 BOM 标记,没有任何其他输出

标签: php header output phpexcel


【解决方案1】:

没有空格或制表符,没有错误消息,没有换行符,没有 BOM 标记,没有任何其他输出。

请注意,您看到的错误消息会告诉您哪个文件/行负责输出 headers already sent by xxx in line 1.... 所以这就是查看的位置。

在文件的第 1 行,它很可能是您打开 <?php 标记之前的内容,或者是使用 BOM 标头保存的文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2013-05-05
    相关资源
    最近更新 更多