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

rmbxnbpk  于 2023-03-04  发布在  PHP
关注(0)|答案(3)|浏览(154)

所以我需要我的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);
 }

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

qv7cva1a

qv7cva1a1#

有几个PHP库可以帮助你在强制下载之前格式化你的输出excel文件。我使用PHPExcel有很好的经验。
使用PHPExel不会改变从表中访问数据的方式,但会改变处理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文件很有用,并且有额外的选项来格式化它或根据生成报告的需要添加方程。

wlsrxk51

wlsrxk512#

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

lkaoscv73#

类似这样的东西应该可以工作。我使用PDO而不是过时的mysql。我还包含了准备语句,您可能希望在大多数情况下与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);

我想让您感到困惑的主要原因可能是您的explode语句,fputcsv通常不需要该语句,但是,我对您的数据并不熟悉。
下面是你写CSV文件的例子。如果你更喜欢Excel .xls或.xlsx文件,你可以使用PHPExel。它确实需要更长的时间来设置,文档也不是最好的,但它做得很好。

相关问题