首页 > 其他分享 >laravel box/spout 处理excel大数据

laravel box/spout 处理excel大数据

时间:2023-05-29 09:44:59浏览次数:33  
标签:laravel box spout IOException foreach path data row

1、简介

laravel导入导出常规使用maatwebsite/excel,在处理大数据时效率低、占用过多内存。

box/spout效率高、占用内存少,更适合处理大数据的导入导出。

2、安装

composer require box/spout

"box/spout": "^3.1"

3、封装

<?php

namespace App\Services\Common;

use Box\Spout\Common\Entity\Row;
use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Exception\UnsupportedTypeException;
use Box\Spout\Common\Type;
use Box\Spout\Reader\Common\Creator\ReaderFactory;
use Box\Spout\Reader\Exception\ReaderNotOpenedException;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterFactory;
use Box\Spout\Writer\Exception\WriterNotOpenedException;

/**
 * box spout 导入导出Excel
 * Class ExcelSpout
 * @package App\Services\Common
 */
class ExcelSpout
{
    /**
     * 导出
     * @param string $path 路径
     * @param array $header 标题
     * @param array $data 数据
     * @param string $type 导出格式
     * @throws IOException
     */
    public function export(string $path, array $header, array $data, string $type = Type::XLSX)
    {
        try {
            $writer = WriterFactory::createFromType($type);
            $writer->openToFile($path);

            $headerRow = WriterEntityFactory::createRowFromArray($header);

            // 创建样式
            $style = (new StyleBuilder())
                ->setFontBold()
                ->build();

            // 给标题行添加样式
            foreach ($headerRow->getCells() as $cell) {
                $cell->setStyle($style);
            }

            $writer->addRow($headerRow);
            foreach ($data as $row) {
                $writer->addRow(WriterEntityFactory::createRowFromArray($row));
            }

            $writer->close();
        } catch (IOException | WriterNotOpenedException | UnsupportedTypeException $e) {
            throw new IOException($e->getMessage());
        }
    }


    /**
     * 导入
     * @param string $path 路径
     * @param int $startRow 数据开始行数
     * @return array
     * @throws IOException
     */
    public function import(string $path, int $startRow = 1)
    {
        try {
            $reader = ReaderFactory::createFromType(Type::XLSX);
            $reader->open($path);

            $data = [];
            foreach ($reader->getSheetIterator() as $sheet) {
                foreach ($sheet->getRowIterator() as $index => $row) {
                    if ($index >= $startRow) {
                        $data[] = $this->parseRow($row);
                    }
                }
            }

            $reader->close();
            return $data;
        } catch (UnsupportedTypeException | ReaderNotOpenedException | IOException $e) {
            throw new IOException($e->getMessage());
        }
    }

    /**
     * 读取一行数据
     * @param Row $row
     * @return array
     */
    protected function parseRow(Row $row)
    {
        $data = [];
        foreach ($row->getCells() as $cell) {
            $data[] = $cell->getValue();
        }
        return $data;
    }
}

4、调用

  • 导出
$filePath = storage_path('app/export/ExcelSpout-export-'.time().'.xlsx');
$header = ['标题','内容'];
$exportData = [['title1','content1'],['title2','content2']];
app(ExcelSpout::class)->export($filePath, $header, $exportData);
  • 导入
$filePath = 'xxx.xlsx';
$data = app(ExcelSpout::class)->import($filePath, 1);
dd($data)

标签:laravel,box,spout,IOException,foreach,path,data,row
From: https://www.cnblogs.com/pine007/p/17439532.html

相关文章

  • 解决laravel环境在Ubuntu下使用php artisan 创建文件后无法在phpstorm中编辑的问题
    一、打开ubuntu运行sudovi/etc/profile.在末尾添加 umask000exportumask摁esc后保存:wq退出重启电脑即可二、或者直接在ubuntu下运行umask000这样创建文件后文件权限直接是777 三、以上两者区别1.第一点防止重启电脑后将umask重置掉2.第二点如果执行此命令的......
  • 汇编DOS-BOX的安装
           ......
  • busybox是什么
    BusyBox是一个单一可执行文件的软件集合,旨在提供一个轻量级的Unix工具箱,包含了许多常用的命令和实用程序。它被设计为在嵌入式系统和资源受限的环境中运行,以提供基本的命令行功能。BusyBox的设计目标是通过将多个工具整合到一个可执行文件中,减少系统的空间占用和资源消耗。它......
  • 虚拟机磁盘空间不够了怎么办:VirtualBox/Ubuntu22.04扩展磁盘空间
    当虚拟机在使用过程中发现需要使用的硬盘容量超过创建时分配的硬盘容量时,就会很尴尬,像这样:(b.t.w,要是虚拟硬盘选择的是动态分配存储模式,但虚拟分配空间超过你的物理硬盘空间,当虚拟机使用了超过物理空间的大小时,亲测虚拟机会闪退,切记切记)用如下方式为虚拟硬盘扩容:(1)......
  • 如何使用ChoiceBox以接收用户的单项选择
    如何使用ChoiceBox以接收用户的单项选择ChoiceBox是一种下拉框,点击后显示可选列表,从中可以再点击选择一个选项。ChoiceBox可以用于接收用户的单项选择。效果展示示例代码importjavafx.application.Application;importjavafx.geometry.Insets;importjavafx.scene.Sce......
  • 如何使用CheckBox以获取用户的选择
    如何使用CheckBox以获取用户的选择CheckBox是一个复选框,它有两种状态:选中和非选中。CheckBox可以比较直观的表现用户的选择情况。效果展示示例代码importjava.util.Map;importjava.util.TreeMap;importjavafx.application.Application;importjavafx.geometry.Inse......
  • hackthebox --interface medium
    主机发现nmap-sV-sC-O-p22,8010.10.11.200-oNports 访问80页面,主页面是这样的 再访问一下index.php或者index.html发现是404错误,有可能是里面隐藏了一些api我们可以查看到搜索看看有没有类似的api泄露利用f12查看js源码搜索http://或者/或者/upload这里......
  • FFMpeg笔记(十二)MP4 box解析
      MP4包含3大box。一、ftypfiletypebox,包含视频文件使用的mp4标准,也作为probemp4的标志;二、moov包含媒体的元数据信息,包含一个mvhd(也就是headerbox)和若干个trak(track)。trak包含一条音/视频轨道信息和音视频数据的编码格式、音视频数据样本、chunks的大小,存储位置,PTS等......
  • FLEX4实践—DropDownList与ComboBox
    FLEX4相对FLEX3的组件变化列表中列出以这么一项:mx.controls.ComboBox->spark.components.DropDownList 官方解释如下:   ComboBox控件是DropDownListBase控件的子类。与DropDownListBase控件类似,当用户从ComboBox控件的下拉列表中选择某项时,数据项将显示在......
  • hackthebox --aragog
    主机发现与爆破nmap-sT--min-rate1000010.10.10.78nmap-sT-sV-sC-O-p22,21,8010.10.10.78 发现有ftp匿名登陆└─$ftp10.10.10.78Connectedto10.10.10.78.220(vsFTPd3.0.3)Name(10.10.10.78:kali):anonymous230Loginsuccessful.Remotesystemtypeis......