我需要生成一个excel文件(xls),并在生成文件后触发下载。 我在documentation中找到了这个示例。
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');
$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');
它显示了如何创建一个excel文件并将其保存在服务器上。
我如何才能将结果提供给客户,然后“强迫”他下载?
我需要以某种方式获取$writer
的数据。
我目前正在解决此问题,而没有PhpSpreadsheet:
// Excel Export
$filename = 'export_'.date('d-m-y').'.xls';
$filename = $validator->removeWhitespace($filename);
header('Content-type: application/ms-excel');
header('Content-Disposition: attachment; filename='.$filename);
exit($response["output"]); // <-- contains excel file content
但是它不能与我的定界符(分号)一起使用。分号没有得到解释,所有内容都被写入一列。
如果我将其导出为.csv,则可以使用。但我需要使用.xls或.xlsx
答案 0 :(得分:7)
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class DownloadExcel
{
public static function createExcel(array $data, array $headers = [],
$fileName = 'data.xlsx')
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
for ($i = 0, $l = sizeof($headers); $i < $l; $i++) {
$sheet->setCellValueByColumnAndRow($i + 1, 1, $headers[$i]);
}
for ($i = 0, $l = sizeof($data); $i < $l; $i++) { // row $i
$j = 0;
foreach ($data[$i] as $k => $v) { // column $j
$sheet->setCellValueByColumnAndRow($j + 1, ($i + 1 + 1), $v);
$j++;
}
}
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="'. urlencode($fileName).'"');
$writer->save('php://output');
}
}
这就是我用PhpSpreadsheet创建电子表格并将其直接输出到php:// output进行下载的方式。
答案 1 :(得分:4)
我遇到了同样的问题,并在这里找到了解决方法:https://github.com/PHPOffice/PhpSpreadsheet/issues/217
我的方法以$writer->save('php://output');
结尾,然后以exit()
答案 2 :(得分:1)
我的回答: PHP:
venues
(
venue_no,
name,
primary key (venue_no)
);
rooms
(
venue_no,
room_no,
name,
primary key (venue_no, room_no),
foreign key (venue_no) references venues (venue_no)
)
tables
(
venue_no,
room_no,
table_no,
name,
primary key (venue_no, room_no, table_no),
foreign key (venue_no, room_no) references rooms (venue_no, room_no),
unique constraint (venue_no, name)
)
JS:
$writer = new Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$ret['data'] = base64_encode(ob_get_contents());
ob_end_clean();
答案 3 :(得分:0)
致电ob_end_clean();在$ writer-> save('php:// output')之前。
ob_end_clean();
$writer->save('php://output');
答案 4 :(得分:-1)
我通过一种解决方法解决了它。我将文件临时保存在服务器上,然后将内容加载到变量中并作为下载文件使用。然后,我从服务器上删除文件。
解决方法:
$date = date('d-m-y-'.substr((string)microtime(), 1, 8));
$date = str_replace(".", "", $date);
$filename = "export_".$date.".xlsx";
try {
$writer = new Xlsx($response["spreadsheet"]);
$writer->save($filename);
$content = file_get_contents($filename);
} catch(Exception $e) {
exit($e->getMessage());
}
header("Content-Disposition: attachment; filename=".$filename);
unlink($filename);
exit($content);