介绍
在业务系统的开发过程中,生成Excel报表是常见需求,无论是实时导出还是后台任务生成。本文将介绍如何利用PhpSpreadsheet和PHP_XLSXWriter两个库来实现这一目标,帮助大家更加高效地生成Excel。
使用PHP_XLSXWriter
PHP_XLSXWriter。是一个用于 PHP 的库,用于生成 Microsoft Excel OpenXML 文件格式(XLSX)的工具。使用 PHP_XLSXWriter,您可以创建包含单元格、行和列等元素的 Excel 文件,使您能够以编程方式生成和编辑 Excel 文档。这个库通常用于将数据导出到 Excel 格式,以便进行报告、分析或其他目的。
github:https://github.com/mk-j/PHP_XLSXWriter
文档属性设置
通过使用如下函数,您可以设置生成的 Excel 文件的元数据(例如标题、主题、作者等),以及其他一些参数(例如临时目录、文本方向等)。这些设置可帮助您定制生成的 Excel 文件以满足特定需求或要求。
// 创建 XLSXWriter 实例
$writer = new XLSXWriter();
// 设置 Excel 文件的标题
$writer->setTitle('Sales Report');
// 设置 Excel 文件的主题
$writer->setSubject('Quarterly Sales');
// 设置 Excel 文件的作者
$writer->setAuthor('John Doe');
// 设置 Excel 文件的公司
$writer->setCompany('XYZ Corporation');
// 设置 Excel 文件的关键字
$writer->setKeywords('sales, report, quarterly');
// 设置 Excel 文件的描述
$writer->setDescription('This report contains quarterly sales data.');
// 设置临时目录(用于生成 Excel 文件时的临时文件存储)
$writer->setTempDir('/path/to/temp/dir');
// 设置文本方向是否为从右向左(例如,阿拉伯文或希伯来文)
$writer->setRightToLeft(true);
基础使用
以下是一个简单的示例代码,演示如何创建一个包含标题行和数据的 Excel 工作表
// 创建 XLSXWriter 实例
$writer = new XLSXWriter();
// 定义工作表的标题行
$header = array('名称', '年龄', '国家');
// 写入工作表的标题行
$writer->writeSheetHeader('Sheet1', $header);
// 模拟一些数据
$data = array(
array('John Doe', 30, 'USA'),
array('Jane Smith', 25, 'Canada'),
array('Michael Johnson', 35, 'UK')
);
// 逐行写入数据
foreach ($data as $row) {
$writer->writeSheetRow('Sheet1', $row);
}
// 将数据写入到文件
$filename = 'example.xlsx';
$writer->writeToFile($filename);
echo "Excel 文件已创建:$filename";
在此示例中,我们首先创建了一个 XLSXWriter 实例,然后定义了标题行和数据。接着,我们使用 writeSheetHeader()
方法写入标题行,然后使用 writeSheetRow()
方法逐行写入数据。最后,使用 writeToFile()
方法将数据写入到名为 “example.xlsx” 的 Excel 文件中。
工作表操作
创建工作表
使用 writeSheetHeader()
方法创建一个新的工作表,并定义其标题行。
$writer->writeSheetHeader('Sheet1', $header);
设置当前工作表
要设置当前工作表,您可以使用 writeSheetRow()
方法并指定要写入的工作表名称。
$writer->writeSheetRow('Sheet2', $data);
这将在名称为 “Sheet2” 的工作表中写入数据。您可以在每次调用 writeSheetRow()
时指定要写入的工作表名称,以设置当前工作表。
单元格操作
以下是一些常见的单元格属性以及在 PHP_XLSXWriter 中设置它们的方法
// 设置单元格值
$writer->writeSheetRow('Sheet1', array('value1', 'value2', 'value3'));
// 设置单元格格式
$writer->writeSheetRow('Sheet1', array('value1', 'value2', 'value3'), ['string_format'=>'@']);
// 设置单元格样式
$writer->writeSheetRow('Sheet1', array('value1', 'value2', 'value3'), array('font'=>'Arial', 'font-size'=>12, 'font-style'=>'bold', 'fill'=>'#FFFF00'));
// 设置单元格超链接
$writer->writeSheetRow('Sheet1', array('=HYPERLINK("http://www.example.com", "Link Text")'));
// 设置单元格公式
$writer->writeSheetRow('Sheet1', array('=SUM(A1:A3)', '=AVERAGE(B1:B3)', '=MAX(C1:C3)'));
// 设置单元格数据类型
$writer->writeSheetRow('Sheet1', array('string_value', 123, 45.67, true));
// 设置单元格注释
$cell = array('value', 'note'=>'This is a note');
$writer->writeSheetRow('Sheet1', $cell);
// 设置单元格合并
$writer->markMergedCell('Sheet1', 'A1:B2');
// 设置单元格行高
$writer->setRowHeight('Sheet1', $row, $height);
// 设置单元格列宽
$writer->setColumnWidth('Sheet1', $col, $width);
// 设置单元格水平对齐方式
$writer->writeSheetRow('Sheet1', array('value1', 'value2', 'value3'), array('align'=>'center'));
// 设置单元格垂直对齐方式
$writer->writeSheetRow('Sheet1', array('value1', 'value2', 'value3'), array('valign'=>'middle'));
// 设置单元格边框
$writer->writeSheetRow('Sheet1', array('value1', 'value2', 'value3'), array('border'=>'bottom'));
// 设置单元格旋转角度
$writer->writeSheetRow('Sheet1', array('value1', 'value2', 'value3'), array('angle'=>45));
行列操作
// 在指定行插入新行
$writer->insertNewSheetRow('Sheet1', 3); // 在第 3 行之后插入新行
// 删除指定行
$writer->deleteSheetRow('Sheet1', 3); // 删除第 3 行
// 在指定列插入新列
$writer->insertNewSheetColumn('Sheet1', 2); // 在第 2 列之后插入新列
// 删除指定列
$writer->deleteSheetColumn('Sheet1', 2); // 删除第 2 列
// 冻结顶部几行
$writer->freezeTopRows('Sheet1', 2); // 冻结前两行
// 冻结左侧几列
$writer->freezeLeftColumns('Sheet1', 2); // 冻结前两列
// 冻结顶部行和左侧列
$writer->freezePane('Sheet1', 'B3'); // 冻结 B3 单元格及其以上和左侧的单元格
// 获取工作表的行数
$row_count = $writer->countSheetRows('Sheet1');
输出
// 将 Excel 数据写入标准输出
$writer->writeToStdOut();
// 将 Excel 数据写入字符串
$excel_data = $writer->writeToString();
// 将 Excel 数据写入文件
$filename = 'example.xlsx';
$writer->writeToFile($filename);
转XML
// 构建应用程序属性(App XML)数据
$app_xml = $writer->buildAppXML();
// 构建核心属性(Core XML)数据
$core_xml = $writer->buildCoreXML();
// 构建关系(Relationships XML)数据
$rels_xml = $writer->buildRelationshipsXML();
// 构建工作簿(Workbook XML)数据
$workbook_xml = $writer->buildWorkbookXML();
// 构建工作簿关系(Workbook Relationships XML)数据
$workbook_rels_xml = $writer->buildWorkbookRelsXML();
// 构建内容类型(Content Types XML)数据
$content_types_xml = $writer->buildContentTypesXML();
使用PhpSpreadsheet
github:https://github.com/PHPOffice/PhpSpreadsheet
文档地址:https://phpspreadsheet.readthedocs.io/
PhpSpreadsheet是一个用于操作电子表格文件(如Excel)的PHP库。它提供了创建、读取和编辑Excel文件的功能,支持Excel文件的各种操作,包括设置单元格值、样式、格式、合并单元格、添加图表等。PhpSpreadsheet可以生成多种Excel格式,包括xlsx、xls、ods等。与PHPExcel相比,PhpSpreadsheet提供了更加现代化和稳健的解决方案,支持较新版本的Excel文件格式,并提供了更多的功能和性能优化。
Composer 安装
composer require phpoffice/phpspreadsheet
文档属性设置与基础使用
<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
// 创建一个新的Excel实例
$spreadsheet = new Spreadsheet();
// 设置属性
$spreadsheet->getProperties()
->setTitle('Excel 标题')
->setSubject('Excel 主题')
->setCreator('作者名')
->setCompany('公司名称')
->setKeywords('关键字1, 关键字2, 关键字3')
->setDescription('这是一个描述文本');
// 创建一个工作表并设置一些示例数据
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', '示例数据1');
$sheet->setCellValue('B1', '示例数据2');
$sheet->setCellValue('C1', '示例数据3');
// 保存Excel文件
$writer = new Xlsx($spreadsheet);
$writer->save('example.xlsx');
确保你已经安装了Composer,并在项目目录中执行composer require phpoffice/phpspreadsheet
以安装PhpSpreadsheet库。
示例中,我们首先引入了PhpSpreadsheet库,然后创建了一个新的Excel实例。接着,我们使用getProperties()
方法获取属性对象,并使用各种set
方法设置标题、主题、作者、公司、关键字和描述。然后,我们创建了一个工作表,并在其中填充了一些示例数据。最后,我们使用Xlsx
写入器将Excel文件保存到名为example.xlsx
的文件中。
工作表操作
// 创建一个新的Excel实例
$spreadsheet = new Spreadsheet();
// 添加新的工作表并设置名称
$worksheet1 = $spreadsheet->createSheet();
$worksheet1->setTitle('Sheet 1');
// 添加第二个工作表并设置名称
$worksheet2 = $spreadsheet->createSheet();
$worksheet2->setTitle('Sheet 2');
// 设置活跃工作表
$spreadsheet->setActiveSheetIndex(0); // 第一个工作表为活跃工作表
$spreadsheet->setActiveSheetIndexByName('name');
// 获取活跃工作表
$activeSheet = $spreadsheet->getActiveSheet();
// 移动工作表位置
$spreadsheet->setSheetIndex($activeSheet, 1); // 将活跃工作表移动到第二个位置
// 设置工作表属性
$activeSheet->getProperties()
->setTitle('工作表标题')
->setCreator('创建者')
->setLastModifiedBy('最后修改者')
->setDescription('工作表描述')
->setSubject('工作表主题')
->setKeywords('关键字1, 关键字2')
->setCategory('分类');
// 保存Excel文件
$writer = new Xlsx($spreadsheet);
$writer->save('example.xlsx');
行列操作
// 插入行
$spreadsheet->getActiveSheet()->insertNewRowBefore(2, 5);
// 删除行
$spreadsheet->getActiveSheet()->removeRow(2, 5);
// 插入列
$spreadsheet->getActiveSheet()->insertNewColumnBefore('B', 3, 5);
// 删除列
$spreadsheet->getActiveSheet()->removeColumn('B', 3, 5);
// 设置行高
$spreadsheet->getActiveSheet()->getRowDimension(1)->setRowHeight(20);
// 设置列宽
$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(15);
// 冻结窗格
$spreadsheet->getActiveSheet()->freezePane('B2');
单元格操作
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Font;
use PhpOffice\PhpSpreadsheet\Worksheet\Comment;
// 创建一个新的Excel实例
$spreadsheet = new Spreadsheet();
// 获取活跃工作表
$worksheet = $spreadsheet->getActiveSheet();
// 设置单元格值
$worksheet->setCellValue('A1', 'Value');
// 设置单元格样式
$worksheet->getStyle('A1')->applyFromArray([
'font' => [
'bold' => true,
'size' => 14,
'name' => 'Arial',
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
],
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => '000000'],
],
],
'fill' => [
'fillType' => Fill::FILL_GRADIENT_LINEAR,
'rotation' => 90,
'startColor' => ['argb' => 'FFA500'],
'endColor' => ['argb' => 'FFFFFF'],
],
]);
// 设置单元格格式
$worksheet->getStyle('A1')->getNumberFormat()->setFormatCode('0.00');
// 设置单元格颜色
$worksheet->getStyle('A1')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FF0000');
// 设置单元格字体大小
$worksheet->getStyle('A1')->getFont()->setSize(12);
// 设置单元格边框
$worksheet->getStyle('A1')->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THICK);
// 设置单元格备注
$comment = $worksheet->getComment('A1');
$comment->getText()->createTextRun('这是一个备注');
$comment->setWidth('100px');
$comment->setHeight('100px');
$comment->setMarginLeft('50px');
$comment->setMarginTop('50px');
$comment->setFillColor('FFFFE0');
$comment->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$comment->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);
由于设置单元格样式函数applyFromArray()的参数过多,这里单独列出来解读:
-
'font'
:设置字体属性。'bold' => true
:设置为粗体。'size' => 14
:设置字体大小为14。'name' => 'Arial'
:设置字体名称为Arial。
-
'alignment'
:设置对齐方式。'horizontal' => Alignment::HORIZONTAL_CENTER
:水平居中对齐。'vertical' => Alignment::VERTICAL_CENTER
:垂直居中对齐。
-
'borders'
:设置边框样式。-
'allBorders'
:设置所有边框。'borderStyle' => Border::BORDER_THIN'
:设置边框样式为细线。'color' => ['argb' => '000000']'
:设置边框颜色为黑色。
-
-
'fill'
:设置填充样式。'fillType' => Fill::FILL_GRADIENT_LINEAR'
:设置填充类型为线性渐变。'rotation' => 90'
:设置渐变角度为90度。'startColor' => ['argb' => 'FFA500']'
:设置渐变起始颜色为橙色。'endColor' => ['argb' => 'FFFFFF']'
:设置渐变结束颜色为白色。
输出
// 保存Excel文件
$writer = new Xlsx($spreadsheet);
$writer->save('example.xlsx');
总结
PhpSpreadsheet提供了创建、读取和编辑Excel文件的功能,支持多种Excel格式。它具有灵活的功能和强大的功能,支持合并单元格、添加图表等高级功能,并且提供了对较新版本的Excel文件格式的支持。此外,PhpSpreadsheet还支持内存数据库,使得处理大量数据更加高效。
相比之下,PHP_XLSXWriter专注于高性能的Excel导出。它的导出速度非常快,尤其适用于需要大量数据处理的情况。然而,PHP_XLSXWriter的功能相对较少,主要用于快速生成Excel文件而不涉及复杂的操作。
因此,选择使用PhpSpreadsheet还是PHP_XLSXWriter取决于项目的需求。如果需要丰富的功能和灵活性,并且对导出性能要求不是特别高的情况下,PhpSpreadsheet是一个不错的选择。而如果需要快速高效地导出大量数据,可以考虑使用PHP_XLSXWriter。