ThinkPHP Excel导入导出:PhpSpreadsheet应用

ThinkPHP Excel导入导出:PhpSpreadsheet应用讲座

大家好!欢迎来到今天的“Excel与ThinkPHP的奇妙约会”技术讲座。今天,我们将一起探讨如何在ThinkPHP中使用PhpSpreadsheet进行Excel文件的导入和导出。如果你对Excel操作感到头疼,或者觉得手动处理Excel文件太麻烦,那么这次讲座一定会让你大开眼界!


一、PhpSpreadsheet是什么?

首先,让我们简单介绍一下PhpSpreadsheet。它是PHPExcel的继任者,由PHPOffice团队开发,专注于处理Excel文件(.xlsx、.xls等格式)。它不仅支持读取和写入Excel文件,还提供了丰富的功能来操作单元格、样式、图表等。

国外的技术文档是这样描述它的:“PhpSpreadsheet is a library for reading from and writing to different spreadsheet formats, such as XLSX, CSV, PDF etc.” 换句话说,它是一个强大的工具库,可以轻松搞定各种Excel格式。


二、为什么选择PhpSpreadsheet?

  1. 功能强大:支持多种文件格式,包括.xlsx、.xls、.csv等。
  2. 性能优越:相比PHPExcel,PhpSpreadsheet在内存管理和速度上都有显著提升。
  3. 社区活跃:PhpSpreadsheet有庞大的用户群体和丰富的文档支持。

如果你还在用PHPExcel,请尽快升级到PhpSpreadsheet吧!毕竟,老版本已经停止维护了。


三、环境准备

在开始之前,我们需要确保以下条件:

  1. ThinkPHP版本:建议使用ThinkPHP 6.x或更高版本。
  2. Composer安装:通过Composer安装PhpSpreadsheet。

运行以下命令安装PhpSpreadsheet:

composer require phpoffice/phpspreadsheet

四、实战演练:Excel导出

接下来,我们来看一个简单的例子——如何使用PhpSpreadsheet导出Excel文件。

示例代码
namespace appcontroller;

use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;

class ExcelController
{
    public function export()
    {
        // 创建一个新的Spreadsheet对象
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();

        // 设置表头
        $sheet->setCellValue('A1', 'ID');
        $sheet->setCellValue('B1', '姓名');
        $sheet->setCellValue('C1', '年龄');

        // 填充数据
        $data = [
            ['1', '张三', '25'],
            ['2', '李四', '30'],
            ['3', '王五', '28']
        ];

        $row = 2; // 从第二行开始填充数据
        foreach ($data as $item) {
            $sheet->setCellValue('A' . $row, $item[0]);
            $sheet->setCellValue('B' . $row, $item[1]);
            $sheet->setCellValue('C' . $row, $item[2]);
            $row++;
        }

        // 导出Excel文件
        $writer = new Xlsx($spreadsheet);
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="example.xlsx"');
        header('Cache-Control: max-age=0');
        $writer->save('php://output');
    }
}
结果

运行以上代码后,浏览器会自动下载一个名为example.xlsx的文件,内容如下:

ID 姓名 年龄
1 张三 25
2 李四 30
3 王五 28

五、实战演练:Excel导入

接下来,我们看看如何将Excel文件中的数据导入到数据库中。

示例代码
namespace appcontroller;

use PhpOfficePhpSpreadsheetIOFactory;

class ExcelController
{
    public function import()
    {
        if (empty($_FILES['file']['tmp_name'])) {
            return json(['code' => 400, 'msg' => '请上传文件']);
        }

        $inputFileName = $_FILES['file']['tmp_name'];

        try {
            // 加载Excel文件
            $spreadsheet = IOFactory::load($inputFileName);
            $sheet = $spreadsheet->getActiveSheet();

            // 获取所有数据
            $data = $sheet->toArray(null, true, true, true);

            // 跳过表头
            array_shift($data);

            // 插入数据库
            foreach ($data as $row) {
                db('users')->insert([
                    'id' => $row['A'],
                    'name' => $row['B'],
                    'age' => $row['C']
                ]);
            }

            return json(['code' => 200, 'msg' => '导入成功']);
        } catch (Exception $e) {
            return json(['code' => 500, 'msg' => '导入失败:' . $e->getMessage()]);
        }
    }
}
注意事项
  1. 确保上传的文件符合预期格式(例如列名与数据库字段一致)。
  2. 使用IOFactory::load()加载文件时,PhpSpreadsheet会根据文件扩展名自动选择合适的解析器。

六、常见问题解答

  1. Q:如何处理大数据量的Excel文件?
    A:PhpSpreadsheet提供了Cell Caching机制,可以通过配置减少内存占用。例如:

    PhpOfficePhpSpreadsheetSettings::setCache('memory_gzip');
  2. Q:如何生成带样式的Excel文件?
    A:可以使用getStyle()方法设置单元格样式。例如:

    $sheet->getStyle('A1:C1')->applyFromArray([
       'font' => ['bold' => true],
       'alignment' => ['horizontal' => PhpOfficePhpSpreadsheetStyleAlignment::HORIZONTAL_CENTER]
    ]);
  3. Q:如何避免中文乱码问题?
    A:确保文件编码为UTF-8,并在导出时设置正确的响应头。


七、总结

今天,我们学习了如何在ThinkPHP中使用PhpSpreadsheet进行Excel文件的导入和导出。通过这些技巧,你可以轻松实现复杂的数据操作,让Excel文件处理变得不再繁琐。

最后,记住一句话:“Excel不是敌人,而是朋友。有了PhpSpreadsheet,我们可以愉快地玩耍!” 😄

如果有任何疑问,欢迎在评论区留言,我们下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注