think PHP导入导出excel

news2025/1/21 9:30:33

本地环境

think PHP5,PhpOffice/PhpSpreadsheet,composer
PHP版本7.4,这个插件的最低版本要求7.2
配置PhpSpreadsheet
官网:https://phpspreadsheet.readthedocs.io/en/stable/

composer require phpoffice/phpspreadsheet

数据库与excel表

在这里插入图片描述
在这里插入图片描述

导入文件

思路:首先读取excel文件数据,将他存放在缓存中,然后按照数据库的插入指令,插入数据

测试

public function upexceltest()
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setCellValue('A1', 'Welcome to Helloweba.');
        $writer = new Xlsx($spreadsheet);
        $path = ROOT_PATH.'public'.DS.'uploads'.DS.'excel';
        $writer->save($path.'/'.'hello.xlsx');//默认保存文件到public
        dump($writer);

    }

这段代码会产生一个excel文件

存缓存

新建phpspreadsheet实例

use think\Db;
use think\Request;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

获取数据,移动获取到的excel文件到本地目录

//正式使用excel上传
    //读取excel数据然后将数据组装成sql语句,传递进mysql中
    //第一步,读取excel信息,将数据中需要的预处理提取出来
    //第二部,将预处理数据进行封装成sql数据,使用模型传入数据库
    public function upexcel(Request $request)
    {
        // 判断请求类型是否为POST
        if ($request->isPost()) {
            // 获取上传的文件信息
            $file = $request->file('file');
            if (empty($file)) {
                $this->error('请选择要上传的文件!');
            }
            // 移动到框架应用根目录/public/uploads/ 目录下
            $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads'.'/excel');
            if ($info) {
                // 获取文件路径
                $filePath = $info->getSaveName();

开始实例化导入

try {
                    // 使用PHPSpreadsheet读取Excel文件
                    $reader = IOFactory::createReader('Xlsx');
                    $reader->setReadDataOnly(true);
                    $spreadsheet = $reader->load(ROOT_PATH . 'public' . DS . 'uploads'.'/excel' . DS . $filePath);
                    $worksheet = $spreadsheet->getActiveSheet();//获取excel中的活动表
                    $highestRow = $worksheet->getHighestRow(); // 总行数
                    $highestColumn = $worksheet->getHighestColumn(); // 总列数
                    $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn); // 转换为数字索引
                    $lines = $highestRow - 1; // 减1是因为Excel的行号从1开始,实际数据行应从第2行开始计算
                    if ($lines <= 0) {
                        $this->error('Excel表格中没有数据!');
                    } else {

将数据提取出来成数组

$rowData = []; // 初始化二维数组,在外部循环之前定义

                        for ($row = 2; $row <= $highestRow; ++$row) {
                            // 为每一行初始化一个新的数据数组
                            $currentRowData = [];

                            for ($col = 1; $col <= $highestColumnIndex; ++$col) {
                                // 使用较新的 getCell() 方法,但首先确认您的PhpSpreadsheet版本
                                $cellAddress = Coordinate::stringFromColumnIndex($col) . $row; // 转换列索引为列字母
                                $cell = $worksheet->getCell($cellAddress);
                                $currentRowData[] = $cell->getValue(); // 将当前单元格的值添加到该行数据中
                            }
                            // 将当前行的所有数据作为一个数组添加到 rowData
                            $rowData[] = $currentRowData;
                        }
                        // 现在,$rowData 是一个二维数组,每个内部数组代表一行的数据
//                        return json_encode($rowData); // 打印出来检查结果
                        //将二维数组转换为键值对的数据,姓名:mmm,语文:23
//                        foreach($rowData as $key=>$value){
//                            foreach ($rowData[])
//                        }

将数组提取出来组合成sql需要的数组批量导入数据库

$newData = [];
                        foreach($rowData as $row){
                            $newRow = ['name' => $row[0], 'chinese' => $row[1],'math'=>$row[2],'english'=>$row[3]];
                            $newData[] = $newRow;
                        }
                        $data = model('student')->insertAll($newData);
                        if ($data){
                            return json_encode(['code'=>200,'msg'=>'Excel数据导入成功!']);
                        }
                    }
                } catch (\Exception $e) {
                    return "导入失败";
                };
            }
        }
    }

完整代码

//正式使用excel上传
    //读取excel数据然后将数据组装成sql语句,传递进mysql中
    //第一步,读取excel信息,将数据中需要的预处理提取出来
    //第二部,将预处理数据进行封装成sql数据,使用模型传入数据库
    public function upexcel(Request $request)
    {
        // 判断请求类型是否为POST
        if ($request->isPost()) {
            // 获取上传的文件信息
            $file = $request->file('file');
            if (empty($file)) {
                $this->error('请选择要上传的文件!');
            }
            // 移动到框架应用根目录/public/uploads/ 目录下
            $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads'.'/excel');
            if ($info) {
                // 获取文件路径
                $filePath = $info->getSaveName();

                try {
                    // 使用PHPSpreadsheet读取Excel文件
                    $reader = IOFactory::createReader('Xlsx');
                    $reader->setReadDataOnly(true);
                    $spreadsheet = $reader->load(ROOT_PATH . 'public' . DS . 'uploads'.'/excel' . DS . $filePath);
                    $worksheet = $spreadsheet->getActiveSheet();//获取excel中的活动表
                    $highestRow = $worksheet->getHighestRow(); // 总行数
                    $highestColumn = $worksheet->getHighestColumn(); // 总列数
                    $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn); // 转换为数字索引
                    $lines = $highestRow - 1; // 减1是因为Excel的行号从1开始,实际数据行应从第2行开始计算
                    if ($lines <= 0) {
                        $this->error('Excel表格中没有数据!');
                    } else {
                        // 这里可以添加读取每行数据的逻辑,例如:
                        $rowData = []; // 初始化二维数组,在外部循环之前定义

                        for ($row = 2; $row <= $highestRow; ++$row) {
                            // 为每一行初始化一个新的数据数组
                            $currentRowData = [];

                            for ($col = 1; $col <= $highestColumnIndex; ++$col) {
                                // 使用较新的 getCell() 方法,但首先确认您的PhpSpreadsheet版本
                                $cellAddress = Coordinate::stringFromColumnIndex($col) . $row; // 转换列索引为列字母
                                $cell = $worksheet->getCell($cellAddress);
                                $currentRowData[] = $cell->getValue(); // 将当前单元格的值添加到该行数据中
                            }
                            // 将当前行的所有数据作为一个数组添加到 rowData
                            $rowData[] = $currentRowData;
                        }
                        // 现在,$rowData 是一个二维数组,每个内部数组代表一行的数据
//                        return json_encode($rowData); // 打印出来检查结果
                        //将二维数组转换为键值对的数据,姓名:mmm,语文:23
//                        foreach($rowData as $key=>$value){
//                            foreach ($rowData[])
//                        }
                        $newData = [];
                        foreach($rowData as $row){
                            $newRow = ['name' => $row[0], 'chinese' => $row[1],'math'=>$row[2],'english'=>$row[3]];
                            $newData[] = $newRow;
                        }
                        $data = model('student')->insertAll($newData);
                        if ($data){
                            return json_encode(['code'=>200,'msg'=>'Excel数据导入成功!']);
                        }
                    }
                } catch (\Exception $e) {
                    return "导入失败";
                };
            }
        }
    }

导出数据

从数据库导出数据
思路:通过sql语句查询数据,转化成二维数组,二维数组之后按照foreach循环将数据按照要求传入excel表

实例化excel表格

//导出数据,第一步,导出数据库,第二部通过数据库导出成excel数据
    public function downexcel()
    {

        //设置表数据
        $spreadsheet = new Spreadsheet();
        $worksheet = $spreadsheet->getActiveSheet();
        //设置工作表标题名称
        $worksheet->setTitle('学生成绩表');
        //将其存入excel表
        //表头
        设置单元格内容
        $worksheet->setCellValue('A1',  '学生成绩表');
        $worksheet->setCellValue('A2','姓名');
        $worksheet->setCellValue('B2',  '语文');
        $worksheet->setCellValue('C2',  '数学');
        $worksheet->setCellValue('D2', '外语');
        $worksheet->setCellValue('E2',  '总分');
        //合并单元格
        $worksheet->mergeCells('A1:E1');

        $styleArray = [
            'font' => [
                'bold' => true
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];
        //设置单元格样式
        $worksheet->getStyle('A1')->applyFromArray($styleArray)->getFont()->setSize(28);
        $worksheet->getStyle('A2:E2')->applyFromArray($styleArray)->getFont()->setSize(14);

查询数据库数据,并按要求写入数据库

$db = Db::query('select id,name,chinese,math,english from fa_student');
     $len = count($db);
     $j = 0;
     for($i=0;$i<$len;$i++){
         $j = $i+3;//从第三行开始
         $data = $db[$i];
         $worksheet->setCellValue('A'.$j,$data['name']);//A3,第一行
         $worksheet->setCellValue('B'.$j,$data['chinese']);//A3,第一行
         $worksheet->setCellValue('C'.$j,$data['math']);//A3,第一行
         $worksheet->setCellValue('D'.$j,$data['english']);//A3,第一行
         $worksheet->setCellValue('E'.$j,$data['chinese'] + $data['math'] + $data['english']);//
     }

设置excel格的式

 //设置外边框
      $styleArrayBody = [
          'borders' => [
              'allBorders' => [
                  'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                  'color' => ['argb' => '666666'],
              ],
          ],
          'alignment' => [
              'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
          ],
      ];
      $total_rows = $len + 2;
//添加所有边框/居中
      $worksheet->getStyle('A1:E'.$total_rows)->applyFromArray($styleArrayBody);

打印数据

       //保存数据并使用浏览器打印出来
//        $filename = '成绩表.xlsx';
//        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
//        header('Content-Disposition: attachment;filename="'.$filename.'"');
//        header('Cache-Control: max-age=0');
//        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        //这行代码会将生成的Excel文件内容直接输出到HTTP响应体中,这意味着它将作为下载的形式提供给客户端(比如浏览器),或者如果是在命令行脚本中运行,则会输出到标准输出流。
//        $writer->save('php://output');//如果不需要浏览器打开就保存excel文件的话,请注释掉这行代码

        //保存数据直接保存为excel,好像没啥区别
        $filename = '成绩表.xlsx';
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$filename.'"');
        header('Cache-Control: max-age=0');
        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        $writer->save('php://output');
    }

完整代码

    //导出数据,第一步,导出数据库,第二部通过数据库导出成excel数据
    public function downexcel()
    {

        //设置表数据
        $spreadsheet = new Spreadsheet();
        $worksheet = $spreadsheet->getActiveSheet();
        //设置工作表标题名称
        $worksheet->setTitle('学生成绩表');
        //将其存入excel表
        //表头
        设置单元格内容
        $worksheet->setCellValue('A1',  '学生成绩表');
        $worksheet->setCellValue('A2','姓名');
        $worksheet->setCellValue('B2',  '语文');
        $worksheet->setCellValue('C2',  '数学');
        $worksheet->setCellValue('D2', '外语');
        $worksheet->setCellValue('E2',  '总分');
        //合并单元格
        $worksheet->mergeCells('A1:E1');

        $styleArray = [
            'font' => [
                'bold' => true
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];
        //设置单元格样式
        $worksheet->getStyle('A1')->applyFromArray($styleArray)->getFont()->setSize(28);
        $worksheet->getStyle('A2:E2')->applyFromArray($styleArray)->getFont()->setSize(14);
        $db = Db::query('select id,name,chinese,math,english from fa_student');
        $len = count($db);
        $j = 0;
        for($i=0;$i<$len;$i++){
            $j = $i+3;//从第三行开始
            $data = $db[$i];
            $worksheet->setCellValue('A'.$j,$data['name']);//A3,第一行
            $worksheet->setCellValue('B'.$j,$data['chinese']);//A3,第一行
            $worksheet->setCellValue('C'.$j,$data['math']);//A3,第一行
            $worksheet->setCellValue('D'.$j,$data['english']);//A3,第一行
            $worksheet->setCellValue('E'.$j,$data['chinese'] + $data['math'] + $data['english']);//
        }

        //设置外边框
        $styleArrayBody = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['argb' => '666666'],
                ],
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];
        $total_rows = $len + 2;
//添加所有边框/居中
        $worksheet->getStyle('A1:E'.$total_rows)->applyFromArray($styleArrayBody);

        //保存数据并使用浏览器打印出来
//        $filename = '成绩表.xlsx';
//        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
//        header('Content-Disposition: attachment;filename="'.$filename.'"');
//        header('Cache-Control: max-age=0');
//        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        //这行代码会将生成的Excel文件内容直接输出到HTTP响应体中,这意味着它将作为下载的形式提供给客户端(比如浏览器),或者如果是在命令行脚本中运行,则会输出到标准输出流。
//        $writer->save('php://output');//如果不需要浏览器打开就保存excel文件的话,请注释掉这行代码

        //保存数据直接保存为excel,好像没啥区别
        $filename = '成绩表.xlsx';
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$filename.'"');
        header('Cache-Control: max-age=0');
        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        $writer->save('php://output');
    }

原作者连接
https://blog.csdn.net/ice_mocha/article/details/116460057
更详细

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1673904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华强北宋仕强论道之项目管理

华强北宋仕强论道之项目管理&#xff0c;金航标和萨科微总经理宋仕强先生说&#xff0c;良好的项目管理是企业成功的关键之一&#xff0c;项目是公司最小的管理单元&#xff0c;而项目管理则是确保项目顺利完成的关键工作。在一个项目中&#xff0c;需要明确目标&#xff0c;合…

下载element-ui报错

此错误表示尝试从npm注册表下载“resize observer polyfill”包时超时。这可能是由于网络连接问题或npm注册表服务器的问题。 要解决此问题&#xff0c;您可以尝试以下步骤&#xff1a; 1.重试npm install命令&#xff1a;有时&#xff0c;网络问题会导致临时超时。再次运行npm…

用友NC printBill 任意文件读取/删除漏洞复现(XVE-2024-10609)

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC printBill 接口处存在任意文件读…

【Unity】为小球添加爆发力往前移动的代码

代码里的几个变量都需要在场景中提前创建好并赋值 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Shotobjt : MonoBehaviour {// 点击按钮&#xff0c;克隆一个prefab&#xff0c;然后给这个克隆后的对象添加往前方的力publi…

搭建Rust开发环境

Windows搭建 下载&#xff1a;https://www.rust-lang.org/zh-CN/tools/install Linux搭建 这里我更推荐基于Linux搭建。 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh

如何用微信小程序实现远程控制4路控制器/断路器

如何用微信小程序实现远程控制4路控制器/断路器呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制4路控制器/断路器&#xff0c;支持4路输出&#xff0c;均可独立控制&#xff0c;可接入各种电器。 可选用产品&#xff1a;可根据实际场景需求&#xf…

最新小红书颜值打分项目,吸引小姐姐,刷爆后端收益

嘿&#xff0c;朋友们&#xff01;今天我要给你们分享一个我自己都觉得挺诧异的项目&#xff0c;它叫做“颜值打分”。听起来有点搞笑对吧&#xff1f;但真的&#xff0c;这个项目已经帮助了很多人实现了月入万元的目标。你没听错&#xff0c;就是月入万元&#xff01;所以&…

品牌出海新趋势:掌握“微创新”策略,快速适应海外市场

在全球化的今天&#xff0c;品牌出海已成为众多企业拓展业务、实现国际化发展的重要途径。然而&#xff0c;海外市场与本土市场在文化、消费习惯、法律法规等方面均存在显著差异&#xff0c;这要求品牌在海外市场中必须灵活应变&#xff0c;通过微小的、有针对性的创新来快速适…

node和npm版本太高导致项目无法正常安装依赖以及正常运行的解决办法:如何使用nvm对node和npm版本进行切换和管理

1&#xff0c;点击下载 nvm 并且安装 进入nvm的github&#xff1a; GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. 这里下载发行版&#xff0c;Releases coreybutler/nvm-windows GitHub 找到 这个 nv…

C# XPTable in .net6(XPTable控件使用说明八)

经过作者schoetbi、armin-pfaeffle的努力&#xff0c;XPTable已经可以在 winform .net6 .net8的环境下使用&#xff0c;版本升级到了2.0&#xff0c;这样就可以在winform下同时使用XPTABLE和EFcore, 这样就可以解决大部分的场景了。

提示词技巧十个级别:你达到了哪个水平?

在数字化时代&#xff0c;人工智能的应用已成为提升效率和优化交互的关键。特别是在内容生成领域&#xff0c;如何有效地使用ChatGPT来达到最佳的交互效果成为了一个热门话题。最近&#xff0c;一段关于ChatGPT提示词技巧的视频引起了广泛关注&#xff0c;视频中将提示词技巧分…

ai写作软件有哪些?看看这几款好用免费的Ai写作工具

在科技的浩瀚星海中&#xff0c;人工智能技术的星辰愈发闪耀。近年来&#xff0c;AI写作技术作为其中的重要分支&#xff0c;正以其独特的光芒&#xff0c;改变着传统的内容创作模式。今天&#xff0c;我们就来深入讨论一下这项技术的实力和前景。 我们要明确一个概念&#xff…

从旺店通·企业奇门到金蝶云星空通过接口配置打通数据

从旺店通企业奇门到金蝶云星空通过接口配置打通数据 接通系统&#xff1a;旺店通企业奇门 慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xff0c;先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策的…

一直可以正常 git push 代码,突然就不行了,提示端口22错误,访问超时!

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是当使用 git 时&#xff0c;突然提示端口错误&#xff0c;然后访问超时&#xff0c;我解决的过程以及最后的解决方案。 最新文章通过公众号「设计师工作日常」发布。 目录 不好意思&a…

pydot、graphviz绘制模型拓扑结构

【目标】采用pydot、pydot-ng、pydotplus和graphviz绘制模型拓扑结构。 【问题来源】 明明安装了pydot和graphviz&#xff0c;但是在jupyter notebook里运行的时候&#xff0c;还是没有结果&#xff0c;提示“You must install pydot (pip install pydot) and install graph…

简单的mysql主从复制搭建

文章目录 准备工作用Docker安装MySQL主库配置【192.168.13.32】从库配置【192.168.13.108】小结 准备工作 用虚拟机提前准备两台服务器&#xff0c;并且在服务器中分别安装好MySQL&#xff0c;服务器的信息如下&#xff1a; 数据库IP主节点192.168.13.32从节点192.168.13.108…

gradle 共享存储挂载缓存目录的问题

2个任务同时构建的时候&#xff0c;报错如上。 原因&#xff1a;挂载目录的问题导致的&#xff0c;挂在最小粒度的目录下。 /home/app/.gradle/caches/modules-2/files-2.1 挂载到这个级别的目录下。

OBS插件--NDI输入与输出

NDI是什么&#xff1f; NDI&#xff0c;全称Network Device Interface&#xff0c;是一种IP网络设备接口协议&#xff0c;它使得视频兼容产品能够通过局域网进行视频共享。NDI协议采用数字高清以太网传输技术&#xff0c;将前端采集类设备&#xff08;如NDI数字高清摄像机&…

翻译《The Old New Thing》- Taxes: Remote Desktop Connection and painting

Taxes: Remote Desktop Connection and painting - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20060103-12/?p32793 Raymond Chen 2006年01月03日 开发成本&#xff1a;远程桌面连接和绘制 当用户通过远程桌面连接进行连接时&#xff0c;视频操作会通过网…

四川易点慧电商抖音小店:优势尽显,引领电商新潮流

在当下这个信息爆炸、消费模式日新月异的时代&#xff0c;电商行业正在经历一场前所未有的变革。四川易点慧电商抖音小店凭借其独特的优势&#xff0c;成功吸引了大量消费者的目光&#xff0c;成为电商领域的一股新势力。 四川易点慧电商抖音小店的最大优势在于其强大的品牌影…