zzwy2/app/service/File.php

188 lines
7.2 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\service;
use PhpOffice\PhpSpreadsheet\Shared\Date as EDate;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use think\file\UploadedFile;
class File
{
//上传文件移动到上传文件夹
public static function move(UploadedFile $file)
{
$upload_path = 'uploads/' . date('Ymd');
$path = app()->getRootPath() . $upload_path;
$filename = uniqid() . '.' . $file->extension();
$upload_filename = '/' . $upload_path . '/' . $filename;
return [$file->move($path, $filename), $file, $upload_filename];
}
//导出
static public function export($spreadsheet,$filename)
{
$writer = new Xlsx($spreadsheet);
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="'.$filename.'"');
header("Content-Transfer-Encoding: binary");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
$writer->save('php://output');
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
exit;
}
public static function cancelTimeLimit()
{
ini_set('max_execution_time', 0);
ini_set("memory_limit", -1);
set_time_limit(0);
}
/**
* 根据header字段获取可配置列的cellId列表
* 默认前26列为可配置列A~Z, $headerLength不能超过26 * 27 = 702
*
* @param int $headerLength
* @return array
*/
public static function getCellIds(int $headerLength): array
{
$defaultCellIds = range('A', 'Z', 1);
$cellIds = $defaultCellIds;
$loop = ceil($headerLength / 26);
if($loop>1) {
$maxPrefixIndex = ($loop - 2) >= 25 ? 25 : ($loop - 2);
for ($prefixIndex = 0; $prefixIndex<= $maxPrefixIndex; $prefixIndex++) {
$prefix = $defaultCellIds[$prefixIndex];
$cellIds = array_merge($cellIds, array_map(function ($val) use($prefix) {
return $prefix.$val;
}, $defaultCellIds));
}
}
return $cellIds;
}
/**
* 设置导出表数据
*
* @param Worksheet $sheet 工作表对象
* @param array $cellValues 数据信息,二维数组(ps若字段值需要指定样式以数组格式传递如[$val, DataType::TYPE_STRING])。第二行开始填充
* @param array $header 表头信息, 第一行为表头
* @param string $sheetTitle 工作表标题
* @param array $cellWidthList 列宽样式,键值对,键名为列序号(从0开始计算)
* @param array $excelStyle 表数据样式
* @param array $defaultList 默认设置样式
* @param array $cellWrapList 列换行样式
* @return bool
*/
public static function setExcelCells(Worksheet $sheet, array $cellValues, array $header, string $sheetTitle = '数据列表', $cellWidthList = [], $excelStyle = [], $defaultList = [], $cellWrapList = []): bool
{
$defaultStyle = [
'font' => [
'name' => '宋体',
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER, // 水平居中
'vertical' => Alignment::VERTICAL_CENTER, // 垂直居中
'wrapText' => false,
],
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['rgb'=>'eeeeee'],
]
],
];
$headerLength = count($header);
if($headerLength === 0) return false;
$cellIds = self::getCellIds($headerLength);
$lastCellId = $cellIds[$headerLength-1];
$contentIndex = 2;
foreach ($cellValues as $n => $itemCell) {
foreach ($itemCell as $i => $cellValue) {
if(is_array($cellValue)) {
$sheet->setCellValueExplicit($cellIds[$i] . $contentIndex, ...$cellValue);
} else {
$sheet->setCellValue($cellIds[$i] . $contentIndex, $cellValue);
}
}
$contentIndex++;
}
try {
$headerStr = 'A1:' . $lastCellId.'1';
$bodyStr = 'A2:' . $lastCellId . ($contentIndex - 1);
$defaultWidth = 24; // 默认列宽24个字符
$fontSize = 12; // 默认字体大小为12号
if(!empty($defaultList)) {
if(isset($defaultList['cell_width']) && is_numeric($defaultList['cell_width']) && $defaultList['cell_width'] > 0) {
$defaultWidth = $defaultList['cell_width'];
}
if(isset($defaultList['font_size']) && is_numeric($defaultList['font_size']) && $defaultList['font_size'] > 0) {
$fontSize = $defaultList['font_size'];
}
}
$sheet->setTitle(empty($sheetTitle) ? '数据列表': $sheetTitle);
$sheet->getDefaultColumnDimension()->setAutoSize($fontSize);
$sheet->getStyle($headerStr)->getFont()->setBold(false)->setSize($fontSize+2);
$sheet->getDefaultColumnDimension()->setWidth($defaultWidth);
$sheet->fromArray($header, null, 'A1');
$sheet->getStyle($headerStr)->applyFromArray($defaultStyle);
$sheet->getStyle($bodyStr)->applyFromArray(empty($excelStyle) ? $defaultStyle : $excelStyle);
// 自定义列宽
if(!empty($cellWidthList)) {
foreach ($cellWidthList as $cellId => $widthVal) {
if(isset($cellIds[$cellId]) && is_numeric($widthVal) && $widthVal > 0) {
$sheet->getColumnDimension($cellIds[$cellId])->setWidth($widthVal);
}
}
}
//自定义列是否换行
if(!empty($cellWrapList)) {
foreach ($cellWrapList as $cellId => $boolVal) {
if(isset($cellIds[$cellId])) {
$wrap = $boolVal ? true : false;
$sheet->getStyle($cellIds[$cellId])->getAlignment()->setWrapText($wrap);
}
}
}
return true;
} catch (\Exception $e) {
return false;
}
}
// excel导入时间转换
public static function getExcelTime($timeStr, $format = 'Y-m-d')
{
$timezone = ini_get('date.timezone');
$timeStr = trim($timeStr);
if (!empty($timeStr)) {
if (is_numeric($timeStr)) {
$toTimestamp = EDate::excelToTimestamp($timeStr, $timezone);
$timeStr = date($format, $toTimestamp);
} else {
$toTimestamp = strtotime($timeStr);
$timeStr = ($toTimestamp === false) ? '' : date($format, $toTimestamp);
}
} else {
$timeStr = '';
}
return $timeStr;
}
}