您的位置:时间博客>PHP>CI框架3 使用 phpspreadsheet 导出数据

CI框架3 使用 phpspreadsheet 导出数据

本文所用的CodeIgniter框架版本为3.1.4,由于官方没有集成Composer,所以这里要先集成;

在项目根目录执行:

composer require phpoffice/phpspreadsheet:1.14

拓展安装后在application/libraries目录内创建Composer.php文件

application/libraries/Composer.php 文件内容示例:

<?php
/**
 * CodeIgniter引入Composer
 *
 * @author barry
 */
class Composer
{
    function __construct()
    {
        include("./vendor/autoload.php");
    }
}


config/autoload.php中的libraries数组追加一项: Composer(刚才创建的文件名)

$autoload['libraries'] = array('Composer', 'database');

接下来就可以正常使用了


phpspreadsheet导出示例代码:

if (!function_exists('spreadsheet_export')) {
    /**
     * 数据导出
     * @param string $xlsx_name 表格标题
     * @param array $ExportFields ['字段'=>'字段标题']
     * @param array $ExportDatas 要导出的数量
     * @return bool
     */
    function spreadsheet_export($xlsx_name, $ExportFields, $ExportDatas)
    {
        ob_end_clean();
        empty($xlsx_name) && $xlsx_name = '数据导出';
        $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
        $worksheet = $spreadsheet->getActiveSheet();

        $worksheet->setTitle('列表数据'); //设置表标题名称
        $worksheet->setCellValueByColumnAndRow(1, 1, $xlsx_name); //表头标题

        //设置单元格表头内容
        foreach (array_values($ExportFields) as $key => $value) {
            $worksheet->getColumnDimensionByColumn($key + 1)->setWidth(20);
            $worksheet->setCellValueByColumnAndRow($key + 1, 2, $value);
        }

        // 创建 A~AZ 的数组
        $AssignArr = [];
        for ($i = 'A'; $i != 'BA'; $i++) {
            $AssignArr[] = $i;
        }

        $rows = 3;
        $fields = array_keys($ExportFields);
        $CellEnd = $AssignArr[count($fields) - 1] ?? 'AZ'; //获取单元格最后一项位置

        //合并单元格
        $worksheet->mergeCells("A1:{$CellEnd}1");

        foreach ($ExportDatas as $key => $value) {
            $worksheet->getColumnDimensionByColumn($rows)->setWidth(20);
            foreach ($fields as $fk => $field) {
                $worksheet->setCellValueByColumnAndRow($fk + 1, $rows, ($value[$field] ?? ''));
            }
            $rows++;
        }

        $styleArray = [
            'font' => [
                'bold' => true
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];

        //设置单元格样式
        $worksheet->getStyle('A1')->applyFromArray($styleArray)->getFont()->setSize(28);
        $worksheet->getStyle("A2:{$CellEnd}2")->applyFromArray($styleArray)->getFont()->setSize(12);
        //添加所有边框/居中
        $worksheet->getStyle("A1:{$CellEnd}{$rows}")->applyFromArray([
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['argb' => '666666'],
                ],
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ]);

        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="' . $xlsx_name . '.xlsx"');
        header('Cache-Control: max-age=0');

        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');

        $writer->save('php://output');
    }
}

使用示例:

// 表格列
$ExportFields = [
    'user_name' => '姓名',
    'user_phone' => '电话',
    'create_time' => '创建时间',
];

// 列表数据
$ExportDatas = [
    [
        'user_name' => '张三',
        'user_phone' => '12345678911',
        'create_time' => '2021-12-15 12:48:47',
    ],
    [
        'user_name' => '李四',
        'user_phone' => '12345678911',
        'create_time' => '2021-12-15 12:48:47',
    ]
];


spreadsheet_export('列表数据导出', $ExportFields, $ExportDatas);


关于 phpoffice/phpspreadsheet 导出的xlsx文件无法打开的解决办法:

在导出输出内容前需要清空缓冲区,否则会造成导出的文件无法打开或者打开后是乱码的情况;

d35a771cc7ad9208f6d463627b63379c.png






转载请注明本文标题和链接:《 CI框架3 使用 phpspreadsheet 导出数据
分享到:

相关推荐

网友评论 0

未登陆 表情
Ctrl+Enter快速提交