在thinkphp/library/think下新建Csv.php文件,这个看个人习惯能引用到就可以了,以此为例
<?php
namespace Think;
class Csv
{//导出csv文件public function put_csv($list,$title){$file_name = "exam".time().".csv";header("Content-Type: application/octet-stream");header("Content-Transfer-Encoding: binary");header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');header('Content-Disposition: attachment; filename = "'.$file_name);header('Pragma: no-cache');$file = fopen('php://output',"a");$limit = 1000;$calc = 0;foreach ($title as $v){$tit[] = iconv('UTF-8', 'GB2312//IGNORE',$v);}fputcsv($file,$tit);foreach ($list as $v){$calc++;if($limit == $calc){ob_flush();flush();$calc = 0;}foreach($v as $t){$tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t);}fputcsv($file,$tarr);unset($tarr);}unset($list);fclose($file);exit();}// csv导入 public function input_csv($csv_file) {  $result_arr = array ();  $i = 0;  while($data_line = fgetcsv($csv_file,10000)) { //10000是表示可以处理多长的字符 if ($i == 0) {  $GLOBALS ['csv_key_name_arr'] = $data_line;  $i ++;  continue;  }      foreach($GLOBALS['csv_key_name_arr'] as $csv_key_num => $csv_key_name ) {  $result_arr[$i][$csv_key_name] = $data_line[$csv_key_num];  }  $i++;  }  return $result_arr;  }
}
?>
接下来是控制器调用
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
use think\Db;
use think\Paginator;
use think\Validate;
use think\Csv;  //此处是csv文件实现的关键
class Index extends Controller
{public function _initialize(){header("Content-type:text/html;charset=utf-8");}    /** CSV试题导出*/public function downQuestions(){       $csv = new Csv(); $serial_sta = intval(Request::param('serial_sta'));$serial_end = intval(Request::param('serial_end'));$id = intval(Request::param('id'));for($i=$serial_sta;$i<=$serial_end;$i++){$data[$i]['id'] = "$i";$data[$i]['url'] = "http://47.104.212.117:8081/resource/scan_index?prodId=".$id."&serial_num=".$i;}$title = ['产品编号','二维码地址'];$csv->put_csv($data,$title);}/** CSV试题导入*/   public function upQuestionsWrite(){// 获取表单上传文件$file = request()->file('examfile');if(empty($file)) {$this->error('请选择上传文件');}// 移动到框架应用根目录/public/uploads/ 目录下$info = $file->move(ROOT_PATH.'public'.DS.'upload'); //获取文件(日期/文件),$info->getFilename();$filename = ROOT_PATH.'public'.DS.'upload/'.$info->getSaveName();$handle = fopen($filename,'r');$csv = new Csv();  $result = $csv->input_csv($handle); // 解析csv  $len_result = count($result);  if($len_result == 0){  $this->error('此文件中没有数据!');}  $data_values = '';  for($i = 1;$i < $len_result+1;$i ++) { // 循环获取各字段值  $arr = array_values($result[$i]);  $qu_name = iconv('gb2312','utf-8',$arr[0] ); // 中文转码  $qu_options = iconv('gb2312','utf-8',$arr[1]);  $qu_answer = $arr[2];  $qu_describe = iconv('gb2312','utf-8',$arr[3]);$to_id = $arr[4]; $te_id = 1; //添加试题的教师           $data_values .= "('$qu_name','$qu_options','$qu_answer','$qu_describe','$to_id','$te_id'),";  }  $data_values = substr($data_values,0,- 1 ); // 去掉最后一个逗号  fclose($handle); // 关闭指针// 批量插入数据表中$result = DB::execute("insert into gw_questions (qu_name,qu_options,qu_answer,qu_describe,to_id,te_id) values $data_values" );if($result){            $this->success('文件上传成功,数据已经导入!','exampaper',3);}else{// 上传失败获取错误信息$this->error($file->getError());}}
}
?>
模板页表单(此处我的项目中使用了layui,样式可以按自己的需求修改)
layui.use(['form', 'table'], function () {var $ = layui.jquery,form = layui.form,table = layui.table;table.render({elem: '#currentTableId',url: "{:url('index')}",method:"post",toolbar: '#toolbar',defaultToolbar: ['filter',, {title: '提示',layEvent: 'LAYTABLE_TIPS',icon: 'layui-icon-tips'}],cols: [[{type: "checkbox", width: 50, fixed: "left"},{field: 'id', width: 80, title: 'ID', sort: true},{field: 'name', width: 100, title: '产品名称'},               {field: 'publisher', width: 100, title: '出品方'},{field: 'producer', width: 100, title: '生产方'},{field: "produce_from", width: 180, title: '产地'},{field: 'price', width: 100, title: '零售价'},{field: 'info', width: 150, title: '产品信息'},{field: 'serial_num', width: 150, title: '内部编号'},{field: 'serial_sta', width: 130, title: '批次起始编码'},{field: 'serial_end', width: 130, title: '批次结束编码'},{field: 'num', width: 100, title: '批次数量'},{field: 'auth_status', width: 100, title: '审核状态', templet: '#auth_status', align: 'center'},{templet: '#csv', align: 'center', title: 'csv生成', width: 80},{title: '操作', minWidth: 50, templet: '#currentTableBar', fixed: "right", align: "center"}]],limits: [10, 15, 20, 25, 50, 100],limit: 15,page: true});
js方面的代码,粗略的复制了一下,具体需求自行修改
table.on('tool(currentTableFilter)', function (obj) {var data = obj.data;if(obj.event === 'csv'){window.location.href = "{:url('getcsv')}?serial_sta="+data.serial_sta+'&serial_end='+data.serial_end+'&id='+data.id;}
});

这里注意:有很多人用ajax传值到后台进行操作,我简单试了下,这样会导致文本在浏览器直接输出,并不会浏览器下载,我这里直接跳转是可以的,有什么好的方法可以自己研究一下。

ThinkPHP CSV导入与导出相关推荐

  1. 关于Excel和Csv导入和导出工具使用

    Excel和Csv导入和导出 我们做报表需求的时候很多时候需要导出或导入excel,不过现在有码云或者git有好多开源的工具还好用,我整理了下大家可以关注学习,我们也不用重复造轮子,直接引入jar包, ...

  2. Magicodes.IE Csv导入导出

    说明 本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出. 主要步骤 1.安装包Magicodes.IE.Csv Install-Package Magicodes.IE.Csv ...

  3. php导入csv文件,php实现CSV文件导入和导出

    项目开发中,很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件,那么具体该如何实现呢?本文将使用PHP并结合mysql,实现了CSV格式数据的导入和导出功能. 我们先准备mysql数据 ...

  4. java导出csv文件_R语言数据导入与导出

    R语言数据导入与导出 整这么一个系列,还是因为学R语言时遇到过一个非常"小白友好"的网站"DataScience Made Simple".相信很多人搜到过这个 ...

  5. postgre 生成数据库html文档_postgresql数据库导入和导出CSV格式

    Postgresql数据库导入和导出CSV格式 1.生成csv格式文件样式 2 tank 11 31 3 zhang 11 32 4 tom 10 33 5 gao 11 34 6 tank 12 3 ...

  6. mac r 导出csv文件_R在Max OS进行导入和导出xlsx文件

    R作为一门为统计设计的语言,可以方便灵活的进行文件导入和导出,大多数数据格式包括,csv, xlsx, txt,还有来自其他统计工具的SAS, SPSS, Stata, 数据文件都可以方便的导入和导出 ...

  7. csv导入pgsql不成功_数据科学 | pandas数据导入与导出

    ↑↑↑↑↑点击上方蓝色字关注我们! 『运筹OR帷幄』原创 作者:杨士锦 周岩 书生 编者按 当我们开始着手做一个数据分析项目时,选择和导入数据集是第一个步骤,而导出数据虽然非必需,但有时候我们也需要保 ...

  8. php inputcsv,php实现CSV文件导入和导出

    这篇文章主要介绍了php实现CSV文件导入和导出的方法,具有一定的参考价值,需要的朋友可以参考下 项目开发中,很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件,那么具体该如何实现呢? ...

  9. mysql数据导入导出 CSV格式_导出mysql的数据为csv格式的文件

    Mysql自带数据导出的命令 into outfile(本地导出) SELECT * FROM server_warning_repaired into outfile '/tmp/test.csv' ...

最新文章

  1. javascript 自动按按钮
  2. golang中字符串内置函数整理
  3. 一句代码实现 HTML5 语音搜索
  4. 用python内置函数算复杂度吗_番外篇: Python 面试感受
  5. APUE学习之多线程编程(二):线程同步
  6. sublime3在windows下面无法关联.py文件解决方案(转载)
  7. YUV420数据格式
  8. Chronicle 已死,凶手是谷歌!
  9. html5漂亮的登录与注册界面设计,翻转式用户登录注册界面设计
  10. [NOIP2016 提高组] 玩具谜题
  11. centerX: 用中国特色社会主义的方式打开centernet
  12. Android 利用V4L2 调用camera
  13. XSSF 导入导出excel.xlsx 解决获取空白单元格自动跳过问题,校验excel表头是否符合需求
  14. 人体反应测试仪 c语言,人体反应速度测试仪.doc
  15. 网站怎么被搜索引擎快速收录?
  16. 如何让文字变成语音?推荐三个免费把文字变成音频软件
  17. 群晖 NAS 通过 frp 实现内网穿透
  18. linux搭建keepalived+tomcat+nginx 双主机热备排坑
  19. Pixel3 XL 刷Android原生系统,刷Magisk 进行ROOT
  20. WORD2010/WPS使用快捷键

热门文章

  1. BENQ23G的彩信发送及编码格分析
  2. 如何把SATA/RAID驱动集成到win xp 安装盘里?
  3. 12. Linux系统管理(2)
  4. Python基础练习题(按条件对指定序列求和,打印99乘法表、求斐波那契数列、百马百担、求水仙花数、求n以内的所有质数(素数)和)
  5. 【零基础搭建Docker和Minio】
  6. 如何通过智慧水利物联网关实现巴歇尔槽数据采集
  7. 3Done 文字绘制到球体或者圆柱体上方法
  8. 元胞自动机的道路交通模拟
  9. Linux驱动开发: 使用usbmon抓取usb 总线上通信的数据
  10. 产品设计:58同城与赶集网APP改版建议