PHP打印表和下载xls文件的表不起作用

时间:2011-11-19 06:40:48

标签: php file html-table save xls

我有一个显示与此类似的HTML表格的.php页面: -

<table border="1">
    <tr bgcolor="DCDCDC">
      <th><div align="center"><b>Data1</b></div></th>
      <th><div align="center"><b>Data2</b></div></th>
      <th><div align="center"><b>Data3</b></div></th>
    </tr>

表格下面显示了一些数据。如果用户想要将表的.xls文件下载到他们的PC,我允许在URL中传递变量。文件下载代码与此类似: -

function savexls(){
   $data = array( array("Data1" => "Mary", "Data2" => "Johnson", "Data3" => 25), 
         array("Data1" => "Amanda", "Data2" => "Miller", "Data3" => 18), 
         array("Data1" => "James", "Data2" => "Brown", "Data3" => 31), 
         array("Data1" => "Patricia", "Data2" => "Williams", "Data3" => 7), 
         array("Data1" => "Michael", "Data2" => "Davis", "Data3" => 43), 
         array("Data1" => "Sarah", "Data2" => "Miller", "Data3" => 24), 
         array("Data1" => "Patrick", "Data2" => "Miller", "Data3" => 27) ); 

   # filename for download 
   $filename = "Dividend Data " . date("F j, Y") . ".xls"; 

   header("Content-Disposition: attachment; filename=\"$filename\""); 
   header("Content-Type: application/vnd.ms-excel"); 

   $flag = false; 
   foreach($data as $row) {
      if(!$flag) { 
         # display field/column names as first row 
         echo implode("\t", array_keys($row)) . "\r\n"; 
         $flag = true; 
      } 
      array_walk($row, 'cleanData'); 
      echo implode("\t", array_values($row)) . "\r\n"; 
   }
}

function cleanData(&$str) 
{ 
   $str = preg_replace("/\t/", "\\t", $str);
   $str = preg_replace("/\r?\n/", "\\n", $str); 
   if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"'; 
} 

如果在URL中检索变量,我使用以下代码行调用php代码中的savexls()函数: -

if ($xls=="y") {
   savexls();
}

我遇到的问题是,如果我在URL中声明了?xls = y,则html表数据不会输出到屏幕,尽管xls文件会被下载到PC。

如果我没有声明?xls = y那么.XLS文件不会被下载,并且HTML表格会在屏幕上打印得很好。

为什么写.xls文件的行为会阻止正在打印到屏幕上的其他HTML表格?它们对我来说看起来像是完全独立的功能,但是保存文件似乎会阻止第一个HTML打印代码停止执行它的工作。

我对问题是什么感到困惑,除了模糊的感觉我应该在不同的PHP文件中进行表格打印和xls文件保存,这可能解决了我的问题,但是我我不知道该怎么做。

首先,我想知道为什么这样做有问题,其次,有没有一个好方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

请注意savexls()函数发送excelsheet标题

header("Content-Disposition: attachment; filename=\"$filename\""); 
header("Content-Type: application/vnd.ms-excel"); 

在回复中。这使得浏览器认为返回的响应是xls文件的内容。

我相信你现在正在做的是最好的方法。您可以保持PHP代码不变,但是为您的html添加一个下载链接,该链接将引用同一页面(但在网址中包含xls=y)。这将允许只想查看文件的人查看它,想要下载xls的人可以在看到xls后下载它。