2-在thinkphp/library/think下新建Csv.php文件:
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018\7\24 0024
* Time: 17:10
*/
namespace think;
class Csv
{
//导出csv文件
public function put_csv($list,$title)
{
$file_name = "exam".time().".csv";
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename='.$file_name );
header('Cache-Control: max-age=0');
$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导入,此格式每次最多可以处理1000条数据
public function input_csv($csv_file) {
$result_arr = array ();
$i = 0;
while($data_line = fgetcsv($csv_file,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;
}
}
2-对应的控制器
use think\Csv; //此处是csv文件实现的关键
/*
* 导出
*/
public function down(){
$csv = new Csv();
$list = Db::name('users')->field("id,phone,username,nickname,is_vip,end_time,level")->select();
$csv_title = array('id','手机号','姓名','昵称','是否是vip','结束的时间','等级');
$csv->put_csv($list,$csv_title);
}
/*
* 导入
*
*/
public function updown(){
// 获取表单上传文件
$file = request()->file('namefile');
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]);
$id =$arr[0];
$phone= iconv('gb2312','utf-8',$arr[1] ); // 中文转码
$username = iconv('gb2312','utf-8',$arr[2]);
$nickname = iconv('gb2312','utf-8',$arr[3]);
$is_vip = $arr[4];
$end_time = $arr[5];
$level = $arr[6];
$data_values .= "('$id','$phone','$username','$nickname','$is_vip','$end_time','$level'),";
}
$data_values = substr($data_values,0,- 1 ); // 去掉最后一个逗号
fclose($handle); // 关闭指针
// 批量插入数据表中
$result = DB::execute("insert into cyh_users(id,phone,username,nickname,is_vip,end_time,level) values $data_values" );
if($result){
$this->success('文件上传成功,数据已经导入!','admin/user/index',3);
}else{
// 上传失败获取错误信息
$this->error($file->getError());
}
}
3--html 代码
<form action="{:url('admin/user/updown')}" method="post" class="form form-horizontal" enctype="multipart/form-data">
<label class="form-label col-xs-4 col-sm-2">选择文件:</label>
<div class="btn-upload form-group">
<input type="file" name="namefile" class="input-file" multiple>
</div>
</form>
4-本文多数代码参考