PHPOffice/PhpSpreadsheet 实用技巧指南

PHPOffice/PhpSpreadsheet 实用技巧指南

PhpSpreadsheet A pure PHP library for reading and writing spreadsheet files PhpSpreadsheet 项目地址: https://gitcode.com/gh_mirrors/ph/PhpSpreadsheet

前言

PHPOffice/PhpSpreadsheet 是一个强大的 PHP 库,用于处理电子表格文件。本文将介绍几个实用的技巧和配方,帮助开发者快速上手并解决常见问题。

设置电子表格元数据

电子表格元数据(如创建者、标题、关键词等)对于文档管理非常重要。在 PhpSpreadsheet 中,我们可以轻松设置这些属性:

$spreadsheet->getProperties()
    ->setCreator("张三")
    ->setLastModifiedBy("李四")
    ->setTitle("销售报告")
    ->setSubject("2023年第一季度销售数据")
    ->setDescription("使用PHP生成的销售报告")
    ->setKeywords("销售 季度报告 PHP")
    ->setCategory("财务报告");

元数据类型说明

PhpSpreadsheet 支持多种预定义属性:

| 属性名 | 数据类型 | 说明 | |---------------|----------|--------------------------| | Creator | 字符串 | 文档创建者 | | LastModifiedBy| 字符串 | 最后修改者 | | Title | 字符串 | 文档标题 | | Description | 字符串 | 文档描述 | | Keywords | 字符串 | 关键词 | | Category | 字符串 | 文档分类(xls格式不支持)|

自定义属性

除了预定义属性,还可以添加自定义属性:

$spreadsheet->getProperties()
    ->setCustomProperty('项目编号', 'PRJ-2023-001')
    ->setCustomProperty('版本号', 1.2)
    ->setCustomProperty('审核状态', true)
    ->setCustomProperty('发布日期', '2023-04-15', Properties::PROPERTY_TYPE_DATE);

支持的数据类型包括:布尔值、整数、浮点数、日期和字符串。

管理工作表

设置活动工作表

在包含多个工作表的电子表格中,可以指定哪个工作表是活动的:

// 通过索引设置(从0开始)
$activeWorksheet = $spreadsheet->setActiveSheetIndex(0);

// 或通过名称设置
$activeWorksheet = $spreadsheet->setActiveSheetIndexByName('Sheet1');

跨工作表操作

与Excel不同,PhpSpreadsheet允许直接操作非活动工作表:

$sheet1 = $spreadsheet->getSheetByName('Sheet1');
$sheet2 = $spreadsheet->getSheetByName('Sheet2');

$sheet1->setCellValue('A1', 'Sheet1的数据');
$sheet2->setCellValue('A1', 'Sheet2的数据');

处理日期和时间

Excel内部将日期存储为自1900年1月1日以来的天数。在PhpSpreadsheet中处理日期有几种方式:

方法一:使用高级值绑定器

$spreadsheet->setValueBinder(new AdvancedValueBinder());
$spreadsheet->getActiveSheet()->setCellValue('D1', '2023-12-31');

方法二:使用PHP时间戳

$time = gmmktime(0,0,0,12,31,2023); // 生成Unix时间戳
$excelDate = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($time);
$spreadsheet->getActiveSheet()->setCellValue('D1', $excelDate);

设置日期格式

$style = $spreadsheet->getActiveSheet()->getStyle('D1');
$style->getNumberFormat()
    ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD);

使用格式向导

PhpSpreadsheet提供了方便的向导来创建日期时间格式:

use PhpOffice\PhpSpreadsheet\Style\NumberFormat\Wizard\DateTime as DateTimeWizard;

// 创建日期部分格式:yyyy-mm-dd
$dateFormat = new DateWizard(
    DateWizard::SEPARATOR_DASH,
    DateWizard::YEAR_FULL,
    DateWizard::MONTH_NUMBER_LONG,
    DateWizard::DAY_NUMBER_LONG
);

// 创建时间部分格式:hh:mm:ss
$timeFormat = new TimeWizard(
    TimeWizard::SEPARATOR_COLON,
    TimeWizard::HOURS_LONG,
    TimeWizard::MINUTES_LONG,
    TimeWizard::SECONDS_LONG
);

// 组合日期时间格式
$dateTimeFormat = new DateTimeWizard(' ', $dateFormat, $timeFormat);

$spreadsheet->getActiveSheet()->getStyle('A1')
    ->getNumberFormat()
    ->setFormatCode($dateTimeFormat);

处理公式

基本公式

在PhpSpreadsheet中写入公式时,需要使用英语函数名和语法:

$spreadsheet->getActiveSheet()
    ->setCellValue('B8', '=IF(C4>500,"盈利","亏损")');

防止公式被解析

如果需要写入以等号开头的文本而非公式,使用setCellValueExplicit

$spreadsheet->getActiveSheet()
    ->setCellValueExplicit(
        'B8',
        '=这不是公式',
        \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING
    );

获取公式结果

// 获取公式本身
$formula = $spreadsheet->getActiveSheet()->getCell('B8')->getValue();

// 获取公式计算结果
$value = $spreadsheet->getActiveSheet()->getCell('B8')->getCalculatedValue();

数组公式

PhpSpreadsheet 3.0.0及以上版本支持Excel数组公式:

$spreadsheet->getActiveSheet()
    ->fromArray(
        ['=SUM(A1:A3*B1:B3)'],
        null,
        'C1',
        true
    );

结语

本文介绍了PhpSpreadsheet的几个实用技巧,包括元数据设置、工作表管理、日期时间处理和公式操作。掌握这些基础操作后,开发者可以更高效地使用PhpSpreadsheet进行电子表格处理。对于更高级的功能,建议参考官方文档进一步学习。

PhpSpreadsheet A pure PHP library for reading and writing spreadsheet files PhpSpreadsheet 项目地址: https://gitcode.com/gh_mirrors/ph/PhpSpreadsheet

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卫伊祺Ralph

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值