如何使用PHP将SQL表导出为ex​​cel格式

时间:2017-05-03 14:23:05

标签: 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: 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);
 }

非常感谢任何帮助,谢谢你。

3 个答案:

答案 0 :(得分:2)

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

使用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');

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

答案 1 :(得分:0)

所以,这是我写的一个类,用于导出到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;
    }
}
?>

此代码源自我在我的框架中编写的类,它处理大量事物的导出。我还写了一个可以回读这些数据的类。这个类的使用方式是这样的。

<?php
    $exporter = new exporter();
    $exporter->extractFullMapData($fullDataArray);
    $exporter->addData($fullDataArray, true);
    $exporter->export();
?>

答案 2 :(得分:0)

这样的事情应该有效。我正在使用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);

我认为让你失望的主要原因可能是你的爆炸声明,这通常是fputcsv所不需要的。但是,我不熟悉您的数据。

这是您编写CSV文件的示例。如果您更喜欢Excel .xls或.xlsx文件,则可以使用PHPExcel。设置确实需要更长的时间,文档并不是最好的,但是它做得很好。