123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- <?php
- namespace crmeb\services;
- class SpreadsheetExcelService
- {
-
- private static $instance = null;
-
- private static $spreadsheet = null;
-
- private static $sheet = null;
-
- protected static $count;
-
- protected static $topNumber = 3;
-
- protected static $cells;
-
- protected static $data = [];
-
- protected static $title = '订单导出';
-
- protected static $width = 20;
-
- protected static $height = 50;
-
- protected static $path = './phpExcel/';
-
- private static $styleArray = [
- 'font' => [
- 'bold' => true
- ],
- 'alignment' => [
- 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
- 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER
- ]
- ];
-
- private function __construct(){}
- private function __clone(){}
- public static function instance()
- {
- if (self::$instance === null) {
- self::$instance = new self();
- self::$spreadsheet = $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
- self::$sheet = $spreadsheet->getActiveSheet();
- }
- return self::$instance;
- }
-
- public static function setUtf8($title)
- {
- return iconv('utf-8', 'gb2312', $title);
- }
-
- public static function savePath()
- {
- if(!is_dir(self::$path)){
- if (mkdir(self::$path, 0700) == false) {
- return false;
- }
- }
-
- $mont_path = self::$path.date('Ym');
- if(!is_dir($mont_path)){
- if (mkdir($mont_path, 0700) == false) {
- return false;
- }
- }
-
- $day_path = $mont_path.'/'.date('d');
- if(!is_dir($day_path)){
- if (mkdir($day_path, 0700) == false) {
- return false;
- }
- }
- return $day_path;
- }
-
- public function setExcelTile($title = '', $Name = '', $info = [], $funName = null)
- {
-
- if (is_array($title)) {
- if (isset($title['title'])) $title = $title['title'];
- if (isset($title['name'])) $Name = $title['name'];
- if (isset($title['info'])) $info = $title['info'];
- }
- if (empty($title))
- $title = self::$title;
- else
- self::$title = $title;
- if (empty($Name)) $Name = time();
-
- self::$spreadsheet->getProperties()
- ->setCreator("Neo")
- ->setLastModifiedBy("Neo")
- ->setTitle(self::setUtf8($title))
- ->setSubject($Name)
- ->setDescription("")
- ->setKeywords($Name)
- ->setCategory("");
- self::$sheet->setTitle($Name);
- self::$sheet->setCellValue('A1', $title);
- self::$sheet->setCellValue('A2', self::setCellInfo($info));
-
- self::$sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
- self::$sheet->getStyle('A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
-
- self::$sheet->mergeCells('A1:' . self::$cells . '1');
- self::$sheet->mergeCells('A2:' . self::$cells . '2');
- self::$sheet->getRowDimension(1)->setRowHeight(40);
- self::$sheet->getRowDimension(2)->setRowHeight(20);
-
- self::$sheet->getStyle('A1')->getFont()->setName('黑体');
- self::$sheet->getStyle('A1')->getFont()->setSize(20);
- self::$sheet->getStyle('A1')->getFont()->setBold(true);
- self::$sheet->getStyle('A2')->getFont()->setName('宋体');
- self::$sheet->getStyle('A2')->getFont()->setSize(14);
- self::$sheet->getStyle('A2')->getFont()->setBold(true);
- self::$sheet->getStyle('A3:' . self::$cells . '3')->getFont()->setBold(true);
- return $this;
- }
-
- private static function setCellInfo($info)
- {
- $content = ['操作者:', '导出日期:' . date('Y-m-d', time()), '地址:', '电话:'];
- if (is_array($info) && !empty($info)) {
- if (isset($info['name'])) {
- $content[0] .= $info['name'];
- } else {
- $content[0] .= isset($info[0]) ? $info[0] : '';
- }
- if (isset($info['site'])) {
- $content[2] .= $info['site'];
- } else {
- $content[2] .= isset($info[1]) ? $info[1] : '';
- }
- if (isset($info['phone'])) {
- $content[3] .= $info['phone'];
- } else {
- $content[3] .= isset($info[2]) ? $info[2] : '';
- }
- return implode(' ', $content);
- } else if (is_string($info)) {
- return empty($info) ? implode(' ', $content) : $info;
- }
- }
-
- public static function setExcelHeader($data)
- {
- $span = 'A';
- foreach ($data as $key => $value) {
- self::$sheet->getColumnDimension($span)->setWidth(self::$width);
- self::$sheet->setCellValue($span.self::$topNumber, $value);
- $span++;
- }
- self::$sheet->getRowDimension(3)->setRowHeight(self::$height);
- self::$cells = $span;
- return new self;
- }
-
- public function setExcelContent($data = [])
- {
- if (!empty($data) && is_array($data)) {
- $column = self::$topNumber+1;
-
- foreach ($data as $key => $rows) {
- $span = 'A';
-
- foreach ($rows as $keyName => $value) {
- self::$sheet->setCellValue($span . $column, $value);
- $span++;
- }
- $column++;
- }
- self::$sheet->getDefaultRowDimension()->setRowHeight(self::$height);
-
- self::$sheet->getStyle('A1:' . $span.$column)->applyFromArray(self::$styleArray);
-
- self::$sheet->getStyle('A1:' . $span.$column)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
-
- self::$sheet->getStyle('A4:' . $span.$column)->getAlignment()->setWrapText(true);
- }
- return new self;
- }
-
- public function excelSave($fileName = '',$suffix = 'xlsx',$is_save = false)
- {
- if(empty($fileName)){
- $fileName = date('YmdHis').time();
- }
- if(empty($suffix)){
- $suffix = 'xlsx';
- }
-
- if (mb_detect_encoding($fileName) != "UTF-8") {
- $fileName = iconv("utf-8", "gbk//IGNORE", $fileName);
- }
- if ($suffix == 'xlsx') {
- header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
- $class = "\PhpOffice\PhpSpreadsheet\Writer\Xlsx";
- } elseif ($suffix == 'xls') {
- header('Content-Type:application/vnd.ms-excel');
- $class = "\PhpOffice\PhpSpreadsheet\Writer\Xls";
- }
-
- ob_end_clean();
- $spreadsheet = self::$spreadsheet;
- $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
- if(!$is_save){
-
- header('Content-Disposition: attachment;filename="' . $fileName . '.' . $suffix . '"');
- header('Cache-Control: max-age=0');
- $writer->save('php://output');
-
- $spreadsheet->disconnectWorksheets();
- unset($spreadsheet);
- exit;
- }else{
- $path = self::savePath().'/'.$fileName.'.'.$suffix;
-
-
- $writer->save($path);
-
- $spreadsheet->disconnectWorksheets();
- unset($spreadsheet);
- return $path;
- }
- }
-
- }
|