现在工作之后就没怎么登过博客了,最近在着力于开发一款混凝土试件数字化管理系统,而提到混凝土当然离不开台账(我们的台账都是excel表格文件),开发语言为PHP,所以在开发时自然离不开使用使用PHP进行Excel文件的读写,尝试了很多方法函数之后我觉得PHPExcel-1.8更适合我的开发使用,这里记录一下PHPExcel库的教程吧!

PHPExcel 库(其继任者为 PhpSpreadsheet)为 PHP 操作 Excel 文件提供了强大功能。

安装与准备

首先,需要通过 Composer 将 PhpSpreadsheet 引入项目中:

composer require phpoffice/phpspreadsheet

然后在PHP脚本开头引入自动加载文件:

require 'vendor/autoload.php';

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

写入Excel文件

创建并写入一个 Excel 文件通常包含以下几个步骤:

// 1. 创建 Spreadsheet 对象
$spreadsheet = new Spreadsheet();

// 2. 获取当前活动的工作表(默认第一个)
$sheet = $spreadsheet->getActiveSheet();

// 3. 向单元格写入数据
$sheet->setCellValue('A1', 'Hello');
$sheet->setCellValue('B1', 'World!');
$sheet->setCellValue('A2', 123.456);
$sheet->setCellValue('B2', '=A2*2'); // 甚至可以写入公式

// 4. 通过数组批量写入数据
$dataArray = [
    ['姓名', '年龄', '城市'],
    ['张三', 25, '北京'],
    ['李四', 30, '上海']
];
$sheet->fromArray($dataArray, NULL, 'A4'); // 从 A4 单元格开始填充

// 5. 保存文件
$writer = new Xlsx($spreadsheet);
$writer->save('hello_world.xlsx');

echo "Excel 文件已成功创建!";

读取Excel文件

读取一个已存在的 Excel 文件,并提取其中的信息:

// 1. 指定文件路径
$inputFileName = 'hello_world.xlsx';

// 2. 使用 IOFactory 来加载文件
$spreadsheet = IOFactory::load($inputFileName);

// 3. 获取活动工作表
$sheet = $spreadsheet->getActiveSheet();

// 4. 读取单个单元格的值
$cellA1 = $sheet->getCell('A1')->getValue();
echo "A1 单元格的值是: " . $cellA1 . "\n";

// 5. 获取工作表的基本信息
$highestRow = $sheet->getHighestRow(); // 最后有数据的行号
$highestColumn = $sheet->getHighestColumn(); // 最后有数据的列标

// 6. 循环遍历所有包含数据的行和列
echo "工作表数据内容:\n";
for ($row = 1; $row <= $highestRow; $row++) {
    for ($col = 'A'; $col <= $highestColumn; $col++) {
        $cellValue = $sheet->getCell($col . $row)->getValue();
        echo $cellValue . "\t";
    }
    echo "\n";
}

处理大文件与更多技巧

  1. 处理大Excel文件:
    使用 setReadDataOnly(true) 可以只读取数据而不加载格式信息,显著降低内存消耗。对于非常大的文件,还可以使用分块读取的技巧。

    $reader = IOFactory::createReaderForFile($inputFileName);
    $reader->setReadDataOnly(true);
    $spreadsheet = $reader->load($inputFileName);
  2. 设置单元格格式:
    你不仅可以读写数据,还可以设置丰富的格式。

    use PhpOffice\PhpSpreadsheet\Style\Alignment;
    use PhpOffice\PhpSpreadsheet\Style\Font;
    
    // 设置字体和加粗
    $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(12);
    
    // 设置单元格居中对齐
    $sheet->getStyle('A1:B1')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);