PhpSpreadsheet处理Excel 导入、导出并设置样式
PhpSpreadsheet处理Excel
PHPOffice
是一个用来处理办公相关软件的php类库
PhpSpreadsheet
专门处理excle的类库
导出如下:
引入类库
composer require maatwebsite/excel
("maatwebsite/excel": "^3.1")
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
public static function excelWriter($fileName, $style = 1, $columnName = null, $data = null, $sheetIndex = 0, $cell = null)
{
$spreadsheet = new Spreadsheet();
//默认为26列,如需要再自定义加
if (!isset($cell)) {
$cell = array('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');
}
$sheet = $spreadsheet->getActiveSheet();
//设置excel的sheet,默认0
$spreadsheet->setActiveSheetIndex($sheetIndex);
switch ($style) {
case 1:
//常规格式
self::setExcelStyleOne($sheet, $columnName, $data, $cell);
break;
case 2:
//特别格式
self::setExcelStyleTwo($sheet, $cell);
break;
}
//下载输出excel页面
// // Redirect output to a client’s web browser (Excel5)
// header('Content-Type: application/vnd.ms-excel');
// header('Content-Disposition: attachment;filename="' . $fileName . '"');
// header('Cache-Control: max-age=0');
// // If you're serving to IE 9, then the following may be needed
// header('Cache-Control: max-age=1');
//
// // If you're serving to IE over SSL, then the following may be needed
// 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
// 保存到本地服务器文件
$filename = date('YmdHis') . '-' . $fileName . '-' . uniqid() . '.xlsx';
$path = public_path() . '/download/excel/' . date('Ym') . '/';
$objWriter = IOFactory::createWriter($spreadsheet, 'Xlsx');
// File::makeDirectory($path);
File::makeDirectory($path, $mode = 0777, true, true);
$objWriter->save($path . $filename);
$res = array(
'path' => $path,
'filename' => $filename
);
return $res;
//$objWriter->save('php://output');
}
protected static function setExcelStyleOne($sheet, $columnName, $data, $cell)
{
//列表标题
//$columnName = array('标题1','标题2');
$count = count($columnName);
//列表标题=>输入到excel第一行中
foreach ($columnName as $k => $v) {
$sheet->setCellValue($cell[$k] . '1', $v);
}
//列表标题对应的数据=>输入到excel第二行以下
foreach ($data as $key => $value) {
$i = $key + 1;
for ($j = 0; $j < $count; $j++) {
$sheet->setCellValue($cell[$j] . ($i + 1), $value[$j]);
}
}
}
protected static function setExcelStyleTwo($sheet, $cell)
{
//样式设置 - 水平、垂直居中
$styleArray = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER
],
];
$sheet->getStyle('A1:H8')->applyFromArray($styleArray);
//样式设置 - 字体
$sheet->getStyle('A10:A24')->getFont()->setBold(true)->setName('Arial')->setSize(10);
$sheet->getStyle('A18:A24')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED); //设置单元格A1的字体颜色
//样式设置 - 边框
$styleArray = [
'borders' => [
'outline' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => '000000'],
],
'inside' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
]
],
];
$sheet->getStyle('A1:F2')->applyFromArray($styleArray);
//设置宽度
foreach ($cell as $k => $v) {
$sheet->getColumnDimension($v)->setWidth(13);
}
$sheet->getColumnDimension('A')->setWidth(20);
//样式设置 - 合并和拆分
$sheet->mergeCells('A1:A2'); //合并单元格
//$sheet -> unmergeCells('C3:G3'); //拆分单元格
$sheet->setCellValue('A1', '人员概况');
$column_arr = array('B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M');
$sheet->setCellValue('A10', '人员对比(正式工+毕业生)');
foreach ($column_arr as $key => $val) {
$mon = $key + 1;
$sheet->setCellValue($column_arr[$key] . '10', $mon . '月');
}
$sheet->setCellValue('N10', '合计');
$sheet->setCellValue('O10', '平均');
$data_arr = array('B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O');
$data_row_arr = array('11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24');
$sheet->setCellValue('A11', '2019年人数(不含外包派遣)');
foreach ($data_row_arr as $kkk => $vvv) {
foreach ($data_arr as $kk => $vv) {
$sheet->setCellValue($data_arr[$kk] . $vvv, 0);
}
}
}
导入如下:
use PhpOffice\PhpSpreadsheet\IOFactory;
public function upload(Request $request)
{
$file = $request->file('file');
t_log($file);
if ($file->isValid()) {
// 获取文件相关信息
$originalName = $file->getClientOriginalName(); // 文件原名
$ext = $file->getClientOriginalExtension(); // 扩展名
$realPath = $file->getRealPath(); //临时文件的绝对路径
$type = $file->getClientMimeType(); // image/jpeg
if (!in_array($ext, ['xls', 'xlsx', 'csv'])) {
return error('文件类型错误!');
}
// 上传文件
$filename = date('YmdHis') . '-' . uniqid() . '.' . $ext;
// 使用我们新建的uploads本地存储空间(目录)
//这里的uploads是配置文件的名称
//把临时文件移动到指定的位置,并重命名
$path = public_path() . '/uploads/excel/' . date('Ym') . '/';
$bool = $file->move($path, $filename);
if ($bool) {
$img_path = public_path() . '/uploads/excel/' . date('Ym') . '/' . $filename;
$res = $this->_readExcel($img_path);
if ($res === true) {
return success('上传存储成功');
} else {
return success($res);
}
} else {
return success('上传文件失败');
}
}
return success('没有获取到文件');
}
private function _readExcel($filePath = '')
{
$data = array();
$end_row = null;
$objPHPExcelReader = IOFactory::load($filePath);
$sheet = $objPHPExcelReader->getSheet(0);
$highestRow = $sheet->getHighestRow(); // 取得最大行数
$highestColumn = $sheet->getHighestColumn(); // 取得最大列数
$arr = ['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', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ', 'ZZ']; // 目标列标号
$start_row = 2;//从第二行开始
$row_arr = [];
for ($column = 0; $arr[$column] != 'ZZ'; $column++) {
$vale = $sheet->getCellByColumnAndRow($column, 1)->getValue();
if (is_null($vale)) {
continue;
}
$temp_keys[] = $vale;
}
$value_key = WorkersService::getReportField(WorkersService::MAIN, true);
//当前操作人的组织id
$org_id = $this->admin->org_id;
for ($row = $start_row; $row <= $highestRow; $row++) { // 一次读取一列
$row_arr_one = $row_arr_other = array();
for ($column = 0; $arr[$column] != 'ZZ'; $column++) {
$val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
if (is_null($val)) {
continue;
}
if (isset($value_key[$temp_keys[$column]])) {
$keys = $value_key[$temp_keys[$column]];
//$row_arr_one判断两个唯一字段是user_id,user_name否表中已存在的数据
if($keys=='user_id'){
$row_arr_one[$keys] = $val;
}
if($keys=='user_name'){
$row_arr_one[$keys] = $val;
}
$row_arr_one['org_id'] = $org_id;
if(in_array($keys,['entry_date','trial_end','first_time','quit_time'])){
$row_arr_other[$keys] =$this->changeTime($val);
}else{
//有则更新的数组
$row_arr_other[$keys] = $val;
}
unset($row_arr_other['user_id']);
unset($row_arr_other['user_name']);
}
}
DB::connection('kg_report')->table('workers')->updateOrInsert($row_arr_one, $row_arr_other);
}
return true;
}
PhpSpreadsheet处理Excel 导入、导出并设置样式相关推荐
- php Spreadsheet Csv,基于 PhpSpreadsheet 简单 Excel 导入导出
GitHub 安装 composer require jianyan74/php-excel 引入 use jianyan\excel\Excel; Demo 目前只支持文字.函数.选择.日期转换 / ...
- Excel 导入导出、样式设计、Excel各种工具类整合,FileUtil、ExcelUtil
2022-12-09 今天整理一下最近的excel导入导出经验,整理出了几个工具类,放心使用,可应付8成需求 excel导入导出现实需求可能很复杂,但基本都可以通过原生和easyexcel配合实现,开 ...
- easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单
做积极的人,而不是积极废人! 来源:jianshu.com/p/8f3defdc76d4EasyExcelGitHub上的官方说明快速开始maven仓库地址导入导出总结 EasyExcel 在做exc ...
- easyexcel 在 设置标题_EasyExcel,让excel导入导出更加简单
EasyExcel 在做excel导入导出的时候,发现项目中封装的工具类及其难用,于是去gitHub上找了一些相关的框架,最终选定了EasyExcel.之前早有听闻该框架,但是一直没有去了解,这次借此 ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- 一款Excel导入导出解决方案组成的轻量级开源组件
Excel-Boot GitHub地址:gitee.com/nw1992/easy- 码云地址:github.com/programmere- Excel-Boot是一款Excel导入导出解决方案组成 ...
- easypoi导入校验跳过空行_Easy-POI是一款Excel导入导出解决方案组成的轻量级开源组件...
Excel-Boot是一款Excel导入导出解决方案组成的轻量级开源组件. 如果喜欢或愿意使用, 请star本项目或者点击donate图标捐赠我们 如果是企业使用, 为了产品推广, 请通过评论.Iss ...
- java Excel导入导出工具类 及使用demo
java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...
- SpringBoot中使用Easyexcel实现Excel导入导出功能(三)
导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少.通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.co ...
- 开发指南专题十五 JEECG微云快速开发平台EXCEL导入导出
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 开 ...
最新文章
- 【转】浅谈MS-SQL锁机制
- 【山西】2021年下半年软考报考时间及通知
- what to do next?
- PC SERVER 序列号查询
- android 自定义view控件,Android 自定义View——自定义View控件
- Navicat for MySQL中如何新建用户并赋予权限
- 基于 AVPlayer 自定义播放器
- 键盘上在方向键上面的9个键是干什么的?
- 强悍的 Python —— 读取大文件
- amqp activemq_Spring AMQP ActiveMQ教程(第1部分)
- java.util.stream.LongStream
- HDU 4403 A very hard Aoshu problem (DFS暴力)
- ps画画模糊笔刷_杨雪果ps笔刷|杨雪果CG绘画笔刷(Blur's good brush)下载v7.0 免费版 - 欧普软件下载...
- WordPress小程序源码 社区论坛小程序源码 知识付费商城小程序下载
- oracle+bmp转为txt,Bmp2Txt下载-图像转换成文字(Bmp2Txt )下载1.0-西西软件下载
- 疯狂的程序员 41-50
- 计算机专业师范类分析,师范生应具备的信息技术能力分析
- ECCV 2020 目标检测论文大盘点(49篇论文)
- 自己封装特定的Windows系统镜像
- VP9编码器客观及主观质量优化