You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
think-library/src/service/ExcelService.php

180 lines
4.5 KiB

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
// +----------------------------------------------------------------------
// | ThinkLibrary 6.0 for ThinkPhP 6.0
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 [ https://www.dtapp.net ]
// +----------------------------------------------------------------------
// | 官方网站: https://gitee.com/liguangchun/ThinkLibrary
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | gitee 仓库地址 https://gitee.com/liguangchun/ThinkLibrary
// | github 仓库地址 https://github.com/GC0202/ThinkLibrary
// | Packagist 地址 https://packagist.org/packages/liguangchun/think-library
// +----------------------------------------------------------------------
namespace DtApp\ThinkLibrary\service;
use DtApp\ThinkLibrary\Service;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use think\Exception;
/**
* 表格服务
* Class ExcelService
* @package DtApp\ThinkLibrary\service
*/
class ExcelService extends Service
{
/**
* 头部
* @var array
*/
private $head = [];
/**
* 设置头部
* [
* [
* [
* 'index' => 1,
* 'value' => '标题'
* ],
* [
* 'index' => 2,
* 'value' => '名称'
* ]
* ],
* [
* [
* 'index' => 1,
* 'value' => '标题2'
* ],
* [
* 'index' => 2,
* 'value' => '名称2'
* ]
* ]
* ];
* @param array $head
* @return ExcelService
*/
public function setHead(array $head = []): ExcelService
{
$this->head = $head;
return $this;
}
/**
* 头部长度
* @var array
*/
private $head_length = 0;
/**
* 设置头部长度
* @param int $length
* @return ExcelService
*/
public function setHeadLength(int $length = 0): ExcelService
{
$this->head_length = $length;
return $this;
}
/**
* 内容
* @var array
*/
private $content = [];
/**
* 设置内容
* [
* [
* [
* 'index' => 1,
* 'value' => '标题'
* ],
* [
* 'index' => 2,
* 'value' => '名称'
* ]
* ],
* [
* [
* 'index' => 1,
* 'value' => '标题2'
* ],
* [
* 'index' => 2,
* 'value' => '名称2'
* ]
* ]
* ];
* @param array $content
* @return ExcelService
*/
public function setContent(array $content = []): ExcelService
{
$this->content = $content;
return $this;
}
/**
* 文件名
* @var string
*/
private $file_name = '';
/**
* 设置文件名(不需要后缀名)
* @param string $file_name
* @return $this
*/
public function setFileName(string $file_name = ''): self
{
$this->file_name = $file_name;
return $this;
}
/**
* 生成表格文件
* @return string
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
* @throws Exception
*/
public function generate(): string
{
// 生成表格
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
if (empty($this->head)) {
throw new Exception('头部内容未设置!');
}
if (empty($this->head_length)) {
throw new Exception('头部长度未设置!');
}
if (empty($this->file_name)) {
throw new Exception('文件保存路径未设置!');
}
//设置工作表标题名称
//设置单元格内容
foreach ($this->head as $key => $value) {
foreach ($value as $k => $v) {
$sheet->setCellValueByColumnAndRow($v['index'], $key + 1, $v['value']);
}
}
foreach ($this->content as $key => $value) {
foreach ($value as $k => $v) {
$sheet->setCellValueByColumnAndRow($v['index'], $key + $this->head_length, $v['value']);
}
}
$writer = new Xlsx($spreadsheet);
$writer->save("{$this->file_name}.xlsx");
return "{$this->file_name}.xlsx";
}
}