将数组导出到Excel

时间:2011-09-28 19:33:30

标签: php sql arrays excel

我正在尝试将数组数组导出为ex​​cel。我把它设置为头变量,以及一个数据变量,它基本上构建了一个在导出中执行的巨型字符串。但是,只有标头变量才能通过。让我展示一些代码:

这是设置参数:

    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变量。

3 个答案:

答案 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;