php读写excel文件

1.引入包

有不少提供读写excel文件的包,这里选择比较常用的一个,加到自己的项目里就好了。

    "phpoffice/phpspreadsheet": "1.8.2",

2.读取文件

<?php
use PhpOffice\PhpSpreadsheet\IOFactory;

require "vendor/autoload.php";

$f = "/tmp/excelSample.xlsx";

try {
    $inputFileType = IOFactory::identify($f);

    $reader = IOFactory::createReader($inputFileType);

    $spreadSheet = $reader->load($f);

    //获取第几张数据表,默认从0开始
    $sheet = $spreadSheet->getSheet(0);

    //获取最大行数
    $rows = $sheet->getHighestRow();
    
    //获取最大列数
    $cols = $sheet->getHighestColumn();

    //获取全量数据集,返回数组形式数据
    $dataArr = $sheet->rangeToArray('A1:' . $cols . $rows);

    for ($i = 2; $i <= $rows; $i++) {
        //获取一列数据
        $ret['id'][] = $sheet->getCell('A' . $i)->getValue();
    }
}catch (Exception $e) {
    var_dump($e->getMessage());
}

我们把上边的方法改造一下,做个通用的,只需要传入excel文件路径,就可以直接读取文件,返回数组形式的全量数据的方法。

<?php
use PhpOffice\PhpSpreadsheet\IOFactory;

require "vendor/autoload.php";

$filepath = "/tmp/excelSample.xlsx";

try {
    $data = getExcelContents($filepath);
    var_dump($data);
}catch (Exception $e) {
    var_dump($e->getMessage());
}

/**
 * @throws \PhpOffice\PhpSpreadsheet\Exception
 * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
 */
function getExcelContents($filepath)
{
    $inputFileType = IOFactory::identify($filepath);
    $reader = IOFactory::createReader($inputFileType);
    $spreadSheet = $reader->load($filepath);

    //获取第几张数据表,默认从0开始
    $sheet = $spreadSheet->getSheet(0);

    //获取最大行数
    $rows = $sheet->getHighestRow();
    //获取最大列数
    $cols = $sheet->getHighestColumn();

    //获取全量数据集
    $dataArr = $sheet->rangeToArray('A1:' . $cols . $rows);

    return $dataArr;
}

3.写入文件

读取的时候,我们能发现读取出来的数据都是数组的形式,那写入excel文件的时候,使用的数据也是数组的形式。

<?php
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

require "vendor/autoload.php";

$filepath = "/tmp/exportExcel.xlsx";

try {
    $data = [
        [
            'id',
            'name',
            'age'
        ],
        [
            1001,
            'tomson',
            10
        ],
        [
            1009,
            'lucifer',
            20
        ]
    ];

    $spreadSheet = new Spreadsheet();
    $sheet = $spreadSheet->getActiveSheet();

    $i = 1;
    foreach ($data as $excel) {
        $j = 1;
        if (is_array($excel)) {
            foreach ($excel as $e) {
                //强制内容为文本,避免出现科学计数法处理数字的问题
                $sheet->setCellValueExplicitByColumnAndRow($j, $i, $e, DataType::TYPE_STRING);
                $j++;
            }
        }
        $i++;
    }

    $writer = IOFactory::createWriter($spreadSheet, 'Xlsx');

    $writer->save($filepath);

}catch (Exception $e) {
    var_dump($e->getMessage());
}

看一下写入的excel文件
在这里插入图片描述

4.直接返回excel文件

在某些场景下的请求,可能希望直接返回excel文件,这其实也是一种写入,只是写入的目标文件不同。
大部分代码与第3部分类似,只有最后写入的部分略有变化。

	$writer = IOFactory::createWriter($spreadSheet, 'Xlsx');

    header("Content-Type: application/vnd.ms-excel");
    header("Content-Disposition: attachment;filename=downloadExcel.xlsx");
    header("Cache-Control: max-age=0");
    $writer->save('php://output');

发现区别了吗?
增加了一些header,然后把输出目标调整了。

写入也应该做个通用方法的,这里就不写了,留给读此文的朋友自己练手吧。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值