所以我需要我的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);
}
非常感谢任何帮助,谢谢你。
答案 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。设置确实需要更长的时间,文档并不是最好的,但是它做得很好。