本地环境Windows10 子系统 ubuntu 18.04 PHP 版本 7.4.29 composer require phpoffice/phpspreadsheet
`<?php namespace Lib;
use Hyperf\HttpMessage\Stream\SwooleStream; use Hyperf\HttpServer\Response; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet;
class ExportExcelHandle { private spreadsheet; private $row;
//构造函数 创建一个PhpSpreadsheet实例
public function __construct()
{
// Create new Spreadsheet object
$this->spreadsheet = new Spreadsheet();
// Set document properties
$this->spreadsheet->getProperties()->setCreator('Maarten Balliauw')
->setLastModifiedBy('Maarten Balliauw')
->setTitle('Office 2007 XLSX Test Document')
->setSubject('Office 2007 XLSX Test Document')
->setDescription('Test document for Office 2007 XLSX, generated using PHP classes.')
->setKeywords('office 2007 openxml php')
->setCategory('Test result file');
// Add some data
$this->spreadsheet->setActiveSheetIndex(0);
$this->sheet = $this->spreadsheet->getActiveSheet();
// Rename worksheet
$this->spreadsheet->getActiveSheet()->setTitle('Sheet1');
}
//设置表头
public function setHeader($title)
{
foreach ($title as $key => $item) {
$this->sheet->setCellValue(chr($key + 65) . '1', $item);
}
$this->row = 2; // 从第二行开始
return $this;
}
//添加表内容
public function addData($data)
{
foreach ($data as $item) {
$dataCol = 'A';
foreach ($item as $value) {
// 单元格内容写入
$this->sheet->setCellValue($dataCol . $this->row, $value);
$dataCol++;
}
$this->row++;
}
return $this;
}
//保存到服务器本地
public function saveToLocal($fileName)
{
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$this->spreadsheet->setActiveSheetIndex(0);
$fileName = $fileName . '.xlsx';
$url = '/storage/' . $fileName;
$outFilename = BASE_PATH . $url;
$writer = IOFactory::createWriter($this->spreadsheet, 'Xlsx');
$writer->save($outFilename);
$this->spreadsheet->disconnectWorksheets();
unset($this->spreadsheet);
return ['path' => $outFilename, 'filename' => $fileName];
}
//直接从浏览器下载到本地,有问题,不使用
// php://output 目前PhpSpreadsheet插件有问题,PhpSpreadsheet插件作者还在修复
public function saveToBrowser($fileName)
{
$fileName = $fileName . '.xlsx';
//xls='application/vnd.ms-excel'
//xlsx='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
$writer = IOFactory::createWriter($this->spreadsheet, 'Xlsx');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $fileName . '"');
header('Cache-Control: max-age=0');
return $writer->save('php://output');
}
//保存临时文件在从浏览器自动下载到本地
public function saveToBrowserByTmp($fileName)
{
$fileName = $fileName . '.xlsx';
$writer = IOFactory::createWriter($this->spreadsheet, "Xlsx");
//保存到服务器的临时文件下
$writer->save("./tmp.xlsx");
//将文件转字符串
$content = file_get_contents('./tmp.xlsx');
//删除临时文件
unlink("./tmp.xlsx");
$response = new Response();
//xls='application/vnd.ms-excel'
//xlsx='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
$contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
return $response->withHeader('content-description', 'File Transfer')
->withHeader('content-type', $contentType)
->withHeader('content-disposition', "attachment; filename={$fileName}")
->withHeader('content-transfer-encoding', 'binary')
->withHeader('pragma', 'public')
->withBody(new SwooleStream((string)$content));
}
}`