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

Posted

技术标签:

【中文标题】PHP打印表格并下载表格的xls文件不起作用【英文标题】:PHP print table and download xls file of table not working 【发布时间】:2011-11-19 06:40:47 【问题描述】:

我有一个 .php 页面,其中显示了一个类似于此的 html 表格:-

<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 打印代码停止工作。

我不知道问题是什么,除了有一种模糊的感觉,我可能应该将表格打印和 xls 文件保存在不同的 PHP 文件中,这可能会解决我的问题,但我我不知道该怎么做。

首先我想知道为什么这样做会出现问题,其次,有没有解决这个问题的好方法?

【问题讨论】:

【参考方案1】:

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

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

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

我相信您现在正在做的事情是做到这一点的最佳方式。您可以保持 php 代码原样,但在您的 html 中添加一个下载链接,该链接将引用同一页面(但在 url 中带有 xls=y)。这将允许只想查看文件的人查看文件,而想要下载 xls 的人将能够在看到 xls 后下载。

【讨论】:

这是一个绝妙的建议,非常感谢那个 Pranav。请问我将如何将链接添加到我的html到同一页面,以及我将它放在哪里?为了争论,我们可以假设页面被称为 page1.php 如果这有帮助吗?再次感谢您的关注和帮助。 很高兴为您提供帮助!欢迎来到 ***。接受并投票您认为有帮助的答案:) 所以要链接到同一页面,您可以像这样添加链接:&lt;a href="./page1.php?xls=y&amp;anotherArg=val1&amp;yetAnother=val2&amp;andSoOn=1"&gt;Download xls&lt;/a&gt; 我假设您需要其他参数来生成表格(因为否则为硬编码表格制作 php 是没有意义的,对吧?) 再次感谢 Pranav,您的方法看起来正是我所需要的。一个小问题是我确实在初始 URL 中传递了另一个变量,并且我想在链接中包含该变量,但我正在努力做到这一点。我在 php 中提取变量并将其保存在名为 $ids 的变量中,但我似乎无法将 $ids 添加到我们放入 HTML 的链接代码中。是否有捷径可寻 ?再次感谢您的帮助。我尝试过投票,但这是我在这里的第一天,似乎还没有足够的信誉来做到这一点。对此表示歉意。 :-(

以上是关于PHP打印表格并下载表格的xls文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我用于邮寄表格的 php 脚本不起作用

为啥这个表格不起作用?

联系表格 PHP 重定向不起作用

as3 - 联系表格不起作用

UITableViewCell 样式字幕多行不起作用

添加表格视图单元格在 iOS 中不起作用?