PHPExcel早就停止更新维护,github上用的是phpspreadsheet。
composer安装地址

composer require phpoffice/phpspreadsheet

<?php
namespace Home\Controller;use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Think\Controller;class OfficeController extends Controller
{/*** 使用PHPEXECL导入** @param string $file      文件地址* @param int    $sheet     工作表sheet(传0则获取第一个sheet)* @param int    $columnCnt 列数(传0则自动获取最大列)* @param array  $options   操作选项*                          array mergeCells 合并单元格数组*                          array formula    公式数组*                          array format     单元格格式数组** @return array* @throws Exception*/public static function importExecl(string $file = '', int $sheet = 0, int $columnCnt = 0, &$options = []){try {/* 转码 */$file = iconv("utf-8", "gb2312", $file);if (empty($file) OR !file_exists($file)) {throw new \Exception('文件不存在!');}/** @var Xlsx $objRead */$objRead = IOFactory::createReader('Xlsx');if (!$objRead->canRead($file)) {/** @var Xls $objRead */$objRead = IOFactory::createReader('Xls');if (!$objRead->canRead($file)) {throw new \Exception('只支持导入Excel文件!');}}/* 如果不需要获取特殊操作,则只读内容,可以大幅度提升读取Excel效率 */empty($options) && $objRead->setReadDataOnly(true);/* 建立excel对象 */$obj = $objRead->load($file);/* 获取指定的sheet表 */$currSheet = $obj->getSheet($sheet);if (isset($options['mergeCells'])) {/* 读取合并行列 */$options['mergeCells'] = $currSheet->getMergeCells();}if (0 == $columnCnt) {/* 取得最大的列号 */$columnH = $currSheet->getHighestColumn();/* 兼容原逻辑,循环时使用的是小于等于 */$columnCnt = Coordinate::columnIndexFromString($columnH);}/* 获取总行数 */$rowCnt = $currSheet->getHighestRow();$data   = [];/* 读取内容 */for ($_row = 1; $_row <= $rowCnt; $_row++) {$isNull = true;for ($_column = 1; $_column <= $columnCnt; $_column++) {$cellName = Coordinate::stringFromColumnIndex($_column);$cellId   = $cellName . $_row;$cell     = $currSheet->getCell($cellId);if (isset($options['format'])) {/* 获取格式 */$format = $cell->getStyle()->getNumberFormat()->getFormatCode();/* 记录格式 */$options['format'][$_row][$cellName] = $format;}if (isset($options['formula'])) {/* 获取公式,公式均为=号开头数据 */$formula = $currSheet->getCell($cellId)->getValue();if (0 === strpos($formula, '=')) {$options['formula'][$cellName . $_row] = $formula;}}if (isset($format) && 'm/d/yyyy' == $format) {/* 日期格式翻转处理 */$cell->getStyle()->getNumberFormat()->setFormatCode('yyyy/mm/dd');}$data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());if (!empty($data[$_row][$cellName])) {$isNull = false;}}/* 判断是否整行数据为空,是的话删除该行数据 */if ($isNull) {unset($data[$_row]);}}return $data;} catch (\Exception $e) {throw $e;}}/*** Excel导出,TODO 可继续优化** @param array  $datas      导出数据,格式['A1' => 'XXXX公司报表', 'B1' => '序号']       *   // $data["A1"] = "证件";*   // $data["B1"] = "姓名";*   // $data["C1"] = "案件";* @param string $fileName   导出文件名称* @param array  $options    操作选项,例如:*                           bool   print       设置打印格式*                           string freezePane  锁定行数,例如表头为第一行,则锁定表头输入A2*                           array  setARGB     设置背景色,例如['A1', 'C1']*                           array  setWidth    设置宽度,例如['A' => 30, 'C' => 20]*                           bool   setBorder   设置单元格边框*                           array  mergeCells  设置合并单元格,例如['A1:J1' => 'A1:J1']*                           array  formula     设置公式,例如['F2' => '=IF(D2>0,E42/D2,0)']*                           array  format      设置格式,整列设置,例如['A' => 'General']*                           array  alignCenter 设置居中样式,例如['A1', 'A2']*                           array  bold        设置加粗样式,例如['A1', 'A2']*                           string savePath    保存路径,设置后则文件保存到服务器,不通过浏览器下载*/public static function exportExcel(array $datas, string $fileName = '', array $options = []): bool{try {if (empty($datas)) {return false;}set_time_limit(0);/** @var Spreadsheet $objSpreadsheet */$objSpreadsheet = new Spreadsheet();/* 设置默认文字居左,上下居中 */$styleArray = ['alignment' => ['horizontal' => Alignment::HORIZONTAL_LEFT,'vertical'   => Alignment::VERTICAL_CENTER,],];$objSpreadsheet->getDefaultStyle()->applyFromArray($styleArray);/* 设置Excel Sheet */$activeSheet = $objSpreadsheet->setActiveSheetIndex(0);/* 打印设置 */if (isset($options['print']) && $options['print']) {/* 设置打印为A4效果 */$activeSheet->getPageSetup()->setPaperSize(PageSetup:: PAPERSIZE_A4);/* 设置打印时边距 */$pValue = 1 / 2.54;$activeSheet->getPageMargins()->setTop($pValue / 2);$activeSheet->getPageMargins()->setBottom($pValue * 2);$activeSheet->getPageMargins()->setLeft($pValue / 2);$activeSheet->getPageMargins()->setRight($pValue / 2);}/* 行数据处理 */foreach ($datas as $sKey => $sItem) {/* 默认文本格式 */$pDataType = DataType::TYPE_STRING;/* 设置单元格格式 */if (isset($options['format']) && !empty($options['format'])) {$colRow = Coordinate::coordinateFromString($sKey);/* 存在该列格式并且有特殊格式 */if (isset($options['format'][$colRow[0]]) &&NumberFormat::FORMAT_GENERAL != $options['format'][$colRow[0]]) {$activeSheet->getStyle($sKey)->getNumberFormat()->setFormatCode($options['format'][$colRow[0]]);if (false !== strpos($options['format'][$colRow[0]], '0.00') &&is_numeric(str_replace(['¥', ','], '', $sItem))) {/* 数字格式转换为数字单元格 */$pDataType = DataType::TYPE_NUMERIC;$sItem     = str_replace(['¥', ','], '', $sItem);}} elseif (is_int($sItem)) {$pDataType = DataType::TYPE_NUMERIC;}}$activeSheet->setCellValueExplicit($sKey, $sItem, $pDataType);/* 存在:形式的合并行列,列入A1:B2,则对应合并 */if (false !== strstr($sKey, ":")) {$options['mergeCells'][$sKey] = $sKey;}}unset($datas);/* 设置锁定行 */if (isset($options['freezePane']) && !empty($options['freezePane'])) {$activeSheet->freezePane($options['freezePane']);unset($options['freezePane']);}/* 设置宽度 */if (isset($options['setWidth']) && !empty($options['setWidth'])) {foreach ($options['setWidth'] as $swKey => $swItem) {$activeSheet->getColumnDimension($swKey)->setWidth($swItem);}unset($options['setWidth']);}/* 设置背景色 */if (isset($options['setARGB']) && !empty($options['setARGB'])) {foreach ($options['setARGB'] as $sItem) {$activeSheet->getStyle($sItem)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB(Color::COLOR_YELLOW);}unset($options['setARGB']);}/* 设置公式 */if (isset($options['formula']) && !empty($options['formula'])) {foreach ($options['formula'] as $fKey => $fItem) {$activeSheet->setCellValue($fKey, $fItem);}unset($options['formula']);}/* 合并行列处理 */if (isset($options['mergeCells']) && !empty($options['mergeCells'])) {$activeSheet->setMergeCells($options['mergeCells']);unset($options['mergeCells']);}/* 设置居中 */if (isset($options['alignCenter']) && !empty($options['alignCenter'])) {$styleArray = ['alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER,'vertical'   => Alignment::VERTICAL_CENTER,],];foreach ($options['alignCenter'] as $acItem) {$activeSheet->getStyle($acItem)->applyFromArray($styleArray);}unset($options['alignCenter']);}/* 设置加粗 */if (isset($options['bold']) && !empty($options['bold'])) {foreach ($options['bold'] as $bItem) {$activeSheet->getStyle($bItem)->getFont()->setBold(true);}unset($options['bold']);}/* 设置单元格边框,整个表格设置即可,必须在数据填充后才可以获取到最大行列 */if (isset($options['setBorder']) && $options['setBorder']) {$border    = ['borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN, // 设置border样式'color'       => ['argb' => 'FF000000'], // 设置border颜色],],];$setBorder = 'A1:' . $activeSheet->getHighestColumn() . $activeSheet->getHighestRow();$activeSheet->getStyle($setBorder)->applyFromArray($border);unset($options['setBorder']);}$fileName = !empty($fileName) ? $fileName : (date('YmdHis') . '.xlsx');if (!isset($options['savePath'])) {/* 直接导出Excel,无需保存到本地,输出07Excel文件 */header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=gb2312');header("Content-Disposition:attachment;filename=" . iconv("utf-8", "GB2312//TRANSLIT", $fileName));header('Cache-Control: max-age=0');//禁止缓存$savePath = 'php://output';} else {$savePath = $options['savePath'];}ob_clean();ob_start();$objWriter = IOFactory::createWriter($objSpreadsheet, 'Xlsx');$objWriter->save($savePath);/* 释放内存 */$objSpreadsheet->disconnectWorksheets();unset($objSpreadsheet);ob_end_flush();return true;} catch (\Exception $e) {return false;}}}
在这里插入代码片

示例:

<?php
namespace Home\Controller;use Think\Controller;class IndexController extends Controller
{public function exout(){$data = M('user')->field('uid,username,location')->select();$head = array(array('uid'=>'用户id','username'=>'用户名','location'=>'地址'));$data = array_merge($head,$data);
//        dump($data);die();$exdata =array();foreach ($data as $k=>$v){$cell = $k+1;$exdata['A'.$cell] = $v['uid'];$exdata['B'.$cell] = $v['username'];$exdata['C'.$cell] = $v['location'];}
//        dump($exdata);die();$re = OfficeController::exportExcel($exdata,'testuser.xlsx');dump($re);}public function exin(){$data =    OfficeController::importExecl('./testuser (1).xlsx');dump($data);}
}

参考地址:https://blog.csdn.net/DestinyLordC/article/details/84071456

PHP对Excel导入导出操作相关推荐

  1. Java实现Excel导入导出操作详解

    前言 本次封装是基于 POI 的二次开发,最终使用只需要调用一个工具类中的方法,就能满足业务中绝大部门的导入和导出需求. 1. 功能测试 1.1 测试准备 在做测试前,我们需要將[2. 环境准备]中的 ...

  2. Java实现Excel导入导出操作

    java 对excel的导入及导出 最近在做对excel的导入导出,在平常的工作中,导入导出excel数据是常见的需求,今天就简单的记录一下Java是如何来实现这个功能的,感兴趣或者正好大家在工作中遇 ...

  3. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  4. Excel导入-----导出(包含所选和全部)操作

    Excel导入-----导出(包含所选和全部)操作 在做系统的时候,很多时候信息量太大,这时候就需要进行Excel表格信息的导入和导出,今天就来给大家说一下我使用Excel表格信息导入和导出的心得. ...

  5. VB中Excel 2010的导入导出操作

    VB中Excel 2010的导入导出操作 编写人:左丘文 2015-4-11 近来这已是第二篇在讨论VB的相关问题,今天在这里,我想与大家一起分享一下在VB中如何从Excel中导入数据和导出数据到Ex ...

  6. Java操作大数据量Excel导入导出万能工具类(完整版)

    Java操作大数据量Excel导入导出万能工具类(完整版) 转载自:https://blog.csdn.net/JavaWebRookie/article/details/80843653 更新日志: ...

  7. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  8. Java 利用EasyPoi做Excel模板的导入导出操作

    Java 利用EasyPoi做Excel模板的导入导出操作 项目背景 加入pom依赖 项目Excel模板图 代码实现 首先是实体类定义 Excel 实现导入 Excel的导出 结束语 项目背景 作为一 ...

  9. 注解+反射优雅的实现Excel导入导出(通用版)

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/youzi1394046585/ article/details/86670203 日常在做后 ...

最新文章

  1. (广州)软件开发定制服务,工作流引擎 OA 库存管理系统
  2. 无法启动MySQL数据库
  3. python小数乘法_Polymorph:支持几乎所有现有协议的实时网络数据包操作框架
  4. SQL基础【二十、索引】(超细致版本,前理论,后实践,应对sql面试绰绰有余)
  5. android 融云浏览大图,融云 Android sdk kit 头像昵称更新机制
  6. 慎用dictionaryWithObjectsAndKeys方法
  7. java寻宝题目,神都夜行录寻宝答题答案大全 挖宝答题答案汇总
  8. 给MM修电脑的三个步骤
  9. Unity3D之NGUI基础5.1:代码控制UISprite
  10. 好看的vscode字体
  11. Centos7下安装svnadmin
  12. 在线电脑内存测试软件,Everest/PC Mark内存基准测试_金士顿 8GB DDR3 1600_内存硬盘-中关村在线...
  13. Android多开/分身检测
  14. Could not resolve type alias 解决方法
  15. Android Gmail签名客制化
  16. 治疗 | 如何识别和处理消极想法
  17. java半角转全角_JAVA 半角全角相互转换
  18. 数字化转型,你也可以品
  19. woo 10到任意进制,任意数值到十进制 之间转换
  20. 定时关机命令——shutdown

热门文章

  1. phantomjs linux 中文不显示,linux 安装phantomJs 用于截图,处理中文乱码,和样式问题...
  2. python输出不重复的单词_python-如何在文本文件中创建所有单词的列表,但字母重复的单词除外...
  3. hashCode() 和equals() 区别和作用
  4. 【转载】推荐系统-矩阵分解-SVD-通俗易懂
  5. 移动互联网高级开发学习笔记
  6. 预训练模型参数量越来越大?这里有你需要的BERT推理加速技术指南
  7. 浅谈个性化推荐系统中的非采样学习
  8. 训练技巧 | 功守道:NLP中的对抗训练 + PyTorch实现
  9. 实录分享 | 计算未来轻沙龙:计算机视觉与图形学(PPT下载)
  10. 本周最热 AI 论文大集合,还不快一键收藏?