<?php
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as WriterXlsx;
class pub_office
{
private static Spreadsheet $spreadsheet;
private static string $title = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
private static array $center = [];
private static array $left = [];
private static array $right = [];
public static function _init()
{
self::$spreadsheet = new Spreadsheet();
self::$center = [
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
],
];
self::$left = [
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_LEFT,
],
];
self::$right = [
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_RIGHT,
],
];
}
public static function writer(array $data): void
{
$sheet = self::$spreadsheet->getActiveSheet();
$line = 1;
$k = [];
if(!empty($data['title']) && is_array($data['title']))
{
$k = array_keys($data['title']);
foreach ($k as $_k => $_v)
{
$coordinate = self::$title[$_k] . $line;
$sheet->setCellValue($coordinate, $data['title'][$_v]);
$sheet->getStyle($coordinate)->getFont()->setBold(true);
$sheet->getStyle($coordinate)->applyFromArray(self::$center);
}
}
if(!empty($data['list']) && is_array($data['list']))
{
foreach ($data['list'] as $row)
{
$line++;
for ($i=0; $i < count($data['title']); $i ++)
{
$coordinate = self::$title[$i] . $line;
$key = $k[$i];
$value = $row[$key];
if(in_array($key, ['addtime', 'create_time', 'uptime', 'update_time']) && is_int($value))
{
$value = date('Y-m-d H:i:s', $value);
}
$sheet->setCellValue($coordinate, $value);
$sheet->getStyle($coordinate)->applyFromArray(self::$left);
}
}
}
$filename = $data['filename'] ?? 'excel.xlsx';
$writer = new WriterXlsx(self::$spreadsheet);
if(!empty($data['download']))
{
header('Content-Type:application/vnd.ms-excel');
header('Content-Disposition:attachment;filename=' . $filename);
header('Cache-Control:max-age=0');
$writer = IOFactory::createWriter(self::$spreadsheet, 'Xls');
$writer->save('php://output');
}
else
{
$writer->save($filename);
}
}
public static function reader($file): int|array
{
if(!is_file($file))
{
return -1;
}
$spreadsheet = IOFactory::load($file);
$sheet = $spreadsheet->getActiveSheet();
return $sheet->toArray();
}
}
//$data['filename'] = '用户列表.xls';
//$data['title'] = ['name' => '姓名', 'age' => '年龄', 'addtime' => '注册时间'];
//$data['list'] = [['name' => '张三', 'age' => 21,'addtime' => time()], ['name' => '李四', 'age' => 22, 'addtime' => time()]];
//$data['download'] = 1;
//pub_office::writer($data);
//$file = '/Users/user/Downloads/用户列表.xls';
//$data = pub_office::reader($file);
//print_r($data);exit;