我正在尝试将数组数组导出为excel。我把它设置为头变量,以及一个数据变量,它基本上构建了一个在导出中执行的巨型字符串。但是,只有标头变量才能通过。让我展示一些代码:
这是设置参数:
str_replace(" ", "_", $getData['name']);
$filename = $getData['name']."_summary.xls";
header("Content-Type: application/x-msdownload");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Pragma: no-cache");
header("Expires: 0");
这是获取信息的功能:
foreach($tempRS as $key=>$value)
{
foreach($value as $iKey=>$iValue)
{
if($count == 6)
{
$iValue = str_replace('"', '""', $iValue);
$iValue = '"'.$iValue.'"'."\n";
$data .= trim($iValue);
$count = 0;
}
else
{
$iValue = str_replace('"', '""', $iValue);
$iValue = '"'.$iValue.'"'."\t";
$data .= trim($iValue);
$count++;
}
}
}
$header = "ROW HEADER 1\tROW HEADER 2\tROW HEADER 3\tROW HEADER 4\tROW HEADER 5\tROW HEADER 6\n";
print "$header\n$data";
我似乎无法弄清楚为什么我在导出时丢失$ data变量。
答案 0 :(得分:2)
为什么不只是fputcsv()
为您生成CSV数据?或者更好的是,您可以使用PHPExcel输出本机.xls / .xlsx,并在生成的电子表格中使用格式和公式,而不是将.csv伪装成Excel文件。
答案 1 :(得分:1)
首先,使用echo而不是print。打印会导致负载开销,因为它会返回并回显数据。
其次,不要将变量放在引号内,使用
echo $header ."\n".$data;
要解决您的问题,foreach循环是否实际循环?您是否检查了$ data是否包含任何数据?
更好的解决方案可能是:
$header = '';
echo $header;
foreach() loop here {
//echo the data here instead of putting it in a variable
}
或者更好,请使用http://nl.php.net/fputcsv
答案 2 :(得分:0)
我测试了您的代码,似乎您的trim()
方法正在修剪\n
和\t
。
如果删除它,您的代码应该没问题。
这是我在excel中导出产品数组的代码。
此代码只有一个小问题:Excel不希望因格式问题而打开它,但如果在提示错误消息时单击“是”,您就可以了... 强>
开放式办公室没问题
处理修复...
$filename = "products_exports " . date("Y-m-d H_i_s") . ".xls";
/**
* Tell the browser to download an excel file.
*/
header("Content-Type: application/x-msdownload; charset=utf-8");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Pragma: no-cache");
header("Expires: 0");
/**
* The header of the table
* @var string
*/
$header = "";
/**
* All the data of the table in a formatted string
* @var string
*/
$data = "";
//We fill in the header
foreach ($productArray as $i => $product) {
$count = 0;
foreach ($product as $key => $value) {
if($count == count((array)new Product("")) - 1){
$header.= $key;
}
else{
$header.= $key . "\t";
$count++;
}
}
break; /*One loop is enough to get the header !*/
}
//And then the data by the product and all the categories
/*Where $productArray = This can be your custom array of object. eg.
array[0] = new YouCustomObject(your params...);
*/
foreach ($productArray as $i => $product) {
$count = 0;
foreach ($product as $key => $value) {
if($count == count((array)new Product("")) - 1){
$value = str_replace('"', '""', $value);
$value = '"' . $value . '"' . "\n";
$data .= $value;
$count = 0;
}
else{
$value = str_replace('"', '""', $value);
$value = '"' . $value . '"' . "\t";
$data .= $value;
$count++;
}
}
}
echo $header ."\n". $data;