zoukankan      html  css  js  c++  java
  • PHP 读取/导出 CSV文件

    工作中经常会有遇到导入/导出的需求,下面是常用的方法。
    读取CSV文件,可以分页读取,设置读取行数,起始行数即可。
    导出CSV文件,用两种方法进行实现。

     1 /**
     2  * 读取CSV文件
     3  * @param string $csv_file csv文件路径
     4  * @param int $lines       读取行数
     5  * @param int $offset      起始行数
     6  * @return array|bool
     7  */
     8 public function read_csv_lines($csv_file = '', $lines = 0, $offset = 0)
     9 {
    10     if (!$fp = fopen($csv_file, 'r')) {
    11         return false;
    12     }
    13     $i = $j = 0;
    14     while (false !== ($line = fgets($fp))) {
    15         if ($i++ < $offset) {
    16             continue;
    17         }
    18         break;
    19     }
    20     $data = array();
    21     while (($j++ < $lines) && !feof($fp)) {
    22         $data[] = fgetcsv($fp);
    23     }
    24     fclose($fp);
    25     return $data;
    26 }
    27 /**
    28  * 导出CSV文件
    29  * @param array $data        数据
    30  * @param array $header_data 首行数据
    31  * @param string $file_name  文件名称
    32  * @return string
    33  */
    34 public function export_csv_1($data = [], $header_data = [], $file_name = '')
    35 {
    36     header('Content-Type: application/octet-stream');
    37     header('Content-Disposition: attachment; filename=' . $file_name);
    38     if (!empty($header_data)) {
    39         echo iconv('utf-8','gbk//TRANSLIT','"'.implode('","',$header_data).'"'."
    ");
    40     }
    41     foreach ($data as $key => $value) {
    42         $output = array();
    43         $output[] = $value['id'];
    44         $output[] = $value['name'];
    45         echo iconv('utf-8','gbk//TRANSLIT','"'.implode('","', $output).""
    ");
    46     }
    47 }
    48 /**
    49  * 导出CSV文件
    50  * @param array $data        数据
    51  * @param array $header_data 首行数据
    52  * @param string $file_name  文件名称
    53  * @return string
    54  */
    55 public function export_csv_2($data = [], $header_data = [], $file_name = '')
    56 {
    57     header('Content-Type: application/vnd.ms-excel');
    58     header('Content-Disposition: attachment;filename='.$file_name);
    59     header('Cache-Control: max-age=0');
    60     $fp = fopen('php://output', 'a');
    61     if (!empty($header_data)) {
    62         foreach ($header_data as $key => $value) {
    63             $header_data[$key] = iconv('utf-8', 'gbk', $value);
    64         }
    65         fputcsv($fp, $header_data);
    66     }
    67     $num = 0;
    68     //每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
    69     $limit = 100000;
    70     //逐行取出数据,不浪费内存
    71     $count = count($data);
    72     if ($count > 0) {
    73         for ($i = 0; $i < $count; $i++) {
    74             $num++;
    75             //刷新一下输出buffer,防止由于数据过多造成问题
    76             if ($limit == $num) {
    77                 ob_flush();
    78                 flush();
    79                 $num = 0;
    80             }
    81             $row = $data[$i];
    82             foreach ($row as $key => $value) {
    83                 $row[$key] = iconv('utf-8', 'gbk', $value);
    84             }
    85             fputcsv($fp, $row);
    86         }
    87     }
    88     fclose($fp);
    89 }
  • 相关阅读:
    LPC1768基本输入输出GPIO使用
    LPC1768IAP(详解,有上位机)
    STM32_IAP详解(有代码,有上位机)
    ucos2.86的任务调度漏洞
    ucos任务优先级从64到256,任务就绪表的改变
    ucos互斥信号量解决优先级反转问题
    ucos信号量集源码分析
    ucos内存管理原理详解
    ucos队列的实现--源码分析
    ucos调度器详解
  • 原文地址:https://www.cnblogs.com/CHEUNGKAMING/p/5706399.html
Copyright © 2011-2022 走看看