使用PHP生成Excel

介绍

在业务系统的开发过程中,生成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。

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BIMCC筑云

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

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

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

打赏作者

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

抵扣说明:

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

余额充值