如何使用PHP将SQL表导出为excel格式

如何使用PHP将SQL表导出为excel格式,php,mysql,excel,Php,Mysql,Excel,所以我需要我的SQL表可以下载。现在,我的php文件创建了一个excel文件并强制下载,但excel文件只是有一个很大的数组,其中包含表的数据 这是我的密码 $sql = mysql_query("SELECT * FROM table"); while ($row_user = mysql_fetch_assoc($sql)) { $userinfo[] = $row_user; print_r($row_user); header("Content-Disposition: att

所以我需要我的SQL表可以下载。现在,我的php文件创建了一个excel文件并强制下载,但excel文件只是有一个很大的数组,其中包含表的数据

这是我的密码

$sql = mysql_query("SELECT * FROM table");

while ($row_user = mysql_fetch_assoc($sql))
{   $userinfo[] = $row_user;

print_r($row_user);

header("Content-Disposition: attachment; filename=\"papi.xls\"");
header("Content-Type: application/vnd.ms-excel;");
header("Pragma: no-cache");
header("Expires: 0");
$file = fopen("php://output","w");

foreach($userinfo as $data)
   {
  fputcsv($file,explode(',',$data),"\t");
 }

  fclose($file);
 }

任何帮助都将不胜感激,提前感谢。

有几个PHP库可以帮助您在强制下载之前格式化输出excel文件。我有很好的使用经验

使用PHPExcel不会改变从表中访问数据的方式,但会改变处理MySQL结果的方式:

//Collect result set
$data = array();
while ($row = mysql_fetch_assoc($sql)){ $data[] = $row; }

//initialize PHPExcel object
$objPHPExcel = new PHPExcel();
$objPHPExcel->getProperties()->setCreator("AuthorName")->setTitle("DocumentTitle");

//Write Column Titles into first Row
$col = 'A';
foreach($data[0] as $key => $val){ 
    $objPHPExcel->setActiveSheetIndex(0)->setCellValue($col.1, $key);
    $col++;
}

//Write Data
for($i = 0; $i < count($data); $i++){
    $col = 'A';
    $row = 2 + $i;
    foreach($data[$i] as $val){
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue($col.$row, $val);
        $col++;
    }
}

//Set Header
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="DataExport.xlsx"');
header('Cache-Control: max-age=0');

//Output Results        
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
$objWriter->save('php://output');
//收集结果集
$data=array();
而($row=mysql\u fetch\u assoc($sql)){$data[]=$row;}
//初始化PHPExcel对象
$objPHPExcel=new PHPExcel();
$objPHPExcel->getProperties()->setCreator(“AuthorName”)->setTitle(“DocumentTitle”);
//将列标题写入第一行
$col='A';
foreach($data[0]作为$key=>$val){
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($col.1,$key);
$col++;
}
//写入数据
对于($i=0;$isetActiveSheetIndex(0)->setCellValue($col.$row,$val);
$col++;
}
}
//设置标题
标题('Content-Type:application/vnd.openxmlformats officedocument.spreadsheetml.sheet');
标题('Content-Disposition:attachment;filename=“DataExport.xlsx”);
标头('Cache-Control:max age=0');
//输出结果
$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');
ob_end_clean();
$objWriter->save('php://output');

这绝不是唯一的选项,但是,我发现这个库对于将数据导出到XLSX文件非常有用,并且有其他选项来格式化数据或根据需要添加公式以生成报告

所以,这是我编写的一个类,用于导出到CSV,并使所有内容保持完美排列

<?php
class exporter{
    private $map = array();
    private $data = array();
    private $nr = "\n";
    private $dl = ",";
    private $containerChar = "\"";
    private $exportData = "";


    function extractFullMapData($data){
        $map = array();
        foreach($data as $row){
            foreach($row as $colName => $col){
                if(!in_array($colName, $map)){
                    $map[] = $colName;
                }
            }
        }
        $this->setMap($map);
    }

    function addData($row, $multipleRows){
        if($multipleRows){
            foreach($row as $curRow){
                $this->addData($row);
            }
        }else{
            if(empty($this->map)){
                $this->extractMapData($row);
            }
            $newRow = array();
            foreach($this->map as $varName){
                if(isset($row[$varName])){
                    $newRow[$varName] = str_replace(, "\\".$this->containerChar, $row[$varName]);
                }else{
                    $newRow[$varName] = "";
                }
            }
            $this->data[] = $newRow;
        }
    }

    function export(){
        header('Content-Type: application/csv');
        header('Content-Disposition: attachment; filename="export.csv"');
        header('Pragma: no-cache');
        $this->buildExport();
        echo $this->exportData;
    }

    private function extractMapData($row){
        $this->setMap(array_keys($row));
    }

    private function setMap($map){
        $this->map = $map;
    }

    private function buildExport(){
        $exportData = "";
        foreach($this->map as $varName){
            $exportData .= ($exportData == "") ? "" : $this->dl;
            $exportData .= $this->containerChar.$varName.$this->containerChar;
        }
        foreach($this->data as $data){
            $row = "";
            $looped = false;
            foreach($data as $item){
                $row .= (!$looped) ? "" : $this->dl;
                $row .= $this->containerChar.$item.$this->containerChar;
                $looped = true;
            }
            $exportData .= $this->nr.$row;
        }
        $this->exportData = $exportData;
    }
}
?>

像这样的东西应该可以用。我使用的是PDO,而不是不推荐使用的mysql。我还包括了prepare语句,您可能希望在大多数情况下与bindParam一起使用该语句来防止SQL注入……尽管在本例中不需要它。您会注意到,我还更改了标题以指示CSV文件而不是Excel文件

<?php

$sql = "select * from table";

$dbh = new PDO("mysql:host=localhost; dbname=MYDB", "DBUSER", "DBPASSWORD");
$stmt = $dbh->prepare($sql);
$stmt->execute();

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');

$out = fopen('php://output', 'w');

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    fputcsv($out, $row);
}

fclose($out);

FYI。它们不再得到维护。看到了吗?相反,学习,并使用或-将帮助您决定哪一个最适合您。谢谢您的快速回答。我正在使用的服务器使用的是早期版本的PHP,因此在我的情况下不会贬值。它已被弃用,您可以使用它,因为它尚未从您的服务器中删除。但一旦升级PHP,应用程序就会死掉。基本上,您正在编写非常临时的代码。它是否需要特定的excel文件,因为CSV将是一个更快的导出,并且不需要PHP中的任何外部库,只需要一个foreach循环。CSV很容易在excel中打开。不,不需要。xls它只需要采用与excel兼容的格式。这并不能回答问题question@JohnConde,很公平,我将用一个例子来更新。我的意思是格式化输出将有助于获得所需的结果谢谢,我将尝试一下。当我尝试此操作时,我遇到了一个内部服务器错误。你知道为什么会这样吗。我已经安装了PHPExcel。@RayMayo,我需要查看导致http 500错误的特定php错误才能回答这个问题。这很可能是由于代码中的语法错误,但如果没有更多信息,我无法确定。非常感谢,我将尝试一下。但是,您在顶部的变量上添加了哪些“私有”属性?我假设它们是为了安全。私有属性在那里,因此它们在运行时无法更改,如果您愿意,可以将它们公开。此代码从表中提取数据的确切位置是哪里?@RayMayo这只需要获取一个关联行数组,并将其转换为CSV文件。在上面的第二个代码块之前,您需要分别进行数据库调用。我如何将mySQL表添加到此代码块中?
<?php

$sql = "select * from table";

$dbh = new PDO("mysql:host=localhost; dbname=MYDB", "DBUSER", "DBPASSWORD");
$stmt = $dbh->prepare($sql);
$stmt->execute();

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');

$out = fopen('php://output', 'w');

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    fputcsv($out, $row);
}

fclose($out);