PHP CSV 导入导出类

本文介绍了一个 PHP 类,用于实现 CSV 文件的导入导出功能。该类支持设置表头、数据和文件名,并提供了完整的错误处理机制。同时,文章还包含了使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试文件demo.php

<?php
header("Content-type:text/html;charset=utf-8");
date_default_timezone_set("Asia/Shanghai");
include_once "./Csv.php";
$csv = new Csv();
$table_head = ["姓名", "性别", "住址", "电话"];
$data = [
    ["tony", "male", "address", "telphone"],
    ["ddd", "female", "dadasd", "dadasda"]
];
$csv->exportCsv($table_head, $data, "测试");




类文件Csv.php 

<?php
/**
 * PHP CSV 导入导出类
 * PHP Version 7.0
 */

class Csv
{
    /**
     * 导出CSV文件
     * @param array $table_head 表头
     * @param array $data 数据
     * @param string $filename 文件名
     * @return string
     */
    public function exportCsv($table_head, $data, $filename = "")
    {
        //设置超时
        set_time_limit(0);
        //设置内存占用
        ini_set('memory_limit', '512M');
        //为fputcsv()函数打开文件句柄
        $output = fopen('php://output', 'w') or die("can't open php://output");
        //设置文件名
        if ($filename != "") {
            $filename = $filename . "-" . date('YmdHis', time());
        } else {
            $filename = date('YmdHis', time());
        }
        //检查表头数据格式是否正确
        if (!is_array($table_head) || !is_array($data)) {
            exit("parameters error");
        }
        //告诉浏览器这个是一个csv文件
        header("Content-Type: application/csv");
        header("Content-Disposition: attachment; filename=$filename.csv");
        //输出表头
        foreach ($table_head as $k => $val) {
            // CSV的Excel支持GBK编码,一定要转换,否则乱码
            $table_head[$k] = iconv('utf-8', 'gbk', $table_head[$k]);
        }
        // 将数据通过fputcsv写到文件句柄
        fputcsv($output, $table_head);
        // 计数器
        $cnt = 0;
        // 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
        $limit = 100000;
        // 逐行取出数据,不浪费内存
        $count = count($data);
        // 逐行取出数据,不浪费内存
        for ($i = 0; $i < $count; $i++) {
            $cnt++;
            if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题
                ob_flush();
                flush();
                $cnt = 0;
            }
            $row = $data[$i];
            foreach ($row as $k => $v) {
                $row[$k] = iconv('utf-8', 'gbk', $v);
            }
            fputcsv($output, $row);
        }
        //关闭文件句柄
        fclose($output) or die("can't close php://output");
    }

    /**
     * 导入CSV文件
     * @param string $filepath 文件路径
     * @return array
     */
    public function importCsv($filepath)
    {
        //检查文件后缀名
        if (pathinfo($filepath)["extension"] != "csv") {
            exit("请导入csv文件");
        }
        if (!$fp = fopen($filepath, 'r')) {
            exit("打开文件失败");
        }
        $out = [];
        $n = 0;
        while ($data = fgetcsv($fp)) {
            $num = count($data);
            for ($i = 0; $i < $num; $i++) {
                $out[$n][$i] = iconv('gbk', 'utf-8', $data[$i]);    //中文转码
            }
            $n++;
        }
        fclose($fp) or exit("can't close the file $filepath");
        return $out;
    }

}

 

转载于:https://my.oschina.net/mynotes/blog/1841559

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值