实现excel导入功能(在fastadmin或thinkphp都可以内嵌成功,傻瓜式教程)
这是excel文件案例,亲测有效。
这是自定义的页面不是列表,类似详情页
1.composer 下载PhpSpreadsheet, 要求Php版本: ^7.1
composer require phpoffice/phpspreadsheet
2.在对应控制器里,添加上传导入方法
use PhpOffice\PhpSpreadsheet\IOFactory; //导入Excel必须使用
use PhpOffice\PhpSpreadsheet\Spreadsheet; //导出Excel必须使用
use think\Exception; //建议加上这行防止读取错误时,可以返回正确格式的错误提示
3. 读取excel关键代码,此处不包含上传,上传代码可以使用ajax另外上传,返回路径后提交上来。
public function import_excel()
{
try {
//获取已上传完成后的文件路径
//类似这样 /uploads/20231007/3daa432aba544c68a0bd5748a4fea315.xls
$file = input('post.file');
if(empty($file)){
$this->error('请先上传Excel文件');
}
//获取excel的服务器绝对路径
//类似这样 /www/wwwroot/dj.wallsu.com/public/storage/excel/20230710
$filePath = ROOT_PATH.'public'.$file;
// 截取后缀
$fileExtendName = substr(strrchr($file, '.'), 1);
//判断文件类型
if($fileExtendName != 'xls' && $fileExtendName != 'xlsx'){
$this->error('仅支持xls,xlsx格式');
}
/**
* 以下是导入Excel文件的关键代码 ---- 开始
* 下面两行代码是读取的关键,第三行是删除表头
*/
//IOFactory调用load方法加载Excel文件
$objReader = IOFactory::load($filePath); //IOFactory 这样是上面 use 后出来的
//获取其中的数据
$excelData = $objReader->getActiveSheet()->toArray(true, true, true, true, true);
//删除第一行元素(表头)
array_shift($excelData);
//定义一个空数组,下面有用
$data = [];
//重新改装数组为二维数组,方便批量插入数据库
foreach ($excelData as $k=>$v){
//判断是否为空,去掉第一行表头
if (!empty($v)) {
//赋值内容到数组中 根据表格内容的列数下标从0开始
$data[$k]['name'] = $v['A']; //name是字段,A是第一列,下面以此类推
$data[$k]['age'] = $v['B'];
$data[$k]['sex'] = $v['C'];
$data[$k]['borthday'] = $v['D'];
}
}
/**
* 以上是导入Excel文件的关键代码 ---- 结束
*/
if(empty($data)){
$this->error('无有效数据');
}
//dump($data); //这里是二位数组
//写业务逻辑,保存进库
$res = db('user')->insertAll($data);
if($res){
$this->success('导入名单成功');
}else{
$this->error('导入名单失败');
}
}catch(\Exception $e){
$this->error($e->getMessage());
}
}