<?php
namespace App\Admin\Libraries;
/**
* excel表格导入 导出
*
*/
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
class Excel
{
private $spreadsheet;
private $sheet;
function __construct()
{
$this->spreadsheet = new Spreadsheet();//创建一个新的excel文档
$this->sheet = $this->spreadsheet->getActiveSheet();//获取当前操作sheet的对象
}
/**
* 读取excel数据
* @access public
* @param sting $inputFileName 文件路径
* @param sting $type 文件类型
* @return $data 返回二维数组
*/
public function excel_import($inputFileName = '', $type = '')
{
if (!$inputFileName) {
return false;
}
if ($type == 'xlsx') {
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
} elseif ($type == 'xls') {
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
} else {
return false;
}
$spreadsheet = $reader->load($inputFileName);
/* getSheet(0) 指定第一个工作表为当前 toArray() 转数组 */
$data = $spreadsheet->getSheet(0)->toArray();
return $data;
}
/**
* 数据导出到表格
* @access public
* @param array $title 表格第一行标题数组
* @param array $data 表格内容 二维数组
* @param sting $name 当前工作表标题
*/
public function excel_export($title, $data, $name = '标题')
{
$this->sheet->setTitle($name);//设置当前工作表标题。
//设置单元格内容
foreach ($title as $key => $value) {
$this->sheet->setCellValueByColumnAndRow($key+1, 1, $value);
}
$row = 2; //从第二行开始
foreach ($data as $item) {
$column = 1;
foreach ($item as $value) {
$this->sheet->setCellValueByColumnAndRow($column, $row, $value);
$column++;
}
$row++;
}
}
//浏览器下载
public function download($fileName = '信息')
{
$file_name = $fileName . '.xlsx';
$writer = new Xlsx($this->spreadsheet);
/* 输出到浏览器直接下载到本地 */
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$file_name.'"');
header('Cache-Control: max-age=0');
$writer = IOFactory::createWriter($this->spreadsheet, 'Xlsx'); //按照指定格式生成Excel文件
$writer->save('php://output');
}
//保存到服务器目录
public function add($fileName = '信息')
{
$file_name = $fileName . '.xlsx';
$writer = new Xlsx($this->spreadsheet);
/* 保存到服务器目录 */
$writer->save('uploads/'.$file_name);
}
}
相关得方法
$spreadsheet = new Spreadsheet();//创建一个新的excel文档
$sheet = $spreadsheet->getActiveSheet();//获取当前操作sheet的对象
//设置字体
$sheet->getStyle('A7:B7')->getFont()->setBold(true)->setName('Arial')->setSize(10);//将A7至B7两单元格设置为粗体字,Arial字体,10号字
$sheet->getStyle('B1')->getFont()->setBold(true);//将B1单元格设置为粗体字
//设置颜色
$sheet->getStyle('A1')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);//将A1单元格文字颜色设为红色
//设置列宽
$sheet->getColumnDimension('A')->setWidth(20);//将A列的宽度设为20(字符)
$sheet->getColumnDimension('B')->setAutoSize(true);//将B列的宽度设为自动宽度
$sheet->getDefaultColumnDimension()->setWidth(12);//设置默认列宽为12
//设置行高
$sheet->getRowDimension('10')->setRowHeight(100);//将第十行的高度设为100pt
$sheet->getDefaultRowDimension()->setRowHeight(15);//设置默认行高为15
//对齐
$sheet->getStyle('A:D')->getAlignment()
->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER) //设置垂直居中
->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER) //设置水平居中
->setWrapText(true); //设置自动换行
//合并单元格
$sheet->mergeCells('A1:D2');//A1到D2合并为一个单元格
//将合并后的单元格拆分
$sheet->unmergeCells('A1:D2');//将合并后的单元格拆分。
//使用applyFromArray实现单元格样式设置
//样式变量
$style = [
//设置字体样式
'font' => [
'name' => 'Arial',
'bold' => true,
'italic' => false,
'underline' => Font::UNDERLINE_DOUBLE,
'strikethrough' => false,
'color' => [
'rgb' => '808080'
]
],
//设置边框线样式
'borders' => [
//allBorders所有的边框线样式
//左边框线
'bottom' => [
'borderStyle' => Border::BORDER_DASHDOT,
'color' => [
'rgb' => '808080'
]
],
//上边框线
'top' => [
'borderStyle' => Border::BORDER_DASHDOT,
'color' => [
'rgb' => '808080'
]
]
],
//对齐样式
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
'wrapText' => true,
],
//是否使用前缀
'quotePrefix' => true
];
$sheet->getStyle('A1:D1')->applyFromArray($style);
//设置工作表标题
$sheet->setTitle('Hello');//设置当前工作表标题。
//设置单元格的格式
$sheet->getStyle('D2')->getNumberFormat()
->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);//将D2单元格的格式设为文本格式
$sheet->getStyle('A1:D2')->getNumberFormat()
->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);//将A1到D2的单元格设置为文本格式
//换行
$sheet->getCell('A4')->setValue("hello\nworld");//将A4单元格的hello和world换行
//超链接
//将A2单元格内容设置blog并点击跳转https://www.wj0511.com
$sheet->setCellValue('A2', 'blog');
$sheet->getCell('A2')->getHyperlink()->setUrl('https://www.wj0511.com');
//使用函数
/* 总和(SUM),最大数(MAX),最小数(MIN),平均值(AVERAGE) */
$sheet->setCellValue('B5', '=SUM(B1:B4)');//将B5单元格的内容设为B1到B4的之和
//设置文档属性
$spreadsheet->getProperties()
->setCreator("author") //作者
->setLastModifiedBy("last-author") //最后修改者
->setTitle("title") //标题
->setSubject("subject") //副标题
->setDescription("description") //描述
->setKeywords("keywords") //关键字
->setCategory("category"); //分类