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文件,用两种方法进行实现。


  
  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).'"'."\n");
  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)."\"\n");
  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. }

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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