为什么我不能通过cURL / PHP生成Excel文件?

时间:2010-01-31 20:48:01

标签: php post curl export-to-excel

我正在尝试使用post表单来选择从MySQL数据库中获取哪些数据后生成excel文件。我正在使用cURL,因为我基本上想要双重发布:首先保存正在使用哪些字段的设置,然后再生成Excel文件,所有这些都只需一个按钮。

我有一个PHP页面设置正确的标题,从标签分隔的内容生成一个简单的Excel文件(不处理字段中的行结尾或标签,只是保持简单)。如果我直接使用浏览器点击该页面(并在PHP中包含虚拟数据),我的浏览器会下载一个Excel文件。

我通过cURL帖子将数据传到此页面(如果我不通过cURL发送标题 - ??)。

这就是我迷路的地方:

如何通过cURL创建/下载Excel文件数据?

我的猜测是它与标题有关吗?

在PHP中设置标头工作得相当不错:

header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
header("Pragma: public");
header("Cache-control: max-age=0");

当我通过cURL设置它们时,我这样做了(好吧,这些都是我的cURL选项):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $foo);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Disposition: attachment; filename=test.xls',
    'Content-Type: application/vnd.ms-excel; charset=UTF-8',
    'Pragma: public',
    'Cache-control: max-age=0'
));
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$response_code = curl_exec($ch);
if ($response_code!== false) {
    echo 'response: '.$response_code;
} else {
    echo 'error: '.curl_error($ch);
}
curl_close ($ch);           

当我这样做时,我在发送页面上看到的cURL $ response_code看起来像这样(我已经把这些行打破了 - 它只是一行):

HTTP/1.1 200 OK 
Date: Sun, 31 Jan 2010 20:43:38 GMT 
Server: Apache 
Transfer-Encoding: chunked 
Content-Type: text/html

当我不通过cURL包含标题时,$ _POST正在运行。但是当我包含标题时,$ _POST不起作用。

Transfer-Encoding: chunked似乎是一个线索。但最初的研究对我没有帮助,部分是因为,正如我所提到的,我迷失了。

有什么想法吗?

谢谢! -Jeremy

2 个答案:

答案 0 :(得分:0)

我相信CURLOPT_HTTPHEADER设置请求的标头...而不是响应。就$_POST而言,你的意思是什么不起作用?您是否为帖子请求设置了CURLOPT(默认为get)?

答案 1 :(得分:0)

我认为你从根本上误解了内容的传递方式。内容类型标题只是指出了预期的格式,但您仍然必须以该格式生成数据。

查看Excel文件格式,这不是一项简单的任务。有一个基于PHP的类使用COM编写Excel文件(仅适用于Windows服务器):here我自己没有使用它。

然后有PHPExcel使用新的基于XML的Excel格式并独立工作平台。我也不知道,但它看起来不错。

请记住,总是有可能提供普通的旧CSV,并在Excel中打开它。它留下了很少的选项(没有列设计等),但是可以在没有任何库或扩展的情况下开箱即用。

另外,我不确定在这种情况下你想用cURL做什么?你不是试图在服务器端下载任何东西,如果我理解正确的,是吗?