PHP 读取/导出 CSV文件

举报
lxw1844912514 发表于 2022/07/29 22:37:36 2022/07/29
【摘要】 工作中经常会有遇到导入/导出的需求,下面是常用的方法。 读取CSV文件,可以分页读取,设置读取行数,起始行数即可。 导出CSV文件,用两种方法进行实现。 /** * 读取CSV文件 * @param string $csv_file csv文件路径 * @param int $lines 读取行数 * @param int...

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


      /**
       * 读取CSV文件
       * @param string $csv_file csv文件路径
       * @param int $lines 读取行数
       * @param int $offset 起始行数
       * @return array|bool
       */
      public function read_csv_lines($csv_file = '', $lines = 0, $offset = 0)
      {
         if (!$fp = fopen($csv_file, 'r')) {
             return false;
          }
         $i = $j = 0;
         while (false !== ($line = fgets($fp))) {
             if ($i++ < $offset) {
                 continue;
              }
             break;
          }
         $data = array();
         while (($j++ < $lines) && !feof($fp)) {
             $data[] = fgetcsv($fp);
          }
          fclose($fp);
         return $data;
      }
      /**
       * 导出CSV文件
       * @param array $data 数据
       * @param array $header_data 首行数据
       * @param string $file_name 文件名称
       * @return string
       */
      public function export_csv_1($data = [], $header_data = [], $file_name = '')
      {
          header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename=' . $file_name);
         if (!empty($header_data)) {
             echo iconv('utf-8','gbk//TRANSLIT','"'.implode('","',$header_data).'"'."\n");
          }
         foreach ($data as $key => $value) {
             $output = array();
             $output[] = $value['id'];
             $output[] = $value['name'];
             echo iconv('utf-8','gbk//TRANSLIT','"'.implode('","', $output)."\"\n");
          }
      }
      /**
       * 导出CSV文件
       * @param array $data 数据
       * @param array $header_data 首行数据
       * @param string $file_name 文件名称
       * @return string
       */
      public function export_csv_2($data = [], $header_data = [], $file_name = '')
      {
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename='.$file_name);
          header('Cache-Control: max-age=0');
         $fp = fopen('php://output', 'a');
         if (!empty($header_data)) {
             foreach ($header_data as $key => $value) {
                 $header_data[$key] = iconv('utf-8', 'gbk', $value);
              }
              fputcsv($fp, $header_data);
          }
         $num = 0;
         //每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
         $limit = 100000;
         //逐行取出数据,不浪费内存
         $count = count($data);
         if ($count > 0) {
             for ($i = 0; $i < $count; $i++) {
                 $num++;
                 //刷新一下输出buffer,防止由于数据过多造成问题
                 if ($limit == $num) {
                      ob_flush();
                      flush();
                     $num = 0;
                  }
                 $row = $data[$i];
                 foreach ($row as $key => $value) {
                     $row[$key] = iconv('utf-8', 'gbk', $value);
                  }
                  fputcsv($fp, $row);
              }
          }
          fclose($fp);
      }
  
 

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/126049639

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。