jh-admin/extend/Excel.php

286 lines
9.8 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace extend;
use PHPExcel_IOFactory;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\OLE\PPS\Root;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Fill;
class Excel
{
// public function test()
// {
// $data = [
// ['title1' => '111', 'title2' => '111'],
// ['title1' => '222', 'title2' => '222'],
// ['title1' => '333', 'title2' => '333']
// ];
// $mergeCells = [
// ['A1:B1'=>'第一行标题','C1:F1'=>'第一111行标题'],
// ['A2:B2'=>'第一行标题','C2:E2'=>'第一222行标题'],
// ];
// $tableHeader = [
// ['第一行标题','第一行标题'],
// ['第二行标题', '第二行标题']
// ];
// $fileName = "8888.xlsx";
//
// $data = Excel::saveFile($data, $fileName, $tableHeader,$mergeCells);
//
// var_dump($data);
// exit;
// }
private static $config = [
// 默认行高
'row_height' => 24,
// 默认列宽
'column_width' => 18,
// 字体
'font_family' => '微软雅黑',
// 字体大小
'font_size' => 11,
// 字体颜色
'color' => '000000',
// 垂直对齐方式
'visibility_align' => Alignment::VERTICAL_CENTER,
// 水平对齐方式
'text_align' => Alignment::HORIZONTAL_CENTER,
// 边框样式
'border_style' => Border::BORDER_THIN,
// 边框颜色
'border_color' => '000000',
// 分割线填充样式
'cut_fill_style' => Fill::FILL_SOLID,
// 分割线填充颜色
'cut_fill_color' => 'CCCCCC',
// 是否自动换行
'is_auto_wrap' => true,
// 行开始位置
'row_start_num' => 0,
// 表头是否冻结
'header_freeze' => false,
// 是否筛选
'auto_filter' => true,
//是否加粗
'is_bold' => false,
];
public static $excelCol = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ'];
public static $setBold = false;
public static $setName = '宋体';
public static $setSize = '12';
public static $setBgRGB = 'FFFFFFFF';
public static $setFontRGB = 'FF000000';
public static $styleArray = [
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER
],
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => '000000'],
],
],
];
public function __construct(array $config = [])
{
$this->init($config);
}
/**
* 初始化
* @param array $config
*/
private function init(array $config = [])
{
self::$config = array_merge(self::$config, $config);
}
/**
* 读取excel
* @param $filePath
* @param int $pageIndex
* @param int $readRow
* @return array
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public static function read($filePath, $pageIndex = 0, $readRow = 0)
{
//加载文件
$spreadSheet = IOFactory::load($filePath);
//获取文件内容
$workSheet = $spreadSheet->getSheet($pageIndex)->toArray('', true, true, false);
//删除表头几行
if ($readRow > 0) {
for ($i = 0; $i < $readRow; $i++) {
array_shift($workSheet);
}
}
return $workSheet;
}
/**
* 下载文件
* @param $data
* @param $fileName
* @param array $tableHeader
* @param array $mergeCells
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
*/
public static function download($data, $fileName, $tableHeader = [], $mergeCells = [], $suffix = 'xlsx')
{
$spreadsheet = self::write($data, $tableHeader, $mergeCells);
// 将输出重定向到客户端的网络浏览器(Xlsx)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $fileName . '"');//文件名
header('Cache-Control: max-age=0');
// 如果你服务于IE 9那么以下可能是需要的
header('Cache-Control: max-age=1');
// 如果您通过SSL为工业工程服务那么可能需要以下内容
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header('Pragma: public'); // HTTP/1.0
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, ucwords($suffix));
$writer->save('php://output');
}
/**
* 保存文件
* @param $data
* @param $fileName
* @param array $tableHeader
* @param array $mergeCells
* @throws \PhpOffice\PhpSpreadsheet\Exception
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
*/
public static function saveFile($data, $fileName, $tableHeader = [], $mergeCells = [], $suffix = 'xlsx')
{
$spreadsheet = self::write($data, $tableHeader, $mergeCells);
$writer = IOFactory::createWriter($spreadsheet, ucwords($suffix));
// var_dump(app()->getRootPath().'/'.$fileName);die;
$writer->save(app()->getRootPath() . $fileName, true);
return $fileName;
}
/**
* 写入数据
* @param $data
* @param $tableHeader
* @param $mergeCells
* @return Spreadsheet
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public static function write($data, $tableHeader, $mergeCells)
{
// 创建excel对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$totalCol = 0;
//设置表头合并单元格
foreach ($mergeCells as $row => $rows) {
$head_title = array_merge([
'name' => '默认标题',
// 是否加粗
'is_bold' => true,
// 字体大小
'font_size' => 20,
// 字体颜色
'color' => self::$config['color'],
// 水平对齐方式
'text_align' => self::$config['text_align']
], $rows);
$i = 0;
foreach ($rows as $col => $colValue) {
//合并单元格
$sheet->mergeCells($head_title['value']);
//设置样式
self::setStyle($sheet, $i, $totalCol, $head_title);
//单元格内容写入
$sheet->setCellValue(substr($head_title['value'], 0, strpos($head_title['value'], ":")), $head_title['name']);
$i++;
}
}
$totalCol += count($mergeCells);
//设置表头
foreach ($tableHeader as $row => $rows) {
$cell_v = array_merge([
// 字段
'field' => '',
// 名称
'name' => '',
// 横向合并
'colspan' => 1,
// 列宽
'width' => self::$config['column_width'],
// 水平对齐方式
'text_align' => self::$config['text_align'],
], $rows);
$tableHeader[$row] = $cell_v;
self::setStyle($sheet, $row, $totalCol, $cell_v);
//单元格内容写入
$sheet->setCellValue(self::$excelCol[$row] . ($totalCol + 1), $rows['name']);
}
$totalCol += 1;
foreach ($data as $row => $rows) {
foreach ($tableHeader as $col => $colValue) {
self::setStyle($sheet, $col, $totalCol + $row, $colValue);
// 单元格内容写入
$sheet->setCellValue(self::$excelCol[$col] . ($totalCol + $row + 1), $rows[$colValue['field']]);
}
}
return $spreadsheet;
}
/**
* 设置单元格样式
* @param $sheet
* @param $col
* @param $totalCol
* @param $row
*/
public static function setStyle($sheet, $col, $totalCol, $cell_v = [])
{
$config = array_merge(self::$config, $cell_v);
//设置单元格居中
$sheet->getStyle(self::$excelCol[$col] . ($totalCol + 1))->applyFromArray(self::$styleArray);
//设置单元格
$sheet->getStyle(self::$excelCol[$col] . ($totalCol + 1))
->getFill()
->setFillType(self::$config['cut_fill_style'])
->getStartColor()
->setRGB(self::$setBgRGB); //背景色
if (isset($config['width'])) {
//设置行间距
$sheet->getColumnDimension(self::$excelCol[$col])
->setWidth($config['width']);
}
if (isset($config['row_height'])) {
//设置行高度
$sheet->getRowDimension(($totalCol + 1))->setRowHeight($config['row_height']);
}
//设置单元格字体样式、字体、字体大小
$sheet->getStyle(self::$excelCol[$col] . ($totalCol + 1))
->getFont()
->setBold($config['is_bold'])
->setName(self::$setName)
->setSize($config['font_size']);
//设置字体颜色
$sheet->getStyle(self::$excelCol[$col] . ($totalCol + 1))
->getFont()
->getColor()->setRGB($config['color']);
}
}