0

在选择从 MySQL 数据库中获取哪些数据后,我正在尝试使用 post 表单生成一个 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似乎是一个线索。但最初的研究对我没有帮助,部分原因是,正如我所提到的,我迷路了。

有任何想法吗?

谢谢!
-杰里米

4

2 回答 2

0

好吧,我相信CURLOPT_HTTPHEADER为请求设置标题......而不是响应。至于$_POST去你是什么意思它不工作?您是否设置CURLOPT了 post 请求(默认为 get)?

于 2010-01-31T20:53:12.227 回答
0

我认为您对内容的交付方式从根本上是错误的。内容类型标头只是指出预期的格式,但您仍然必须实际生成该格式的数据。

查看 Excel 文件格式,这并非易事。有一个基于 PHP 的类,它使用 COM 编写 Excel 文件(并且只在 Windows 服务器上工作):虽然我自己没有使用它。

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

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

另外,我不确定你想在这种情况下使用 cURL 做什么?如果我理解正确,您不会尝试在服务器端下载任何内容,是吗?

于 2010-01-31T20:54:41.150 回答