php中怎么导出excel

发布时间:2021-06-29 16:44:59 作者:Leah
来源:亿速云 阅读:137
# PHP中怎么导出Excel

在Web开发中,经常需要将数据导出为Excel格式以便用户下载和分析。PHP提供了多种方式实现这一功能,本文将详细介绍5种主流方法,并附上完整代码示例。

## 一、使用原生PHP输出CSV格式

CSV(Comma-Separated Values)是一种简单的表格数据格式,可以被Excel直接打开。

### 基本实现方法

```php
<?php
// 设置HTTP头信息
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');

// 打开输出流
$output = fopen('php://output', 'w');

// 写入CSV头
fputcsv($output, ['ID', '姓名', '年龄', '邮箱']);

// 模拟数据
$data = [
    [1, '张三', 25, 'zhangsan@example.com'],
    [2, '李四', 30, 'lisi@example.com'],
    [3, '王五', 28, 'wangwu@example.com']
];

// 写入数据行
foreach ($data as $row) {
    fputcsv($output, $row);
}

fclose($output);

优缺点分析

优点: - 实现简单,无需额外库 - 生成文件小,效率高 - 兼容性好

缺点: - 不能设置复杂格式 - 不支持多工作表 - 中文字符可能需要转码

二、使用PHPExcel/PHPSpreadsheet库

PHPExcel(已停止维护)的继任者PHPSpreadsheet是目前最强大的PHP Excel操作库。

安装方法

composer require phpoffice/phpspreadsheet

基础导出示例

<?php
require 'vendor/autoload.php';

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

// 创建Spreadsheet对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

// 设置表头
$sheet->setCellValue('A1', 'ID')
      ->setCellValue('B1', '姓名')
      ->setCellValue('C1', '分数');

// 填充数据
$data = [
    [1, '张三', 85],
    [2, '李四', 92],
    [3, '王五', 78]
];

$row = 2;
foreach ($data as $item) {
    $sheet->setCellValue('A'.$row, $item[0])
          ->setCellValue('B'.$row, $item[1])
          ->setCellValue('C'.$row, $item[2]);
    $row++;
}

// 设置自动列宽
foreach(range('A','C') as $col) {
    $sheet->getColumnDimension($col)->setAutoSize(true);
}

// 输出Excel文件
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="students.xlsx"');
header('Cache-Control: max-age=0');

$writer = new Xlsx($spreadsheet);
$writer->save('php://output');

高级功能示例

// 设置单元格样式
$styleArray = [
    'font' => [
        'bold' => true,
        'color' => ['rgb' => 'FF0000']
    ],
    'alignment' => [
        'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
    ],
    'borders' => [
        'bottom' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
            'color' => ['rgb' => '000000']
        ]
    ]
];
$sheet->getStyle('A1:C1')->applyFromArray($styleArray);

// 添加公式
$sheet->setCellValue('D1', '平均分');
$sheet->setCellValue('D2', '=AVERAGE(C2:C4)');

// 创建多个工作表
$spreadsheet->createSheet();
$spreadsheet->setActiveSheetIndex(1);
$sheet2 = $spreadsheet->getActiveSheet();
$sheet2->setTitle('第二页');
$sheet2->setCellValue('A1', '这是第二个工作表');

三、使用第三方轻量级库

1. SimpleExcel

require_once 'SimpleExcel/SimpleExcel.php';

$excel = new SimpleExcel('csv');
$excel->writer->setData([
    ['ID', 'Name', 'Email'],
    [1, 'John Doe', 'john@example.com'],
    [2, 'Jane Smith', 'jane@example.com']
]);
$excel->writer->saveFile('example');

2. Box/Spout

高性能Excel读写库,特别适合处理大数据量。

use Box\Spout\Writer\Common\Creator\WriterEntityFactory;

$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToBrowser('export.xlsx');

// 添加标题行
$titleRow = WriterEntityFactory::createRowFromArray(['ID', 'Name', 'Age']);
$writer->addRow($titleRow);

// 添加数据行
for ($i = 1; $i <= 10000; $i++) {
    $row = WriterEntityFactory::createRowFromArray([$i, "User $i", rand(20,60)]);
    $writer->addRow($row);
}

$writer->close();

四、直接生成HTML表格

Excel可以识别HTML表格格式,利用这一特性可以快速生成简单Excel文件。

<?php
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=report.xls");

echo '<table border="1">
<tr>
    <th>月份</th>
    <th>销售额</th>
    <th>增长率</th>
</tr>
<tr>
    <td>1月</td>
    <td>10000</td>
    <td>10%</td>
</tr>
<tr>
    <td>2月</td>
    <td>12000</td>
    <td>20%</td>
</tr>
</table>';

五、使用数据库工具直接导出

许多PHP数据库抽象层(如Doctrine DBAL)内置了导出功能:

$conn = Doctrine\DBAL\DriverManager::getConnection($params);
$query = $conn->createQueryBuilder()
    ->select('id', 'username', 'email')
    ->from('users');

$statement = $query->execute();
$results = $statement->fetchAll();

// 使用PHPSpreadsheet导出查询结果
$spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->fromArray($results, null, 'A1');

最佳实践建议

  1. 大数据量处理

    • 使用Box/Spout库,内存占用低
    • 分批查询和写入数据
    • 考虑生成CSV而非XLSX
  2. 性能优化: “`php // 禁用预处理语句提高速度 $writer->setShouldUseInlineStrings(true);

// 关闭自动计算 $spreadsheet->getActiveSheet()->getParent()->getCalculationEngine()->disableCalculationCache();


3. **安全注意事项**:
   - 验证用户导出权限
   - 过滤敏感数据
   - 限制导出频率防止滥用

4. **前端集成技巧**:
   ```javascript
   // AJAX导出示例
   fetch('/export.php', {
     method: 'POST',
     body: JSON.stringify({filters: {...}})
   })
   .then(res => res.blob())
   .then(blob => {
     const url = URL.createObjectURL(blob);
     const a = document.createElement('a');
     a.href = url;
     a.download = 'data.xlsx';
     a.click();
   });

常见问题解决

  1. 中文乱码问题: “`php // CSV文件添加BOM头 echo “\xEF\xBB\xBF”;

// 或者设置编码 \(value = mb_convert_encoding(\)value, ‘GBK’, ‘UTF-8’);


2. **内存不足错误**:
   ```ini
   ; 调整php.ini
   memory_limit = 512M
  1. 超时问题

    set_time_limit(0); // 取消脚本执行时间限制
    
  2. 格式不兼容

    • 使用XLSX而非XLS格式
    • 避免使用新版Excel特有功能

总结

PHP导出Excel主要有以下几种方案:

方法 适用场景 复杂度 性能
CSV导出 简单数据快速导出 ★☆☆ ★★★
PHPSpreadsheet 复杂格式需求 ★★★ ★★☆
Box/Spout 大数据量导出 ★★☆ ★★★
HTML表格 快速简单报表 ★☆☆ ★★★
数据库工具 与ORM深度集成 ★★☆ ★★☆

对于大多数项目,PHPSpreadsheet提供了最佳的功能平衡,而Box/Spout则是处理大数据量的理想选择。开发者应根据具体需求选择最合适的解决方案。 “`

推荐阅读:
  1. php如何导出excel
  2. PHP如何导出Excel的优化详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:PHP中怎么获取类和对象的属性字段

下一篇:php中怎么使用xhprof 性能分析工具

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》