ThinkPHP6 excel 导入功能完整实现

在 ThinkPHP 6.0 中实现 excel 导入导出功能,需要使用第三方库或扩展,例如 phpspreadsheet。

安装
项目目录下打开命令行,执行命令:

composer require phpoffice/phpspreadsheet
安装过程

$ composer require phpoffice/phpspreadsheet
Using version ^1.25 for phpoffice/phpspreadsheet
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 8 installs, 0 updates, 0 removals
  - Installing psr/http-factory (1.0.1): Loading from cache
  - Installing psr/http-client (1.0.1): Loading from cache
  - Installing markbaker/matrix (3.0.1): Downloading (100%)
  - Installing markbaker/complex (3.0.2): Downloading (100%)
  - Installing myclabs/php-enum (1.8.4): Downloading (100%)
  - Installing maennchen/zipstream-php (2.1.0): Downloading (100%)
  - Installing ezyang/htmlpurifier (v4.16.0): Downloading (100%)
  - Installing phpoffice/phpspreadsheet (1.25.2): Downloading (100%)
ezyang/htmlpurifier suggests installing cerdic/css-tidy (If you want to use the filter 'Filter.ExtractStyleBlocks'.)
ezyang/htmlpurifier suggests installing ext-tidy (Used for pretty-printing HTML)
phpoffice/phpspreadsheet suggests installing ext-intl (PHP Internationalization Functions)
phpoffice/phpspreadsheet suggests installing mpdf/mpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing dompdf/dompdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing tecnickcom/tcpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing mitoteam/jpgraph (Option for rendering charts, or including charts with PDF or HTML Writers)
Writing lock file
Generating autoload files
> @php think service:discover
Succeed!
> @php think vendor:publish
File D:\tp_solve\config\trace.php exist!
Succeed!
加载类库
use PhpOffice\PhpSpreadsheet\IOFactory;


添加路由
上传文件改用post提交

Route::post('productImport', 'ProductOrder/importExcel');
实战代码
/**
 * excel 导入
 * @return false|string
 */
public function importExcel()
{
    $file = request()->file('file');
    if (!$file) {
        print_r('请选择需要导入的文件');die;
    }
 
    // 加载文件
    $spreadsheet = IOFactory::load($file->getRealPath());
    $sheet = $spreadsheet->getActiveSheet();
 
    // 处理文件数据
    $data = [];
    foreach ($sheet->getRowIterator() as $row) {
        $rowIndex = $row->getRowIndex();
        // 不读取第一行 标题
        if ($rowIndex == 1) {
            continue;
        }
        $cellIterator = $row->getCellIterator();
        $row = [];
        foreach ($cellIterator as $cell) {
            $row[] = $cell->getValue();
        }
        $data[] = $row;
    }
 
    // 数据入库处理
 
 
    print_r($data);die;
}
tp6实现Excel导入很简单,实现步骤如下:

1、使用composer安装PHPExcel

composer require phpoffice/phpexcel
image.png

2、执行composer更新

composer update
3、代码实现

<?php
declare (strict_types = 1);
 
namespace app\union\controller;
 
use app\Request;
use app\union\model\Groups;
use think\facade\Cookie;
use think\facade\Db;
use think\facade\View;
use PHPExcel_IOFactory;	//通过composer加载的第三方类,直接在头部引入一下就可以
 
class Group extends Base
{
	    public function import_save(Request $request){
        if(!$request->param('excel')){
            return returnJson('500','请上传excel文件');
        }
        $path = public_path().$request->param('excel');
 
        //实例化PHPExcel类
        $PHPExcel = new \PHPExcel();
        //默认用excel2007读取excel,若格式不对,则用之前的版本进行读取
        $PHPReader = new \PHPExcel_Reader_Excel2007();
        if (!$PHPReader->canRead($path)) {
            $PHPReader = new \PHPExcel_Reader_Excel5();
            if (!$PHPReader->canRead($path)) {
                return returnJson('500','请上传excel文件');
            }
        }
        //读取Excel文件
        $PHPExcel = $PHPReader->load($path);
        //读取excel文件中的第一个工作表
        $sheet = $PHPExcel->getSheet(0);
        //取得最大的列号
        $allColumn = $sheet->getHighestColumn();
        //取得最大的行号
        $allRow = $sheet->getHighestRow();
 
        //从第二行开始插入,第一行是列名
        for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
            //获取B列的值
            $data = [
                'number'=>$PHPExcel->getActiveSheet()->getCell("A" . $currentRow)->getValue(),
                'nickName'=>$PHPExcel->getActiveSheet()->getCell("B" . $currentRow)->getValue(),
                'name'=>$PHPExcel->getActiveSheet()->getCell("C" . $currentRow)->getValue(),
                'tel'=>$PHPExcel->getActiveSheet()->getCell("D" . $currentRow)->getValue(),
                'money'=>$PHPExcel->getActiveSheet()->getCell("E" . $currentRow)->getValue(),
                'time'=>self::get_date_by_excel($PHPExcel->getActiveSheet()->getCell("F" . $currentRow)->getValue()),
                'is_pay'=>$PHPExcel->getActiveSheet()->getCell("G" . $currentRow)->getValue(),
                'shop_name'=>$PHPExcel->getActiveSheet()->getCell("H" . $currentRow)->getValue(),
                'remarks'=>$PHPExcel->getActiveSheet()->getCell("I" . $currentRow)->getValue(),
                'status'=>0,
                'created_at'=>date('Y-m-d')
            ];
            if($data['number'] == ''){
                $result = 1;
                continue;
            }else{
                $find = Groups::where(array('number'=>$data['number']))->find();
                if($find){
                    $result = 1;
                    continue;
 
                }else{
                    $result=Db::name('group')->insert($data);
                }
            }
 
        }
        if($result){
            return returnJson('200','导入成功');
        }else{
            return returnJson('500','导入失败');
        }
    }
    public static function get_date_by_excel($date){
        if (!$date || $date == '0000-00-00') return null;
 
        $unix_time = \PHPExcel_Shared_Date::ExcelToPHP($date);
 
        return gmdate('Y-m-d H:i',$unix_time);
 
    }
}
?>

ps:

https://blog.csdn.net/json_ligege/article/details/129014570

https://www.tpxhm.com/fdetail/725.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章