首页 > 编程语言 >【心得】TP6,使用phpspreadsheet库进行EXCEL的数据导入导出

【心得】TP6,使用phpspreadsheet库进行EXCEL的数据导入导出

时间:2023-09-11 15:35:58浏览次数:39  
标签:header excel EXCEL phpspreadsheet TP6 newExcel setCellValue true getActiveSheet

在日常开发中,我们会遇到大批量的数据导出以及导入,之前的PHP旧库现在已经停更了,如下提示: image.png

composer require phpoffice/phpexcel
Package phpoffice/phpexcel is abandoned, you should avoid using it. Use phpoffice/phpspreadsheet instead.

phpoffice/phpexcel包已废弃,应避免使用。请改用phpoffice/phpspreadsheet。

所以我们应该按照提示进行操作,在项目的目录下,也就是vendor的上一级目录下执行:

composer require phpoffice/phpspreadsheet

等待安装完成后即刻进行在所需要使用的控制中引入类以及在extend目录下新建Excel.php文件: 下载EXCEL

<?php
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\IOFactory;
class Excel
{
    //execl模板下载
    public function template_download($studentList = '')
    {
        $newExcel = new Spreadsheet();  //创建一个新的excel文档
        $objSheet = $newExcel->getActiveSheet();  //获取当前操作sheet的对象
        $objSheet->setTitle('销售号码池');  //设置当前sheet的标题

        //设置宽度为true,不然太窄了
        $newExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('E')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('F')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('G')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('H')->setAutoSize(true);
        $newExcel->getActiveSheet()->getColumnDimension('I')->setAutoSize(true);

        //设置第一栏的标题
        $objSheet->setCellValue('A1', 'ID')
            ->setCellValue('B1', '企业名称')
            ->setCellValue('C1', '企业类型')
            ->setCellValue('D1', '归属地')
            ->setCellValue('E1', '客户姓名')
            ->setCellValue('F1', '手机号码')
            ->setCellValue('G1', '企业编号')
            ->setCellValue('H1', '公司地址');

        if($studentList === '')
        {
            //默认数据
            $explame_data_list = array(
                array(
                    's_nid' => '1',
                    's_name' => '小明',
                    's_number' => '18866886688',
                    's_area' => '中国',
                    's_companyName' => '文化有限有限公司',
                    's_companyType' => '公司/个体',
                    's_companyCode' => 'MA88888888888',
                    's_address' => '地球村'
                ),
            );
        }
        else
        {
            $explame_data_list = $studentList;
        }

        $baseRow = 2; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
        foreach ($explame_data_list as $k => $val) {
            $i = $k + $baseRow;
            $objSheet->setCellValue('A' . $i, $val['s_nid'])
                ->setCellValue('B' . $i, $val['s_companyName'])
                ->setCellValue('C' . $i, $val['s_companyType'])
                ->setCellValue('D' . $i, $val['s_area'])
                ->setCellValue('E' . $i, $val['s_name'])
                ->setCellValue('F' . $i, $val['s_number'])
                ->setCellValue('G' . $i, $val['s_companyCode'])
                ->setCellValue('H' . $i, $val['s_address']);
        }

        $this->downloadExcel($newExcel, '客户电话资料', 'Xls');
    }

    //公共文件,用来传入xls并下载
    private function downloadExcel($newExcel, $filename, $format)
    {
        // $format只能为 Xlsx 或 Xls
        if ($format == 'Xlsx') {
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        } elseif ($format == 'Xls') {
            header('Content-Type: application/vnd.ms-excel');
        }

        header("Content-Disposition: attachment;filename="
            . $filename . date('Y-m-d') . '.' . strtolower($format));
        header('Cache-Control: max-age=0');
        $objWriter = IOFactory::createWriter($newExcel, $format);

        $objWriter->save('php://output');

        //通过php保存在本地的时候需要用到
        //$objWriter->save($dir.'/demo.xlsx');

        //以下为需要用到IE时候设置
        // 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
        exit;
    }

}

上传导入Excel

在需要用到的控制器中只需要引入类库以及excel.php

<?php

namespace app\controller;
use Excel;
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\IOFactory;

public function uploadExcelNumber()
    {
        if(!Request()->isPost())
        {
            return View::fetch('Numberhub/uploadExcel');
        }

        header("content-type:text/html;charset=utf-8");

        $isFile = $_FILES;
        if($isFile['file']['name'] === '')
        {
            return json(['code'=>201,'msg'=>'请上传要导入的文件']);
        }

        $file = request()->file();

        try {
            validate(['file'=>'fileSize:10240000|fileExt:xls'])->check($file);

            $file = request()->file('file');
            // 上传到本地服务器
            $savename = Filesystem::disk('public')->putFile( 'topic', $file);
            //获取文件路径
            $filePath = app()->getRootPath() . 'public/storage' . DIRECTORY_SEPARATOR .  $savename;

            // 有Xls和Xlsx格式两种
            $reader = IOFactory::createReader('Xls');
        } catch (\think\exception\ValidateException $e) {
            return json(['code'=>201,'msg'=>$e->getMessage()]);
        }

        //载入excel文件
        $excel = $reader->load($filePath);

        //读取第一张表
        $sheet = $excel->getSheet(0);
        //获取总行数
        $row_num = $sheet->getHighestRow();
        //获取总列数
        //$col_num = $sheet->getHighestColumn();

        $import_data = []; //数组形式获取表格数据
        for ($i = 2; $i <= $row_num; $i++) {
            $arr = [
                's_companyName'  => $excel->getActiveSheet()->getCell("B" . $i)->getValue(),
                's_companyType'  => $excel->getActiveSheet()->getCell("C" . $i)->getValue(),
                's_area' => $excel->getActiveSheet()->getCell("D" . $i)->getValue(),
                's_name'=> $excel->getActiveSheet()->getCell("E" . $i)->getValue(),
                's_date' => Date('Y-m-d'),
                's_number' => $excel->getActiveSheet()->getCell("F" . $i)->getValue(),
                's_companyCode' => $excel->getActiveSheet()->getCell("G" . $i)->getValue(),
                's_address' => $excel->getActiveSheet()->getCell("H" . $i)->getValue()
            ];

            array_push($import_data,$arr);

        }

        if (empty($import_data)) {
            return json(['status' => '1', 'message' => '数据解析失败']);
        }

        //将数据保存到数据库
        $numberInfo = new Numberpool;

        for($v = 0;$v<count($import_data);$v++)
        {
            if($import_data[$v]['s_companyName'] === null)
            {
                $import_data[$v]['s_companyName'] = '';
            }

            if($import_data[$v]['s_companyCode'] === null)
            {
                $import_data[$v]['s_companyCode'] = '';
            }

            if($import_data[$v]['s_address'] === null)
            {
                $import_data[$v]['s_address'] = '';
            }

            $numberInfo->create($import_data[$v]);
        }

        unlink($filePath);
        return json(['code'=>200,'msg'=>'导入成功']);

    }

以上就是在TP6中使用phpspreadsheet库进行EXCEL的数据导入导出,后续所需要的优化可根据自己的需求进行处理,比如上传去重等。 但是友情提醒一点是,如果批量导入的数据比较大,需要进行分段导入,使用ajax分段或者使用缓存技术,将数据慢慢导入避免超时及压力太大造成系统崩溃。

标签:header,excel,EXCEL,phpspreadsheet,TP6,newExcel,setCellValue,true,getActiveSheet
From: https://blog.51cto.com/u_16240159/7436098

相关文章

  • openpyxl识别excel中的图片并保存
    fromopenpyxlimportload_workbookworkbook=load_workbook(r"C:\Users\ben_ma\Desktop\新建XLSX工作表.xlsx")num=1forsheet_nameinworkbook.sheetnames:worksheet=workbook[sheet_name]forimageinworksheet._images:img_da......
  • excel如何自动获取本周工作日的日期显示作为标题(周一至周五)
    一、背景:每周发周报的标题格式为:本周一到本周五的日期内容,如下:但是每隔一周发送的时候需要改一下周报标题里面的日期,比较麻烦目前的需求是通过函数自动化生成,根据当前的日期去定位出本周一的日期以及本周五的日期,再通过&字符组合在一起。 二、所需函数:today()功能:查看今天的......
  • Excel单元格快速交换相邻位置内容
    一、相邻两列内容交换(A1与B1交换)1.首先选择A1单元格的边框位置,出现了向上下左右的十字标志2.此时按住shift键,并且拖向B1单元格的右边,出现"工"汉字标志3.松开鼠标,不松开shift键盘,完成A1与B1单元格的交换 二、相邻两行内容交换(A1与A2交换)1.首先选择A1单元格的边框位置,出现......
  • 深入浅出理解数据分析系列之:Python安装Excel文档库openpyxl和Pycharm为项目安装Excel
    深入浅出理解数据分析系列之:Python安装Excel文档库openpyxl和Pycharm为项目安装Excel文档库openpyxl一、Python安装openpyxl二、Pycharm为项目安装openpyxl一、Python安装openpyxlpip3installopenpyxlCollectingopenpyxlDownloadingopenpyxl-3.0.9-py2.py3-none-any.whl......
  • Excelopenpyxl 关键字调用封装
    importopenpyxl,osfromPythonUI自动化.keywords_关键字驱动.综合.commonimportWebUIKeys,logfromopenpyxl.stylesimportFont,PatternFill#log=Logs().logger()classexcelOption():#获取Excel文件def__init__(self,file_path=None):if......
  • Confluence的Excel插件Elements Spreadsheet安装
    背景Confluence是现在广泛使用的团队协作文档系统。虽然自身带了一些表格编辑功能,但表格的整体功能较弱,比如不能通过Excel文件进行导入导出,表格在复制到Excel时格式会比较奇怪等等。对于未完全整合流程到Confluence上的团队,信息从Excel到在线文档系统的流转是个巨大的工作量。介......
  • JS Blob 下载时导出csv,通过excel软件打开中文乱码的问题:
    proxy.$http.post(url,commitObject.value,{headers:{responseType:'blob'}}).then((p)=>{if(p.data.code==200||p.status==200){ElMessage.success('预测成功,等待结果展示!')if(commitObject.value.returnTyp......
  • Excel联动(wps)
    Excel联动(wps)https://www.wps.cn/learning/course/detail/id/330423.htmldemo:https://files.cnblogs.com/files/zt007/Excel联动test.rar?t=1694151538&download=true......
  • 使用EasyExcel下载文件时,前端获取不到后端返回的文件名,无法下载到本地
    【问题描述】使用EasyExcel下载文件时,前端获取不到后端返回的文件名,无法下载到本地 【原因分析】实际上文件的流后端已经返回了,只是缺少了Content-Disposition属性返回,前端无法获取到文件名;privatestaticOutputStreamgetOutputStream(StringfileName,HttpServletRespon......
  • POI向Excel中写入数据及追加数据
    importorg.apache.poi.xssf.usermodel.XSSFCell;importorg.apache.poi.xssf.usermodel.XSSFRow;importorg.apache.poi.xssf.usermodel.XSSFSheet;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;importjava.io.*;importjava.util.ArrayList;importjava.util......