0

0

使用 PHPSpreadsheet 修改和保存现有 Excel 文件的完整指南

DDD

DDD

发布时间:2025-08-29 14:29:14

|

843人浏览过

|

来源于php中文网

原创

使用 PHPSpreadsheet 修改和保存现有 Excel 文件的完整指南

本文详细介绍了如何使用 PHPSpreadsheet 库加载、修改并保存现有 Excel 文件。我们将探讨正确的加载和写入流程,包括如何获取工作表、设置单元格值以及在现有数据后追加新行,并强调使用 IOFactory::createWriter 方法来避免常见错误,确保文件操作的稳定性和正确性。

PHPSpreadsheet 文件操作核心流程

使用 phpspreadsheet 对现有 excel 文件进行操作,通常遵循以下三个核心步骤:

  1. 加载现有文件: 将目标 Excel 文件读取到 PHPSpreadsheet 的 Spreadsheet 对象中。
  2. 修改数据: 通过 Spreadsheet 对象访问特定的工作表和单元格,进行数据的添加、修改或删除。
  3. 保存更改: 将修改后的 Spreadsheet 对象重新写入文件系统,覆盖或创建新的 Excel 文件。

正确加载现有 Excel 文件

要修改一个现有的 Excel 文件,首先需要将其加载到内存中。PHPSpreadsheet 提供了 IOFactory 类来简化这一过程,它能根据文件扩展名自动识别合适的读取器。

load($filePath);
} catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) {
    die('加载 Excel 文件时发生错误: ' . $e->getMessage());
}

// 至此,$spreadsheet 对象已包含 Excel 文件的所有数据
echo "文件 '{$filePath}' 已成功加载。\n";
?>

说明:

  • IOFactory::createReader("Xlsx") 显式地创建了一个 XLSX 格式的读取器。这比直接使用 IOFactory::load($filePath) 更具控制性,尤其是在需要为读取器设置特定选项时。
  • $reader->load($filePath) 将文件内容解析并存储在一个 PhpOffice\PhpSpreadsheet\Spreadsheet 类的实例中。

在工作表中进行数据修改

加载文件后,你可以通过 Spreadsheet 对象访问其包含的工作表,并对单元格数据进行操作。

获取活动工作表

通常,我们会对文件的活动工作表进行操作,或者通过索引/名称获取特定工作表。

立即学习PHP免费学习笔记(深入)”;

// 获取当前活动的工作表
$sheet = $spreadsheet->getActiveSheet();

// 或者通过索引获取工作表 (0 代表第一个工作表)
// $sheet = $spreadsheet->getSheet(0);

// 或者通过名称获取工作表
// $sheet = $spreadsheet->getSheetByName('Sheet1');

设置单元格值

使用 $sheet->setCellValue() 方法可以修改或设置指定单元格的值。

// 修改 A1 单元格的值
$sheet->setCellValue('A1', '新的表头');

示例:在现有数据后追加新行

一个常见的需求是在现有数据的末尾追加新行。这可以通过获取当前工作表的最高行数,然后在其基础上加一来确定新行的位置。

Bandy AI
Bandy AI

全球领先的电商设计Agent

下载
// 获取当前工作表的最高行数
$last_row = (int) $sheet->getHighestRow();

// 计算新行的行号
$new_row = $last_row + 1;

// 在新行中设置数据
$sheet->setCellValue('A' . $new_row, "14");
$sheet->setCellValue('B' . $new_row, "Alina");
$sheet->setCellValue('C' . $new_row, "PG");
$sheet->setCellValue('D' . $new_row, "$32");
$sheet->setCellValue('E' . $new_row, "Pending");

echo "已在第 {$new_row} 行追加新数据。\n";

保存修改后的 Excel 文件

完成数据修改后,需要将 Spreadsheet 对象的内容保存回文件系统。

关键:使用 IOFactory::createWriter()

这是解决文章开头提到的 TypeError 的关键所在。PHPSpreadsheet 推荐使用 IOFactory::createWriter() 方法来创建写入器对象,而不是直接实例化 PhpOffice\PhpSpreadsheet\Writer\Xlsx 等类。

为什么 IOFactory::createWriter() 更优?

  • 抽象性: IOFactory 负责根据指定的文件类型(如 "Xlsx")返回正确的写入器实例,你无需关心具体的写入器类名和其命名空间。
  • 鲁棒性: 它能确保传入的 Spreadsheet 对象是有效的,并处理一些内部初始化逻辑。直接实例化 new Xlsx($spreadsheet) 可能因为命名空间问题、或在 $spreadsheet 对象为 null(例如加载失败时)的情况下导致 TypeError。
// 1. 创建一个写入器实例
// IOFactory::createWriter() 方法接受 Spreadsheet 对象和文件类型作为参数
$writer = IOFactory::createWriter($spreadsheet, "Xlsx");

// 2. 保存文件
// 如果指定的文件名与加载时相同,则会覆盖原文件。
try {
    $writer->save($filePath);
    echo "文件 '{$filePath}' 已成功保存。\n";
} catch (\PhpOffice\PhpSpreadsheet\Writer\Exception $e) {
    die('保存 Excel 文件时发生错误: ' . $e->getMessage());
}

完整示例代码

以下是一个完整的 PHP 脚本,演示了如何加载现有 yourspreadsheet.xlsx 文件,在其末尾追加一行数据,然后保存回原文件。

load($filePath);
    echo "文件 '{$filePath}' 已成功加载。\n";
} catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) {
    die('加载 Excel 文件时发生错误: ' . $e->getMessage());
}

// ------------------- 步骤 2: 修改工作表数据 -------------------
$sheet = $spreadsheet->getActiveSheet();

// 获取当前工作表的最高行数
$last_row = (int) $sheet->getHighestRow();

// 计算新行的行号
$new_row = $last_row + 1;

// 在新行中设置数据
$sheet->setCellValue('A' . $new_row, "14");
$sheet->setCellValue('B' . $new_row, "Alina");
$sheet->setCellValue('C' . $new_row, "PG");
$sheet->setCellValue('D' . $new_row, "$32");
$sheet->setCellValue('E' . $new_row, "Pending");

echo "已在第 {$new_row} 行追加新数据。\n";

// ------------------- 步骤 3: 保存修改后的 Excel 文件 -------------------
$writer = IOFactory::createWriter($spreadsheet, "Xlsx");
try {
    $writer->save($filePath);
    echo "文件 '{$filePath}' 已成功保存。\n";
} catch (\PhpOffice\PhpSpreadsheet\Writer\Exception $e) {
    die('保存 Excel 文件时发生错误: ' . $e->getMessage());
}

?>

注意事项与最佳实践

  • 错误处理: 在加载和保存文件时,务必使用 try-catch 块来捕获可能发生的 PhpOffice\PhpSpreadsheet\Reader\Exception 和 PhpOffice\PhpSpreadsheet\Writer\Exception。这有助于识别文件不存在、权限不足或文件损坏等问题。
  • 文件路径与权限: 确保 PHP 脚本对目标 Excel 文件及其所在目录具有读写权限。文件路径应准确无误。
  • 内存管理: 对于非常大的 Excel 文件(例如包含数万行或数十万行数据),直接加载到内存中可能会消耗大量内存。PHPSpreadsheet 提供了一些优化选项,如 setReadDataOnly(true) 来减少读取时的内存占用,或者考虑使用分批处理(chunk reading)和写入。
  • 命名空间导入: 在脚本顶部使用 use 语句导入所需的类,例如 use PhpOffice\PhpSpreadsheet\IOFactory;,可以使代码更简洁易读。
  • 备份: 在对重要文件进行修改之前,建议先创建一个备份,以防意外数据丢失

总结

通过 PHPSpreadsheet 修改和保存现有 Excel 文件是一个常见且重要的操作。核心在于理解 IOFactory 在加载和写入过程中的作用。通过 IOFactory::createReader() 加载文件到 Spreadsheet 对象,然后对工作表进行操作,最后使用 IOFactory::createWriter() 将修改后的 Spreadsheet 对象保存回文件。遵循这些步骤并结合适当的错误处理,可以确保文件操作的稳定性和正确性,有效避免如 TypeError 等常见问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

236

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

1401

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

409

2023.07.31

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

562

2023.08.02

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

1243

2023.08.02

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

368

2023.08.02

绝对引用的输入方法
绝对引用的输入方法

绝对引用允许在公式中引用一个固定的单元格,而不会随着公式的复制和粘贴而改变引用的单元格。本专题为大家提供绝对引用相关内容的文章,大家可以免费体验。

4526

2023.08.09

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号